Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
4 changes: 4 additions & 0 deletions extension/_locales/es/messages.json
Original file line number Diff line number Diff line change
Expand Up @@ -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."
Expand Down
1 change: 0 additions & 1 deletion release-please-config.json
Original file line number Diff line number Diff line change
Expand Up @@ -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" }
Expand Down
19 changes: 19 additions & 0 deletions test/unit/store-readiness.test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
});
Expand Down