Coroid translates your product with the same engine it uses for its own thirteen languages. Your catalogues stay files in your repository. Every change to them arrives as a normal task and pull request, and only strings that are new, changed or broken are sent to a model.
Translations live under Quality Control → Translations. The list shows each project, whether translations are configured, and the latest scan. Open a project to get its workbench.
- Storefront
- Docs site
- Mobile app
| Locale | Missing | Stale |
|---|---|---|
| de | 0 | 2 |
| fr | 14 | 0 |
| ja | 14 | 1 |
| ar | 14 | 0 |
- TranslationsTask QA and pull requests · changed strings onlyPublished
- Translation auditScheduled · every catalogue and locale pageDraft
Quality Control → Translations for one project: the latest translation check per locale, and the Translations and Translation audit controls. Illustrative data.
What your repository needs
Coroid reads catalogues in these formats:
| Format | Use it for |
|---|---|
| ICU JSON | Message files with ICU plurals and selects |
| i18next JSON | i18next and react-i18next catalogues, including plural suffixes |
| Vue i18n JSON | vue-i18n messages, including linked messages and pipe plurals |
| Rails YAML | config/locales/*.yml, with %{name} interpolation and plural keys |
| gettext PO | .po files and a .pot template, with Plural-Forms per language |
| Markdown and MDX | Documentation pages under a language folder (docs/en/…): text, image descriptions and chosen frontmatter fields; code and markup stay as written |
| Custom | Any other format, through a small adapter command in your repository |
You do not need translations yet. If your project has no i18n, Coroid can introduce it.
Set up
The Setup tab walks through three steps.
- Detect. Coroid prepares a discovery task. It runs the pinned translation engine against your repository and records the stack, the catalogues, which language is the source, and anything it is unsure about.
- Choose. Pick Adopt existing i18n to keep your framework and catalogues and add Coroid's checks and delta engine. Pick Introduce i18n to have Coroid wire your framework, extract representative strings, and add locale routing, fallbacks and right-to-left support.
- Create. Coroid creates the setup task with a Specification and acceptance criteria. It ends in a pull request you review like any other.
- Storefront
- Docs site
- Mobile app
- Detect
- 2Choose
- 3Create
Keep your current framework and catalogues, and add Coroid’s translation checks and delta engine.
Wire your framework, extract representative strings, and add locale routing, fallbacks and RTL behaviour.
- Source locale
- en
- Target locales
- de, fr, ja, ar
The Setup tab after detection: adopt the existing i18n or introduce it, with the source and target locales. Illustrative data.
Setup is ready once that pull request is merged to the default branch Coroid syncs. Until then, nothing else in the workbench assumes it.
The repository file
Setup writes .coroid/i18n.json. It describes your repository, so it lives in
your repository and changes through pull requests:
{
"version": 1,
"cli": { "version": "1.7.0", "sha256": "…" },
"sourceLocale": "en",
"targetLocales": ["de", "fr", "ja", "ar"],
"catalogs": [
{
"id": "ui",
"format": "i18next-json",
"source": "messages/{locale}.json"
}
],
"localeTier": { "ja": "escalation" }
}clipins the exact engine version and its checksum. Coroid downloads and verifies that version before every run, so an update never changes your output by surprise.sourceLocalecan be any language. A Swedish source translated to English and German works the same way.localeTierasks for the stronger translation route for a locale. You choose a tier, never a model.
The file can also hold a glossary, protected terms, product context and per-locale instructions.
To change it, edit the proposal on the Configuration tab and choose Propose change. Coroid opens a task that applies exactly that file and repairs any translations the change affects.
The same tab holds the settings that belong to Coroid rather than your repository: which sites may open the suggestion picker, whether suggestions are reviewed by default, and the project's translation spend limit.
Check every change
Translations become part of verification through two Quality controls. Add them from the Overview tab.
- Translations runs on task QA and on pull requests. It checks only the strings a change touched.
- Translation audit runs on a schedule. It checks every catalogue and locale and can include a Browser test of your locale pages, for right-to-left layout, overflow and text left untranslated on the page.
Adding a control prepares a policy draft. Review it and publish it under Quality policies to turn it on.
Each problem becomes a finding with an issue code:
| Code | Meaning | Blocks by default |
|---|---|---|
missing | The string has no translation | Yes |
invalid_syntax | The translation does not parse, for example broken ICU | Yes |
placeholder_mismatch | Placeholders differ from the source | Yes |
plural_categories | A plural form the locale needs is missing | Yes |
stale | The source changed after the string was translated | No |
You choose which codes block in the control's settings. Glossary, length and forbidden-term rules report their own codes when your file configures them.
missingui · checkout.total · frNot translatedstaleui · nav.deals · deSource changed since translationplaceholder_mismatchui · cart.items · jaPlaceholders differ from the sourceplural_categoriesui · cart.count · arPlural forms missing for this locale
Quality findings from the Translations check, one issue code per finding. Illustrative data.
When a translation finding blocks a task, the developer agent repairs it the same way every time: it opens a translation session for the task and runs the engine on the changed strings. It never edits target catalogues by hand.
The Translator model
Translation has its own role in AI profiles, Translator, next to Architect, Developer, QA and Reviewer. By default it uses Hy-MT2, a translation model, with GPT-6 Luna as the fallback, where your organisation policy allows them. Change the mapping in an AI profile like any other role.
The engine also batches strings by size, validates every reply against your placeholders and plural rules, and retries or escalates a string that fails.
Costs
Translations are available on every plan. Translation calls go through Coroid's translation gateway and are billed as model usage to your organisation, the same as agent runs. Setup tasks count toward your plan's agent hours like any other task.
With the default Translator route, translating costs about two cents per 1,000 strings per language. Translating a 2,000-string catalogue into ten languages cost about $0.33 when we measured it.
- Only changes cost money. The engine keeps a cache keyed by the source text, so unchanged strings are never sent again.
- Each task has a translation limit. A session stops at the task's spend limit, $1 by default. A project can set a lower limit under Configuration → Access and spend.
- Checks make no model calls. The Translations control and the audit read your catalogues; they do not translate.
Translating outside Coroid
The engine is a command-line tool, coroid-i18n. Your own CI can run the same
pinned version with its own OpenRouter key. Inside Coroid, tasks always use the
translation gateway, so spend and limits stay in one place.