LocalePack
ChromeFirefoxEdgeOperaSafariCWS Listing
Vue.jsReact
Next.jsi18nextReact Native
Guides
Home/Guides/LocalePack vs Crowdin
March 25, 2026

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:

1

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.

2

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.

3

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.

4

Upload your source messages.json

Upload the file via the dashboard UI or configure a GitHub/GitLab integration that syncs automatically on push.

5

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.

6

Run pre-translation and review

Trigger pre-translation for all target languages. Review the output in Crowdin's editor — strings are untranslated until approved.

7

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.

8

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.

Steps 1–4 must be completed before you can translate a single string. For a developer who needs 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.

1

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.

2

Choose target languages

Select from 52 supported locales. Locale codes are mapped to Chrome's _locales folder names automatically.

3

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.

4

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.

No account required. The workflow takes minutes from upload to download for a typical extension with 50–200 keys.

Side-by-side comparison

FeatureCrowdinLocalePack
Account requiredYes — email registration + verificationNo
Project setupYes — project name, languages, file format, MT engineNo — format detected on upload
Pricing modelMonthly/annual subscription (no pay-per-job option)One-time payment per job
Free tierOpen-source projects onlyNo free tier — transparent pricing before checkout
Chrome JSON / messages.json supportYes — native formatYes — purpose-built for this format
$PLACEHOLDER$ protectionYes — tokens treated as non-translatable segmentsYes — tokens preserved exactly in all output files
Output formatPer-language files; ZIP option; locale code mapping may differ_locales/{lang}/messages.json ZIP with Chrome-compatible folder names
Time to first translated file30–90 min (account + project + MT setup + pre-translation run)Minutes (upload → select → pay → download)
Translation memoryYes — reuses previous translations across jobsNo — each job is independent
Human translator workflowYes — assignment, review, approval, glossaryNo — AI translation only
GitHub / repo integrationYes — automatic sync on pushNo — manual upload per job
Languages supported100+ locales52 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.
If you are translating once per quarter or less, a subscription TMS costs significantly more than per-job pricing — even before accounting for setup time.

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.

Translate my messages.json →

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.

← Back to Guides
LocalePack
GuidesPrivacyTermsSupport

© 2025 LocalePack. All rights reserved.

This project was translated with LocalePack logoLocalePack