Skip to content

ADR-016: A localization layer we wrote

Status: Accepted (2026-08-30)

Decision: The panel reads text from catalogs the project wrote in lib/i18n/, roughly 100 lines with no dependency. It uses no library such as @wxt-dev/i18n, i18next, or react-intl. The manifest still uses public/_locales/, because browser.i18n is the only mechanism that can localize a manifest.

Why: the layer gives the panel exactly what it needs: a catalog for each language, placeholders, plural forms from Intl.PluralRules, and a user-controlled setting. A general-purpose library would add bytes, a second naming scheme, and a message format nothing here uses.

The condition to open this decision again: a language with rules Intl cannot express, or many more languages than Gopher has today.

Read localization and the stack.