LocalePack
ChromeFirefoxEdgeOperaSafariCWS sąrašas
Vue.jsReact
Next.jsi18nextReact Native
Kūrėjų gidaiSėkmės istorijos
Home/Guides/AMO listing localization
August 8, 2026

Localizing your Firefox AMO listing

Your add-on’s UI strings and your add-on’s store page on addons.mozilla.org are two different translation jobs with two different tools. This guide covers the second one: which AMO listing fields you can localize, the hard 250-character ceiling on the summary, how _locales feeds into your listing name, and a workflow that does not fall apart at fifteen languages.

Two surfaces, one source of strings

Before anything else, be clear about which surface you are translating. They are edited in different places and they fail in different ways:

SurfaceLives inEdited via
Add-on UI strings_locales/<code>/messages.jsonYour repository, shipped inside the package
Add-on namemanifest.json + _localesBoth — resolved by Firefox and read by AMO
Listing summary + descriptionAMO databaseDeveloper Hub, one value per locale
Screenshots + captionsAMO databaseDeveloper Hub, uploaded per listing
Version release notesAMO databaseDeveloper Hub, per version per locale

The distinction matters enough that we wrote a separate guide on it — see store listing vs in-extension i18n for the full comparison. The rest of this page is about the listing.

What Mozilla lets you localize

Extension Workshop is unambiguous about the scope. From Create an appealing listing:

You also have the option to localize almost all the text content of your add-on’s listing, including its name.

And on how far to take it:

You will want to add a localized listing for each language your add-on supports.

In practice the fields you will be translating are:

  • •Name — the add-on title shown in search results and at the top of the listing.
  • •Summary — the one-paragraph pitch under the name. Hard limit, see below.
  • •Description — the long body copy. Effectively unlimited for authoring purposes.
  • •Version details / release notes — per-version, per-locale.
  • •Screenshot captions — the text attached to each uploaded screenshot.
Note the hedge in Mozilla’s own wording: “almost all”. Structural fields — the URL slug, the categories, the support email — are not per-locale text. Do not plan a workflow that assumes every field on the page has a translation slot.

The 250-character summary is the real constraint

Everything else on an AMO listing gives you room. The summary does not:

The summary description for your add-on is limited to 250 characters.

Mozilla contrasts this explicitly with the description:

While the add-on summary is limited to 250 characters, you are not practically limited when it comes to the add-on’s description and version details.

That asymmetry is what breaks localization workflows. Translated text is usually longer than English. The commonly used industry rule of thumb for short marketing copy is that German and Russian run roughly 25–35% longer than the English source; it is a planning heuristic, not a guarantee, and individual strings vary a lot. Applied to the summary field it works out roughly like this:

English summary:            248 chars   ← fits, barely
  ↓ translate
German summary:      ~310–335 chars   ← over the 250 limit
Russian summary:     ~310–335 chars   ← over the 250 limit

English summary:            180 chars   ← headroom by design
  ↓ translate
German summary:      ~225–245 chars   ← still fits
Write the English summary to about 180 characters, not 250. A summary that fills the English budget exactly guarantees that a translator has to either cut meaning or blow the limit in every expanding language — and they will hit that wall silently, in a field you are not looking at.

If you are generating translations programmatically, enforce the ceiling on the output rather than trusting it. A 251-character summary is not a subtle degradation; it is a field you cannot save.

How __MSG_ in the manifest reaches your AMO name

The add-on name is the one listing field with a direct wire back into your extension package. You localize it the same way you localize any manifest string — with a __MSG_ placeholder resolved from _locales. MDN’s WebExtensions internationalization guide gives the pattern:

// manifest.json
{
  "manifest_version": 3,
  "name": "__MSG_extensionName__",
  "description": "__MSG_extensionDescription__",
  "default_locale": "en"
}

with the values living one per locale:

// _locales/de/messages.json
{
  "extensionName": {
    "message": "Tab-Manager",
    "description": "Name shown in the browser and on AMO"
  },
  "extensionDescription": {
    "message": "Gruppiert offene Tabs automatisch nach Domain.",
    "description": "Short manifest description"
  }
}

MDN documents the placeholder syntax precisely — two underscores, the literal string MSG, one underscore, the message name, two underscores — and states that default_locale “specifies a default locale to use if the extension doesn’t include a localized string for the browser’s current locale.” Our __MSG_ keys in manifest.json guide covers the placeholder mechanics in depth, and Firefox WebExtensions i18n and messages.json covers the runtime side.

Firefox resolves the placeholder in the browser UI. AMO resolves it separately, on the server, when it ingests your package — the next section explains what that actually does and, more importantly, what it does not do.

Does AMO auto-detect locales from _locales?

