diff --git a/CHANGELOG.md b/CHANGELOG.md index 4ae0fd3..640e3d2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,9 @@ Conventional Commits by release-please. ## Unreleased +- The Chrome Web Store accepts the package: the Spanish translation now has the extension's + full name, which the store requires for every language a package includes. + ## [1.0.0](https://github.com/ScriptKittyOS/kotiko/compare/v0.2.0...v1.0.0) (2026-10-08) Kotiko's first public release, for the Chrome Web Store and Firefox Add-ons. Learn a word in diff --git a/extension/_locales/es/messages.json b/extension/_locales/es/messages.json index 8820de7..01eb56e 100644 --- a/extension/_locales/es/messages.json +++ b/extension/_locales/es/messages.json @@ -3,6 +3,10 @@ "message": "Kotiko", "description": "The extension's name in the browser and stores. Don't translate." }, + "extStoreName": { + "message": "Kotiko: aprende idiomas mientras navegas", + "description": "The extension's full name in the browser's extensions list and on the Chrome Web Store and Firefox Add-ons listings: the name Kotiko, a colon, and a short phrase saying what it does. Keep \"Kotiko\" as it is. At most 45 characters (the Edge store's limit)." + }, "extDescription": { "message": "Aprende palabras mientras navegas: cambia palabras de las páginas web por las que estás aprendiendo, en cualquier idioma.", "description": "The extension's one-line description on the browser's extensions page." diff --git a/release-please-config.json b/release-please-config.json index 6285c8d..5ba2dab 100644 --- a/release-please-config.json +++ b/release-please-config.json @@ -20,7 +20,6 @@ ], "packages": { ".": { - "release-as": "1.0.0", "extra-files": [ { "type": "json", "path": "extension/manifest.json", "jsonpath": "$.version" }, { "type": "generic", "path": "server/mix.exs" } diff --git a/test/unit/store-readiness.test.mjs b/test/unit/store-readiness.test.mjs index b2c821e..3b06904 100644 --- a/test/unit/store-readiness.test.mjs +++ b/test/unit/store-readiness.test.mjs @@ -240,6 +240,25 @@ describe("the listing (slice 28 §8)", () => { for (const k of ["extStoreName", "extDescription"]) assert.doesNotMatch(messages[k].message, /English/, k); }); + // The Chrome Web Store refused v1.0.0's zip: "The translation of the name of your item is + // missing in locale es". Every locale the package ships needs each message the manifest + // names, within the stores' limits (name 45 for Edge, short name 12, description 132). + test("every locale in the package has the manifest's messages, within the stores' limits", () => { + const keys = [...new Set(JSON.stringify(manifest()).match(/__MSG_(\w+)__/g) ?? [])].map((m) => m.slice(6, -2)); + assert.ok(keys.includes("extStoreName") && keys.includes("extDescription")); + const limits = { extStoreName: 45, extName: 12, extDescription: 132 }; + const locales = fs.readdirSync(path.join(EXT_DIR, "_locales")); + assert.ok(locales.length > 1, "more than one locale ships"); + for (const locale of locales) { + const messages = JSON.parse(readExt(`_locales/${locale}/messages.json`)); + for (const k of keys) { + const text = messages[k]?.message; + assert.ok(typeof text === "string" && text.trim(), `${locale}: ${k} is missing`); + if (limits[k]) assert.ok([...text].length <= limits[k], `${locale}: ${k} is ${[...text].length} characters, over ${limits[k]}`); + } + } + }); + test("the mascot isn't named in the listing (DECISIONS 2026-10-01)", () => { for (const f of LISTINGS) assert.doesNotMatch(read(`store/listing/${f}`).replace(/"_comment":.*\n/, ""), /\bMira\b/, f); });