Why Partner Center shows only one listing language even when your package ships twenty, how __MSG_ manifest references drive language detection, and which listing fields Edge requires for every language versus just one.
edge add-ons listing localizationpartner center store listing languageedge extension listing translation
How to localize an add-on listing on addons.mozilla.org: which fields can be translated, the 250-character summary ceiling and what it costs you in German and Russian, and the per-locale Developer Hub workflow.
AMO listing localizationfirefox add-on listing translationaddons.mozilla.org localize listing
All four chrome.i18n methods with exact signatures and return types: which are synchronous, which return promises, what getMessage() returns when it fails, and how browser.i18n differs in Firefox and Safari.
Every locale code Chrome accepts as a _locales folder name, with language and native names, the underscore-vs-hyphen trap that makes pt-BR silently ignored, and how Chrome picks a locale at runtime.
chrome extension locale codes_locales folder nameschrome supported localespt_BR vs pt-BR
getMessage() returns an empty string when a message is missing, and logs nothing at all. Every cause of the silent empty string, how to tell it apart from undefined, and how to confirm each one.
chrome.i18n.getMessage returns empty stringgetMessage emptychrome i18n not working
Synchronous getMessage() is an advantage in an MV3 service worker, not a problem — a common claim that gets this backwards. What actually breaks is the DOM, global-variable caching, localStorage and XMLHttpRequest.
chrome.i18n service workerchrome.i18n manifest v3i18n mv3 background
How @wxt-dev/i18n compiles YAML, JSON, JSONC, JSON5 and TOML message files into standard _locales/{lang}/messages.json — setup, nested keys, plurals, substitutions, type safety, and how to translate a WXT project.
Plasmo does not read _locales/ at the project root. The three paths it does accept, where default_locale actually lives, the alphabetical-default trap, and how to place a translated _locales ZIP correctly.
CRXJS ships no i18n helper and its docs have no i18n page. Here is the working pattern: put _locales under public/, declare default_locale in manifest.config.ts, and call chrome.i18n directly.
How to get accurate AI translations for your Chrome extension: write description fields that give the model context, define placeholders with examples, avoid string concatenation, and handle plurals, casing, and length expansion.
improve ai translation qualitymessages.json description fieldtranslate chrome.i18n placeholderschrome extension translation qualitymessages.json best practices
Honest comparison of LocalePack and Localeship for Chrome Web Store listing translation. Both are pay-per-use tools — the key difference is that LocalePack also translates in-extension messages.json strings.
localeship alternativechrome web store listing translation toollocaleship vs localepackcws listing translation no subscription
Honest comparison of LocalePack and POEditor for i18next JSON translation. POEditor is a collaborative TMS with a string-count subscription and a free tier; LocalePack is upload → pay once → download.
poeditor alternative i18nextpoeditor alternative json translationi18next json translation without poeditorpoeditor alternative no subscription
Honest comparison of LocalePack and Phrase Strings for Next.js locale JSON translation. Phrase is a full TMS with per-seat subscription pricing; LocalePack is upload → pay once → download.
phrase alternative next.js localizationphrase strings alternative jsonnext.js json translation without phrasephrase alternative no subscription
Honest comparison of LocalePack and Lokalise for Chrome extension messages.json translation. Lokalise is a full TMS with team workflows and a monthly subscription; LocalePack is upload → pay once → download.
lokalise alternative chrome extensionlokalise vs localepackchrome extension localization without lokaliselokalise alternative no subscription
Honest comparison of LocalePack and Crowdin for browser extension messages.json translation. Crowdin is a full TMS with ongoing subscription; LocalePack is upload → pay once → download.
crowdin alternative messages.jsoncrowdin alternative chrome extensionmessages.json translation without crowdincrowdin alternative no subscription
Why Crowdin, Lokalise, and Phrase are overkill for most browser extension projects — and three real alternatives for indie developers who need to translate messages.json without a monthly subscription.
crowdin alternative extensionlokalise alternativemessages.json translator no accountbrowser extension i18n
A complete reference for the i18next JSON locale format — namespace files, double-brace {{placeholder}} syntax, _one/_other plural keys, nested objects, and how to structure your locales/ folder.
Practical comparison of the three leading Next.js i18n libraries — App Router support, file format, TypeScript safety, pluralization syntax, and when to pick each one.
next.js i18nnext-intl vs react-i18nextnext.js app router i18nnext-intl
How the __MSG_key__ substitution syntax works in Chrome and Firefox extension manifests: which fields support it, how Chrome resolves tokens at load time, and the pitfalls that cause silent failures or upload rejections.
__MSG_key__ manifest.json__MSG_appName__manifest.json i18nchrome extension name localization
How to catch every class of messages.json error before your users do: JSON syntax, missing required fields, missing keys across locales, malformed placeholder syntax, and manifest key mismatches.
Step-by-step guide to adding i18n to a Chrome extension: _locales structure, default_locale, messages.json syntax, chrome.i18n.getMessage(), placeholder preservation, and how to test locale switching.
how to localize chrome extension_localesmessages.jsonchrome.i18n
A complete reference for the WebExtension messages.json format: the message, description, and placeholders fields, $PLACEHOLDER$ syntax, $1 positional substitutions, and common mistakes.
Using browser.i18n in Firefox add-ons: the messages.json format, AMO localization requirements, and how to avoid common pitfalls on addons.mozilla.org.