Mozilla’s published developer documentation does not answer this, so we read the source. AMO runs on addons-server, which is open source. As of 8 August 2026, the code on master does the following when an upload creates a new add-on record:

1

Enumerates your locale folders

It collects every path matching _locales/<code>/messages.json inside the package and parses each one. A file that is not valid JSON is skipped without an error.

2

Normalises and filters the locale codes

Each folder name is run through a language-matching function. Underscores become hyphens (pt_BR → pt-BR), and a short list of bare language codes is expanded to a regional one. Codes AMO does not recognise are dropped — silently.

3

Resolves __MSG_ for three fields

For each surviving locale it resolves the manifest placeholders into translations of the add-on name, summary (which comes from the manifest description field) and homepage, truncating each to that field’s maximum length.

The bare-code expansions in that second step are worth knowing, because a Chrome _locales tree is full of bare codes:

_locales folder  →  AMO locale
  en             →  en-US
  es             →  es-ES
  pt             →  pt-PT
  sv             →  sv-SE
  zh             →  zh-CN
  ga             →  ga-IE
  pt_BR          →  pt-BR   (underscore → hyphen)
  zh_TW          →  zh-TW   (underscore → hyphen)
What we could not verify: the exact set of locale codes AMO accepts in production. The addons-server repository defines a broad default list and a narrower production list, and a comment in the source says the value is “overriden in prod (& stage) settings” — and those settings are not public. So a folder in your _locales tree may or may not survive the filter. Do not assume; upload, then check which locales actually appear in the Developer Hub.

Two things this seeding step does not do, and both matter. It does not fill in your long listing description, screenshots, screenshot captions or tags — those are listing-only content that never existed in your package. And it runs on the code path that creates the add-on record, so it is not a substitute for maintaining your listing text afterwards. Once the listing exists, the Developer Hub is authoritative.

The per-locale Developer Hub workflow

Mozilla does not publish step-by-step instructions for adding a localized listing, and AMO’s Developer Hub UI has changed over the years, so we are not going to invent button labels for you. What we can describe is the shape of the form and the rules it enforces, both of which are visible in addons-server.

The listing edit form — the one Mozilla calls the Describe step — declares name, summary and description as translatable fields. Translatable fields render a per-locale editor rather than a single text box: you pick a locale and enter the value for that locale, and the stored value is a map from locale code to string, not one string. Slug, support URL and support email are plain single-value fields on the same form.

The one hard rule the form enforces is about your default locale. If you try to change it, AMO checks that the three core fields already exist in the new locale and refuses otherwise, with this message:

Before changing your default locale you must have a name, summary, and description in that locale. You are missing ‘description’.

Which is a good rule, and a good reminder of the underlying model: your listing has one default locale that everything falls back to, and any number of overriding locales layered on top. Missing a locale is not an error state. It just means users in that language read your default-locale copy — the same fallback behaviour you already rely on for default_locale in the manifest.

The field lengths defined in addons-server as of 8 August 2026:

FieldMax lengthNotes
name50From addons-server model. Short — most non-English names need shortening, not translating.
summary250Documented by Mozilla. Budget ~180 in English to leave room for expansion.
description15,000From addons-server model. Mozilla describes it as not practically limited.

Only the 250-character summary limit is stated in Mozilla’s developer documentation. The other two are read from the addons-server model definitions and could change without a docs update — treat them as working budgets, not contract.

Mozilla does not translate your listing for you

This surprises people, because Firefox itself is one of the most thoroughly localized pieces of software on the planet and Mozilla runs a translation platform called Pontoon. None of that reaches your add-on. From the Mozilla Add-ons Community Blog, “No longer lost in translation”, published 16 July 2018:

At present, we don’t have a way to connect extension developers with the translation community at scale, and Pontoon, Mozilla’s tool for localizing products and websites, currently only supports translating the AMO site itself.

That post describes a one-off volunteer campaign: more than 100 multilingual Mozillians submitted over 140,000 translated words through Crowdin, covering 9 extensions in 7 languages. Impressive, and also the shape of the problem — a campaign, run once, for nine extensions.

Read that quote with its date attached. It is from 2018. We are not claiming it is Mozilla’s current position on Pontoon or on developer translation tooling — only that this is what Mozilla stated publicly at the time, and that we found no published replacement pipeline. Check current Mozilla communications before relying on it either way. The practical takeaway is unchanged: plan to source your listing translations yourself.

A workflow that scales

The failure mode is not translation quality. It is that listing copy lives in a web form, drifts out of sync with the copy in your repository, and nobody can tell you what the current Polish summary says without logging in. Keep the source of truth in version control:

1

Put listing copy in your repo, next to your UI strings

Add listingName, listingSummary and listingDescription keys to your English messages.json. They are never read at runtime — they are there so the copy is reviewable, diffable and translatable by the same pipeline as everything else.

