Continuous localization: every language, on every merge.
Continuous localization translates new and changed strings as your code changes, instead of in a separate phase before each release. Every language stays ready to ship with the code that needed it.
What is continuous localization?
Continuous localization is a way of working in which new and changed strings go to translation automatically as soon as they change, and the translated text comes back into the product without anyone scheduling it.
There is no translation phase, because translation never stops. A developer merges a string, the translations follow in the same flow as the code, and a release is not waiting on anyone's file.
It is the localization half of continuous delivery. A team that merges every day and hands off translation every few weeks has languages behind its code for most of every month. Continuous localization shrinks that gap to the length of one run.
It does not mean machine output goes live unread. You decide which strings need a person, and a release can carry only what has been reviewed.
The difference is when translation happens, not who does it.
| What changes | Batch handoff | Continuous |
|---|---|---|
| Side by side | ||
| When translation happens | In a phase before each release | As each string changes |
| What starts it | Someone exports a file | A push, a merge or a content change |
| The size of each piece | Weeks of strings at once | The strings in one change |
| What a release waits for | The file to come back | Review, on the strings you marked for it |
| A late copy change | Another round trip | A re-run of that one key |
| What the translator works from | A spreadsheet of strings | The row, with its glossary terms, memory matches and screenshots |
| Languages at launch | Staggered, one wave after another | Together, with the feature |
- When translation happens
- In a phase before each release
- What starts it
- Someone exports a file
- The size of each piece
- Weeks of strings at once
- What a release waits for
- The file to come back
- A late copy change
- Another round trip
- What the translator works from
- A spreadsheet of strings
- Languages at launch
- Staggered, one wave after another
- When translation happens
- As each string changes
- What starts it
- A push, a merge or a content change
- The size of each piece
- The strings in one change
- What a release waits for
- Review, on the strings you marked for it
- A late copy change
- A re-run of that one key
- What the translator works from
- The row, with its glossary terms, memory matches and screenshots
- Languages at launch
- Together, with the feature
How continuous localization works
Follow one new string through the loop. Each stop shows what you would actually see.
The change reaches Transglot through the CLI, the GitHub Action or the app on your Git host. Source files are parsed in one of 20 native formats, and each string is compared with what the project already holds. Only new and changed strings go on.
An exact match from translation memory fills the row and costs no words. Whatever is left goes to Glossa with your glossary, your style guide and the context of that key.
Placeholders, plural forms, glossary terms and length are checked on every row of every run. A broken placeholder, a missing plural form or a forbidden glossary term is repaired once and checked again, and if it fails a second time it is refused, not shipped. A row that only overruns its length is written, and from the Team plan auto-approve or a QA run flags it for review.
A run never writes over a row a person has edited or reviewed. If its source changes later, the text stays, the run counts the row and tells you, and from the Team plan a suggested update waits beside it for someone to accept.
The Git apps commit locale files to one sync branch and keep one pull request up to date. On GitHub, comment /translate on a pull request and the files land on that pull request's own branch. Or publish to the CDN, and the running product reads the change with no release at all.
Six ways continuous localization goes wrong, and what stops each one
A run overwrites a person's work
Every writer checks the row's state first: a run, a memory match and a push. A row a person edited or reviewed stands, and the run reports it.
→fr, reviewed, source just changed
✓kept, counted, reported
A broken string reaches production
Every token that went in has to come back out. On an ICU project, a message that would throw at render time stays out of the pull, the connector and the CDN bundle, and the run names it.
→{count, plural, one {# article}
✓left out of the file, named in the run
The repository fills up with bot pull requests
One sync branch and one pull request per repository. Two quick pushes converge on it instead of opening a second one.
→#812 #815 #819 #823 l10n update
✓#812 transglot/sync, updated in place
A source edit leaves old translations behind
Every target row records the source it was written against, so a changed string is known to be out of date in every language at once, and only that key runs again.
→Save became Save draft. fr, de, ja still say Save
✓fr, de, ja run again on that one key
Every run bills the whole project again
A run is sized from what changed. An unchanged string is not sent, an exact memory match costs no words, and a row a person owns is refused before anything is spent.
→file holds 48,000 words
✓this run: 60 words
A half-finished pull wipes a locale file
If the server reports no entries for a locale, the pull refuses to write over a file that has content, and exits 1 so the pipeline stops there.
→pull: 0 entries for ja, file holds 1,204
✓refusing to overwrite locales/ja.json with an empty bundle
- run 4182 fr: placeholder missing from the draft, repaired on retry
- run 4182 de: 3 rows kept, a person owns them
- run 4182 ja: 41 rows from memory, 0 words
- run 4183 ar: plural form missing after retry, row refused
- pull written locales/pt-BR.json
- sync transglot/sync updated, pull request #812
All three connect to your repository. What differs is what happens when you merge.
Read from each company's own pages on 5 November 2026. The price row comes from our comparison pages, linked below, which show the plan and the arithmetic. Prices and plans change, so check them before you decide.
| What happens | Transglot | Lokalise | Crowdin |
|---|---|---|---|
| A new string is merged | Translated by default The push starts the run. A project setting turns it off. | Translated once you set it up Automations are off by default on key creation and file import. A workflow with an AI step runs on its schedule. | Translated once you turn it on Under Settings, Auto-Translate, it then runs on each upload. The Git sync runs hourly by default. |
| A translation fails a check | Repaired once, then refused For a broken placeholder, plural form or forbidden term, on every row of every run. A length overrun is written. On an ICU project, a broken row stays out of the pull, the connectors and the CDN. | An Error-level check stops a save in the editor Each check is set to Off, Warning or Error. | An Error-level check stops a save Each check is set to Warning or Error. |
| A person already edited the row | The run refuses to write it So do a memory match and a push. If the source changes later, the run reports the row. | Automations fill empty values by default A force option and a clear action write over filled ones. | Options keep human and approved rows A replace-all option also exists. |
| Pull requests on a busy repository | One branch, one pull request Updated in place on each push. | A new branch for each pull request Named with a timestamp. | A service branch, synced hourly Hourly is the default, and the interval can be changed. |
| What the plan counts | Words translated, once per language Exact memory matches cost nothing. Storing a string costs nothing. | Processed words The base language and the target both count. | Hosted words Words to translate, times target languages. |
| What pays for the AI | The plan's words It is not billed separately. | AI word allowances by plan Standard AI and Pro AI words are plan lines of their own. | A separate balance, or your own key Crowdin's managed AI is paid from credits, outside the subscription. |
| The same job: 5,000 strings in 10 languages | $39 a month Team, translation included | $1,049 a month Advanced (billed yearly) | $138 a month Pro with 560K hosted words (billed monthly), AI on top |
| GitHub, GitLab, Bitbucket, Azure Repos, a CLI and an MCP server | All of them The Git apps start on Team and cover the cloud editions. | All of them Integrations are on every plan. | All of them It also covers Bitbucket Server. |
- A new string is merged
- Translated by defaultThe push starts the run. A project setting turns it off.
- A translation fails a check
- Repaired once, then refusedFor a broken placeholder, plural form or forbidden term, on every row of every run. A length overrun is written. On an ICU project, a broken row stays out of the pull, the connectors and the CDN.
- A person already edited the row
- The run refuses to write itSo do a memory match and a push. If the source changes later, the run reports the row.
- Pull requests on a busy repository
- One branch, one pull requestUpdated in place on each push.
- What the plan counts
- Words translated, once per languageExact memory matches cost nothing. Storing a string costs nothing.
- What pays for the AI
- The plan's wordsIt is not billed separately.
- The same job: 5,000 strings in 10 languages
- $39 a monthTeam, translation included
- GitHub, GitLab, Bitbucket, Azure Repos, a CLI and an MCP server
- All of themThe Git apps start on Team and cover the cloud editions.
- A new string is merged
- Translated once you set it upAutomations are off by default on key creation and file import. A workflow with an AI step runs on its schedule.
- A translation fails a check
- An Error-level check stops a save in the editorEach check is set to Off, Warning or Error.
- A person already edited the row
- Automations fill empty values by defaultA force option and a clear action write over filled ones.
- Pull requests on a busy repository
- A new branch for each pull requestNamed with a timestamp.
- What the plan counts
- Processed wordsThe base language and the target both count.
- What pays for the AI
- AI word allowances by planStandard AI and Pro AI words are plan lines of their own.
- The same job: 5,000 strings in 10 languages
- $1,049 a monthAdvanced (billed yearly)
- GitHub, GitLab, Bitbucket, Azure Repos, a CLI and an MCP server
- All of themIntegrations are on every plan.
- A new string is merged
- Translated once you turn it onUnder Settings, Auto-Translate, it then runs on each upload. The Git sync runs hourly by default.
- A translation fails a check
- An Error-level check stops a saveEach check is set to Warning or Error.
- A person already edited the row
- Options keep human and approved rowsA replace-all option also exists.
- Pull requests on a busy repository
- A service branch, synced hourlyHourly is the default, and the interval can be changed.
- What the plan counts
- Hosted wordsWords to translate, times target languages.
- What pays for the AI
- A separate balance, or your own keyCrowdin's managed AI is paid from credits, outside the subscription.
- The same job: 5,000 strings in 10 languages
- $138 a monthPro with 560K hosted words (billed monthly), AI on top
- GitHub, GitLab, Bitbucket, Azure Repos, a CLI and an MCP server
- All of themIt also covers Bitbucket Server.
Start it from wherever your strings live. Every door reaches the same pipeline.
How to set up continuous localization
- 01
Get strings out of the code
Every user-facing string needs a stable key in a locale file. Transglot reads 20 formats, so keep the one you have.
jsonyamlxliffarb - 02
Connect the repository
The init command finds your locale files, signs you in through the browser, uploads what you already have and runs the first translation.
npx transglot@latest init - 03
Run it on every merge
Add the GitHub Action, call the CLI from any other CI, or install the app for GitHub, GitLab, Bitbucket or Azure Repos.
transglot push --wait - 04
Decide what needs a person
Set min_state to reviewed on a pull rule and that file only carries strings a person has reviewed. Leave it off and drafts ship.
min_state: reviewed
What it costs to run on every merge: the words that changed.
A word is a source word, counted once per target language. A run is sized from what changed, so a merge that touches twelve words in five languages counts sixty, however large the project is.
Fits on Starter: $19/mo, 300,000 words a month.
That is about 9% of the allowance.
This counts translation only. Quality checks, brand voice drafts and repairs also count as words, and exact matches from memory cost nothing. The CLI and the GitHub Action start on Starter, and the apps for GitHub, GitLab, Bitbucket and Azure Repos start on Team.
Three things continuous localization does not solve
Strings still stuck in code
A pipeline can only translate what it can read. Hard-coded strings and sentences glued together from parts have to be fixed first, and they are the usual reason a rollout stalls.
Nobody owning the words
Automation moves strings. It does not decide what your product calls things. Someone has to own the glossary, or a language nobody reads drifts without anyone noticing.
Copy that needs judgement
Legal text, pricing and brand lines deserve a person. Send them to review and keep them out of the files that ship until someone signs off.
Continuous localization FAQ
The questions teams ask before they turn it on.
What is continuous localization?
How is continuous localization different from traditional localization?
Is continuous localization the same as CI/CD?
Do I need a CI/CD pipeline for continuous localization?
Does continuous localization mean no human review?
Can an automated run overwrite a translator's edit?
Is continuous localization worth it for a small team?
How do I stop a run costing more than I expect?
Does it work with GitLab, Bitbucket and Azure DevOps?
Can I do continuous localization without Git?
Can translations update without a release?
How do I move an existing project across?
41 connectors, already built.
Connect a repository. The next merge does the rest.
One command finds your locale files, signs you in through the browser and runs the first translation.