LocalePack vs Crowdin for messages.json
Crowdin is a mature, enterprise-grade localization platform. LocalePack is a format-specific translation tool with no subscription. This guide compares both for the specific job of translating a browser extension’s messages.json file into multiple locales.
What Crowdin is built for
Crowdin is a translation management system (TMS) designed for software teams shipping continuous localization across multiple products. Its core value is a platform that connects source repositories, machine translation engines, human translators, and reviewers in a managed workflow.
Crowdin natively supports the Chrome JSON format (messages.json) and understands $PLACEHOLDER$ syntax. For teams with ongoing localization work, it is genuinely good software.
The question is whether that platform is the right tool for a developer who needs to translate a single extension’s messages.json once or a few times a year.
How to use Crowdin for messages.json: the actual steps
Here is the complete setup path for translating a messages.json file with Crowdin as of early 2026:
Create a Crowdin account
Register with an email address and verify it. Crowdin's free plan is for open-source projects only — commercial extensions require a paid plan or a trial.
Create a project and set languages
Name the project, set the source language (English), and add all target languages. Crowdin uses its own language code system — some codes differ from Chrome's _locales codes.
Set the file format to "Chrome JSON"
When uploading, select the Chrome JSON file format so Crowdin correctly parses message/description/placeholders fields and protects $PLACEHOLDER$ tokens.
Upload your source messages.json
Upload the file via the dashboard UI or configure a GitHub/GitLab integration that syncs automatically on push.
Configure a machine translation engine
Crowdin does not translate strings automatically by default. You configure a pre-translation source: DeepL, Google Translate, Microsoft Translator, or similar. Each has its own API key setup.
Run pre-translation and review
Trigger pre-translation for all target languages. Review the output in Crowdin's editor — strings are untranslated until approved.
Export and build the _locales ZIP
Build the project to generate translated files. Crowdin exports files per-language; you assemble the _locales folder structure yourself, or use the ZIP export option.
Map Crowdin locale codes to Chrome locale codes
Crowdin's locale code for some languages differs from Chrome's _locales folder names (e.g. zh-CN vs zh_CN). You may need to rename folders before your extension will load them.
messages.json translated today, this is 30–90 minutes of setup before any translation work begins.How LocalePack handles the same job
LocalePack is purpose-built for the messages.json format. There is no account, no project, no MT engine to configure.
Upload your messages.json
Drag and drop or select your source file. The format is detected automatically — message, description, and placeholders fields are all recognized.
Choose target languages
Select from 52 supported locales. Locale codes are mapped to Chrome's _locales folder names automatically.
Review the price and pay
Pricing is shown before checkout based on string count and language count. One-time payment — no subscription, no recurring charge.
Download the _locales ZIP
The ZIP contains correctly named _locales/{lang}/messages.json files ready to drop into your extension. $PLACEHOLDER$ tokens are preserved exactly.
Side-by-side comparison
| Feature | Crowdin | LocalePack |
|---|---|---|
| Account required | Yes — email registration + verification | No |
| Project setup | Yes — project name, languages, file format, MT engine | No — format detected on upload |
| Pricing model | Monthly/annual subscription (no pay-per-job option) | One-time payment per job |
| Free tier | Open-source projects only | No free tier — transparent pricing before checkout |
| Chrome JSON / messages.json support | Yes — native format | Yes — purpose-built for this format |
| $PLACEHOLDER$ protection | Yes — tokens treated as non-translatable segments | Yes — tokens preserved exactly in all output files |
| Output format | Per-language files; ZIP option; locale code mapping may differ | _locales/{lang}/messages.json ZIP with Chrome-compatible folder names |
| Time to first translated file | 30–90 min (account + project + MT setup + pre-translation run) | Minutes (upload → select → pay → download) |
| Translation memory | Yes — reuses previous translations across jobs | No — each job is independent |
| Human translator workflow | Yes — assignment, review, approval, glossary | No — AI translation only |
| GitHub / repo integration | Yes — automatic sync on push | No — manual upload per job |
| Languages supported | 100+ locales | 52 locales |
Pricing and features verified as of March 2026. Verify current pricing on crowdin.com before purchasing.
How each tool handles messages.json specifics
The messages.json format has three fields per key: message, description, and placeholders. Correct handling of $PLACEHOLDER$ tokens is critical — a corrupted token causes the extension to render raw token text in the UI.
// Source: _locales/en/messages.json
{
"welcomeUser": {
"message": "Welcome back, $NAME$!",
"description": "Greeting shown on extension open",
"placeholders": {
"name": {
"content": "$1",
"example": "Alice"
}
}
},
"itemCount": {
"message": "$COUNT$ items saved",
"placeholders": {
"count": { "content": "$1" }
}
}
}Crowdin
- •Recognizes Chrome JSON format and parses message/description/placeholders fields correctly.
- •$PLACEHOLDER$ tokens are protected during MT — treated as non-translatable segments.
- •Requires manual pre-translation trigger after upload. Strings are staged as 'untranslated' until you run MT.
- •Export uses Crowdin locale codes — some differ from Chrome _locales names (zh-CN vs zh_CN). Folder renaming may be required.
- •description fields are shown to translators as context, not translated.
LocalePack
- •Detects messages.json format automatically on upload.
- •$PLACEHOLDER$ tokens are preserved exactly — content and example fields in placeholders objects are not modified.
- •description fields are used as translation context, not translated.
- •Output uses Chrome-compatible locale folder names (_locales/zh_CN/, not zh-CN/).
- •Full _locales folder structure is ready in the downloaded ZIP — no renaming or restructuring needed.
Cost comparison
For a developer translating an extension once or twice a year, the cost model difference is significant.
Crowdin
One extension, 100 keys, 10 languages, one translation job
- •Free plan: open-source projects only. Commercial extensions require a paid plan.
- •Basic plan (as of 2026): approximately $50/month billed monthly.
- •Annual minimum for a one-time job: ~$50–$600/year depending on billing cycle.
- •MT costs billed separately if you use DeepL or Google Translate integration.
- •No pay-per-job option — you subscribe to a plan.
LocalePack
One extension, 100 keys, 10 languages, one translation job
- •Flat one-time price shown before checkout — based on string count and language count.
- •No subscription, no monthly minimum, no recurring charge.
- •Pay again only if you translate another job.
- •No separate MT cost — translation is included in the job price.
When Crowdin is the right tool
Crowdin is genuinely the better choice in several real scenarios:
You ship continuous updates across many locales
If your extension updates strings every sprint and you maintain 20+ locales, Crowdin's GitHub integration automatically detects new and changed strings and queues them. The workflow savings justify the subscription cost.
You work with human translators
Crowdin's core product is a translator workflow — assignment, review, approval, glossary enforcement, and translation memory. If localization quality requires human review at scale, a TMS is the right infrastructure.
You manage multiple products on one platform
If you have an extension, a web app, a mobile app, and a marketing site sharing glossary terms, Crowdin lets you manage all of them with shared translation memory and consistent terminology.
Your extension is open-source
Crowdin offers a free plan for open-source projects, which includes the full feature set. If your extension is public on GitHub or GitLab, this is a compelling option.
Your team already uses Crowdin for other products
Adding an extension to an existing Crowdin workspace costs nothing extra if you are already on a plan that covers your string volume.
When LocalePack makes more sense
You need translations today, not after a 1-hour setup
LocalePack has no onboarding — upload a file, select languages, pay, download. The workflow is measured in minutes. Crowdin requires account creation, project setup, MT engine configuration, and a pre-translation run before you see a single translated string.
You translate once or a few times a year
A subscription is a poor match for infrequent jobs. If you localize when you ship a major update — two or three times a year — paying per job is cheaper than maintaining a monthly plan for work you do occasionally.
You are a solo developer or small team without a localization workflow
Crowdin is designed around teams, translation memory, and ongoing workflows. Its complexity is appropriate at scale; it adds friction for a developer who wants to ship one extension to more markets.
You need a ready _locales ZIP with correct folder names
LocalePack outputs a ZIP with Chrome-compatible _locales/{lang}/messages.json paths. Crowdin exports per-language files that require assembly and folder name verification before they match the extension loader's expectations.
Summary: which fits your situation
Solo or small team, commercial extension, translate 1–4× per year
LocalePack — no account, no subscription, pay per job.
Open-source extension with community contributors
Crowdin free tier — designed for this exact case.
Team shipping weekly string updates across 15+ locales
Crowdin — GitHub sync and translation memory pay off at this cadence.
Multiple products sharing translation memory and glossary
Crowdin — unified platform is the right abstraction.
Need translated files in under 30 minutes with no setup
LocalePack — upload → pay → download ZIP.
Translate messages.json without a subscription
Upload your source messages.json, choose target languages, and download a ZIP with the correct _locales/{lang}/messages.json structure. Placeholder tokens preserved. No account required. One-time payment.
Related guides
Browser extension i18n without a TMS subscription
Why Crowdin, Lokalise, and Phrase are overkill for most browser extension projects — and three real alternatives for indie developers.
messages.json format explained (with placeholders)
Complete reference for the WebExtension messages.json format: message, description, and placeholders fields, $PLACEHOLDER$ syntax, and $1 positional substitutions.
Validate messages.json before shipping
Ready-to-run scripts for JSON syntax, missing keys, malformed placeholder syntax, and manifest key mismatches.