The owner asked on 2026-10-12, as 1.5.0’s last feature, from post-release-roadmap.md’s Kept in mind: the listing in Spanish and Japanese, which the wallet has spoken since chunk 19. The store’s analytics show users of both.
Status: ✅ built 2026-10-12 on web-wallet/store-listing-i18n, from main after #304. One PR: the build and the docs together, so this file went straight to the archive. What still holds is in store/README.md, with each language’s text ready to paste. The privacy policy has no new entry: nothing is sent or kept.
One item, one package. A listing in another language has two halves:
name and description. With _locales/<language>/messages.json in the package and default_locale in the manifest, a __MSG_…__ description is read in each language Chrome has a file for._locales, the Store listing tab gets a language list at its top, one entry for each _locales folder, and each language takes its own description and its own screenshots (Google’s page). A language’s own screenshots show before the global ones. The small promo tile can’t be localized.So the package must carry _locales before the dashboard offers anything: the summary ships in 1.5.0’s zip, and the description and screenshots go in at its upload.
SUMMARY in manifest.ts, in English, Spanish and Japanese. The manifest’s description is __MSG_appDesc__ and its default_locale is en. The build’s manifest plugin (vite.config.ts) writes _locales/<language>/messages.json beside manifest.json, from buildLocales(). scripts/package.mjs zips the whole of dist/, so they ship with nothing more.Seedelf Wallet in every language: it’s a name (glossary).e2e/store-images.spec.ts): the flow is still driven in English, and each screen is shot in English, then Spanish, then Japanese, by setting seedelf.language (LOCAL_LANGUAGE) in local storage, which every open page follows as it does a choice in Settings. Each language has its captions (CAPTIONS). English’s images stay at the top of docs/store/images/, byte for byte as they were; Spanish’s and Japanese’s are in es/ and ja/. The Japanese captions set lang="ja" and break lines between phrases (word-break: auto-phrase), with no negative letter spacing.en.json and taken from es.json or ja.json, so the listing names things as the screens do.Flags left as they were, on purpose: the words the wallet itself uses (返却, 結び付く, 投票権, 資金提供, devolución, pulsa, parte de staking, retirar tu DRep), since the listing should match the screens; and what the English says the same way (“a fresh copy of their key”, “Or remove a Seedelf”, “the default depth”), since a translation shouldn’t explain more than the original. No native speaker has read either language, as with the wallet’s own (the owner accepted that on 2026-10-03).
tests/manifest.test.ts, “gives the store’s summary in each language the wallet speaks, through Chrome’s _locales”: default_locale and the __MSG_appDesc__ description, one _locales entry per bundled language, and each summary at most 132 characters and naming Seedelf. It failed until Spanish’s and Japanese’s were in.dist/ loaded in Playwright’s Chromium under English, Spanish and Japanese UI languages. chrome.i18n.getMessage("appDesc") and the manifest’s description came back in each.SUMMARY’s languages are written out, not imported: tests/import-boundaries.test.ts keeps everything vite.config.ts loads clear of the i18n modules, and caught a type import of LanguageCode. The manifest test holds them to the bundled languages instead._locales.npm run store:images on the build: 15 screenshots. English’s are unchanged, and the Spanish and Japanese ones were looked at, all ten, with nothing cut off or left in English._locales folder, and the wallet ships these three.