From dc9b9d259c782a3bf6bee0e568bcdde85613e31c Mon Sep 17 00:00:00 2001 From: Exotic209093 <134711311+Exotic209093@users.noreply.github.com> Date: Sun, 4 Oct 2026 22:24:34 +0100 Subject: [PATCH] feat(i18n): localise the extension name and summary for Spanish (v0.7.1) Move the manifest name, description, and shortcut description into _locales (en default, es) so the Chrome Web Store accepts a Spanish listing and Spanish-language Chrome shows the Spanish strings. The package smoke check now fails on unresolved __MSG_ placeholders or over-length store strings in any locale. Co-Authored-By: Claude Opus 5.5 (1M context) --- CHANGELOG.md | 7 +++++++ docs/CHROME_WEB_STORE.md | 24 ++++++++++++++++-------- docs/launch-kit.md | 2 +- package-lock.json | 4 ++-- package.json | 2 +- public/_locales/en/messages.json | 14 ++++++++++++++ public/_locales/es/messages.json | 11 +++++++++++ public/manifest.json | 9 +++++---- scripts/validate-package.js | 18 ++++++++++++++++++ 9 files changed, 75 insertions(+), 16 deletions(-) create mode 100644 public/_locales/en/messages.json create mode 100644 public/_locales/es/messages.json diff --git a/CHANGELOG.md b/CHANGELOG.md index cb547e3..0a2e848 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.7.1] — 2026-10-04 + +### Added +- **Spanish store listing and extension name** — the extension name, summary, and shortcut description are now localised through `_locales` (English default, Spanish), so Chrome shows them in Spanish for Spanish-language browsers and the Chrome Web Store accepts a Spanish listing. The in-app interface remains in English. +- The package smoke check verifies every `__MSG_*__` placeholder resolves in every locale and that each locale's name and summary fit the store's 75- and 132-character limits. + ## [0.7.0] — 2026-10-04 The trust release: every defect from the 2026-08-31 audit (#40–#106) is fixed, @@ -119,6 +125,7 @@ in and out of Salesforce right from your browser, with nothing leaving your devi - Initial release. +[0.7.1]: https://github.com/Exotic209093/WaveLink/releases/tag/v0.7.1 [0.7.0]: https://github.com/Exotic209093/WaveLink/releases/tag/v0.7.0 [0.6.0]: https://github.com/Exotic209093/WaveLink/releases/tag/v0.6.0 [0.2.0]: https://github.com/Exotic209093/WaveLink/releases/tag/v0.2.0 diff --git a/docs/CHROME_WEB_STORE.md b/docs/CHROME_WEB_STORE.md index ea1906b..be5c2ee 100644 --- a/docs/CHROME_WEB_STORE.md +++ b/docs/CHROME_WEB_STORE.md @@ -1,6 +1,6 @@ # Chrome Web Store release kit -This file is the source of truth for the WaveLink 0.7.0 listing and privacy declarations. Copy text exactly unless the Chrome Web Store dashboard requires a shorter value. +This file is the source of truth for the WaveLink 0.7.1 listing and privacy declarations. Copy text exactly unless the Chrome Web Store dashboard requires a shorter value. ## Dashboard and public links @@ -18,7 +18,7 @@ npm run assets:store npm run package ``` -Upload `wavelink-0.7.0.zip`. The package contains the compiled Manifest V3 extension, icons, and bundled privacy page; it excludes source, tests, and build-only files. +Upload `wavelink-0.7.1.zip`. The package contains the compiled Manifest V3 extension, icons, and bundled privacy page; it excludes source, tests, and build-only files. ## Store listing @@ -26,13 +26,13 @@ Upload `wavelink-0.7.0.zip`. The package contains the compiled Manifest V3 exten > WaveLink — Salesforce SOQL Export & Data Import Tool -The product name comes from `public/manifest.json` and is 52 characters (limit 75). +The product name comes from `public/_locales/en/messages.json` (`extName`) and is 52 characters (limit 75). ### Summary > Export Salesforce data with SOQL to CSV, Excel, JSON or XML right in Chrome. No Java, no install, no server. Free and open source. -The summary comes from `public/manifest.json` and is 130 characters, below Chrome's 132-character limit. +The summary comes from `public/_locales/en/messages.json` (`extDescription`) and is 130 characters, below Chrome's 132-character limit. ### Detailed description @@ -67,10 +67,18 @@ The summary comes from `public/manifest.json` and is 130 characters, below Chrom > > Uses your existing Salesforce browser session. WaveLink is independent and is not affiliated with or endorsed by Salesforce, Inc. -### Localised listing +### Localised listing (Español) -Add **Español** in the dashboard with the Spanish summary and description in +The package ships `_locales/en` (default) and `_locales/es`. The Spanish name +and summary come from `public/_locales/es/messages.json` automatically: + +- Name: **WaveLink — Exporta e importa datos de Salesforce con SOQL** (57 characters) +- Summary: **Exporta datos de Salesforce con SOQL a CSV, Excel, JSON o XML desde Chrome. Sin Java ni instalaciones. Gratis y de código abierto.** (130 characters) + +In the dashboard, switch the Store listing language to **Spanish** and paste the +Spanish description from [`launch-kit.md`](launch-kit.md#spanish-listing-store-listing--add-language--español). +Screenshots may reuse the English set. ### Category and language @@ -184,9 +192,9 @@ The repository must be pushed before saving this URL so reviewers can reach the ## Final submission checklist -- [ ] Push the v0.7.0 code and public privacy policy to `main`. +- [ ] Push the v0.7.1 code and public privacy policy to `main`. - [ ] Confirm the privacy-policy URL loads while signed out of GitHub. -- [ ] Upload `wavelink-0.7.0.zip` and confirm version 0.7.0 is detected. +- [ ] Upload `wavelink-0.7.1.zip` and confirm version 0.7.1 is detected. - [ ] Replace the description with the text in this file. - [ ] Upload all five screenshots in the documented order. - [ ] Upload the icon and promotional tiles. diff --git a/docs/launch-kit.md b/docs/launch-kit.md index 877851a..08d6c58 100644 --- a/docs/launch-kit.md +++ b/docs/launch-kit.md @@ -116,7 +116,7 @@ unlisted YouTube upload and paste the URL into the listing's video field. > > WaveLink es independiente y no está afiliado ni respaldado por Salesforce, Inc. -Have a native speaker skim this before publishing; it is written in neutral Latin American Spanish. +The Spanish name and summary ship in `public/_locales/es/messages.json` (v0.7.1+); paste only the description in the dashboard. Have a native speaker skim it before publishing; it is written in neutral Latin American Spanish. ## Tracked links diff --git a/package-lock.json b/package-lock.json index 608ca1f..68593a7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "wavelink", - "version": "0.7.0", + "version": "0.7.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "wavelink", - "version": "0.7.0", + "version": "0.7.1", "license": "MIT", "dependencies": { "papaparse": "^5.5.2", diff --git a/package.json b/package.json index ec5f50f..d2bb212 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "wavelink", - "version": "0.7.0", + "version": "0.7.1", "description": "A local-first Chrome extension for safer Salesforce data exports, imports, comparisons, schedules, and reusable jobs.", "private": true, "scripts": { diff --git a/public/_locales/en/messages.json b/public/_locales/en/messages.json new file mode 100644 index 0000000..2727746 --- /dev/null +++ b/public/_locales/en/messages.json @@ -0,0 +1,14 @@ +{ + "extName": { + "message": "WaveLink — Salesforce SOQL Export & Data Import Tool", + "description": "Extension name shown in Chrome and on the Chrome Web Store (max 75 characters)." + }, + "extDescription": { + "message": "Export Salesforce data with SOQL to CSV, Excel, JSON or XML right in Chrome. No Java, no install, no server. Free and open source.", + "description": "Store summary and extension description (max 132 characters)." + }, + "commandTogglePanel": { + "message": "Toggle WaveLink panel", + "description": "Keyboard shortcut description on chrome://extensions/shortcuts." + } +} diff --git a/public/_locales/es/messages.json b/public/_locales/es/messages.json new file mode 100644 index 0000000..ca72656 --- /dev/null +++ b/public/_locales/es/messages.json @@ -0,0 +1,11 @@ +{ + "extName": { + "message": "WaveLink — Exporta e importa datos de Salesforce con SOQL" + }, + "extDescription": { + "message": "Exporta datos de Salesforce con SOQL a CSV, Excel, JSON o XML desde Chrome. Sin Java ni instalaciones. Gratis y de código abierto." + }, + "commandTogglePanel": { + "message": "Mostrar u ocultar el panel de WaveLink" + } +} diff --git a/public/manifest.json b/public/manifest.json index 3ffdaeb..fbd0907 100644 --- a/public/manifest.json +++ b/public/manifest.json @@ -1,8 +1,9 @@ { "manifest_version": 3, - "name": "WaveLink — Salesforce SOQL Export & Data Import Tool", - "version": "0.7.0", - "description": "Export Salesforce data with SOQL to CSV, Excel, JSON or XML right in Chrome. No Java, no install, no server. Free and open source.", + "name": "__MSG_extName__", + "default_locale": "en", + "version": "0.7.1", + "description": "__MSG_extDescription__", "homepage_url": "https://github.com/Exotic209093/WaveLink", "permissions": [ "storage", @@ -50,7 +51,7 @@ "default": "Ctrl+Shift+L", "mac": "Command+Shift+L" }, - "description": "Toggle WaveLink panel" + "description": "__MSG_commandTogglePanel__" } }, "icons": { diff --git a/scripts/validate-package.js b/scripts/validate-package.js index 652f681..07c4502 100644 --- a/scripts/validate-package.js +++ b/scripts/validate-package.js @@ -42,6 +42,24 @@ for (const script of manifest.content_scripts || []) { for (const source of script.js || []) requireFile(source); } +// Every __MSG_*__ placeholder must resolve in every shipped locale, within the store's length limits. +const placeholders = [...JSON.stringify(manifest).matchAll(/__MSG_(\w+)__/g)].map(match => match[1]); +if (placeholders.length > 0) { + if (!manifest.default_locale) fail('manifest uses __MSG_ placeholders without default_locale'); + requireFile(`_locales/${manifest.default_locale}/messages.json`); + const localesDir = path.join(dist, '_locales'); + for (const locale of fs.readdirSync(localesDir)) { + const messages = JSON.parse(fs.readFileSync(path.join(localesDir, locale, 'messages.json'), 'utf8')); + for (const key of placeholders) { + if (!messages[key]?.message) fail(`_locales/${locale} is missing "${key}"`); + } + const name = messages.extName?.message ?? ''; + const description = messages.extDescription?.message ?? ''; + if (name.length > 75) fail(`_locales/${locale} extName is ${name.length} characters (max 75)`); + if (description.length > 132) fail(`_locales/${locale} extDescription is ${description.length} characters (max 132)`); + } +} + for (const required of ['app/app.html', 'app/index.js', 'offscreen/offscreen.html', 'offscreen/index.js']) { requireFile(required); }