2

Budget the English summary at ~180 characters

Leave 25–35% headroom before you translate. This is the single highest-leverage decision in the whole workflow, and it costs nothing if you make it first.

3

Translate the whole file in one pass

UI strings and listing strings go together, so a locale is never half-shipped. Enforce the 250-character ceiling on the translated listingSummary before it ever reaches the Developer Hub.

4

Ship the package first, then fill the listing

Upload the package so AMO ingests your _locales tree, then check which locales appeared. That list — not your folder list — is the set you need to fill in by hand.

5

Localize in install-count order

Do not start at 40 languages. Localize the five where you have real installs, watch conversion, and expand from there. Untranslated locales fall back to your default locale, so partial coverage is a legitimate steady state.

Chrome Web Store has the same per-language listing problem and the same lack of bulk upload; if you also ship to Chrome, the console script for automating CWS listing translations removes most of the copy-paste there. Edge is a different story again — its Partner Center reads your _locales folder to decide which listing languages even exist, which produces a memorable failure mode covered in localizing your Edge Add-ons listing.

Locale codes: one tree, three stores

A single _locales folder feeds Chrome, Firefox and Edge, but the three do not agree on how to spell a locale. Chrome’s folder convention uses underscores (pt_BR); AMO normalises to hyphens internally (pt-BR); the Chrome Web Store dashboard has its own quirks, including iw for Hebrew.

The rule that keeps this manageable: name your folders the Chrome way. Underscores, exact casing, codes from Chrome’s supported list. That tree loads in Firefox, loads in Chrome, and is what Edge’s Partner Center scans. The stores normalise inbound; none of them will fix a folder name that was invalid to begin with. See Chrome extension locale codes for the full list and the codes that look right but are not.

An unrecognised folder name is the quietest bug in this whole area. Chrome ignores unsupported locales rather than erroring; AMO drops them during package parsing. Nothing tells you that pt-BR (with a hyphen) shipped as a folder nobody will ever read.

Frequently asked questions

Can I translate my Firefox add-on listing on AMO?

Yes. Mozilla's Extension Workshop states: “You also have the option to localize almost all the text content of your add-on's listing, including its name.” The listing name, summary, description and version details are all localizable, and Mozilla recommends adding a localized listing for each language your add-on supports.

Does AMO read my _locales folder for the listing?

Partly. Mozilla's open-source addons-server code enumerates every _locales/<code>/messages.json file in the uploaded package and uses it to resolve __MSG_ placeholders in the manifest name and description when the add-on record is first created. It does not populate the long listing description, screenshots or tags — those are entered per locale in the Developer Hub. Mozilla's published developer documentation does not describe this seeding step, so treat the Developer Hub as the source of truth for what actually landed.

How do I localize my Firefox add-on name?

Put __MSG_extensionName__ in the manifest.json name field, declare default_locale, and provide an extensionName key in each _locales/<code>/messages.json. Firefox resolves the placeholder at runtime, and AMO resolves it from the package when creating the listing. The AMO add-on name field is short — addons-server defines it with a maximum length of 50 characters — so translations that expand past that get truncated.

What is the character limit for the AMO add-on summary?

Extension Workshop states: “The summary description for your add-on is limited to 250 characters.” The same limit appears in addons-server as the maximum length of the summary field. The full description has no practical limit for authoring purposes — Mozilla writes that “you are not practically limited when it comes to the add-on's description and version details.”

Does Mozilla translate my add-on listing for me?

No. In a 2018 Mozilla Add-ons blog post Mozilla wrote: “At present, we don't have a way to connect extension developers with the translation community at scale, and Pontoon, Mozilla's tool for localizing products and websites, currently only supports translating the AMO site itself.” That post is from July 2018 and describes a one-off volunteer campaign, not an ongoing service. Translating your listing is your job.

Do I need a listing translation for every locale in _locales?

No. AMO falls back to your default locale for any language you have not localized, exactly like Firefox falls back to default_locale for missing message keys. Localize the languages where you actually have installs first, then expand. A locale code AMO does not recognise is skipped silently rather than reported as an error.

One _locales tree, every store reads it

LocalePack takes your messages.json and returns a _locales ZIP in 52 locales, every folder name a valid Chrome locale code — which is exactly what AMO parses on upload and what Edge’s Partner Center scans to discover listing languages. Placeholders like $PLACEHOLDER$ and $1 are preserved. Store-listing copy is handled separately, with the character limits enforced on the output. Pay once, no account, no subscription.

Translate your messages.json into 52 locales →
← Back to Guides
LocalePack
GidaiPrivatumasSąlygosPagalba

© 2025 LocalePack. Visos teisės saugomos.

Šis projektas buvo išverstas naudojant LocalePack logoLocalePack