Skip to content

i18n: downloadable language packs - #2417

Merged
callumalpass merged 7 commits into
mainfrom
feat/downloadable-language-packs
Oct 26, 2026
Merged

callumalpass merged 7 commits into
mainfrom
feat/downloadable-language-packs

Conversation

@callumalpass

Copy link
Copy Markdown
Owner

Summary

  • Keep the existing TypeScript translation resources and all nine supported locales; ordinary CI/release builds remain fully bundled and make no language-pack requests.
  • Add explicitly opted-in English-only builds with a pinned, content-addressed catalogue. English is synchronous/offline; non-English JSON data must pass size, SHA-256, format, locale, English-source hash, key and interpolation validation before activation. Compatible digest-addressed caches survive offline restarts; failed downloads preserve the active language; retries, timeouts and superseded requests are guarded.
  • Export immutable product/version-separated packs and publish the manifest last. The S3 publisher uses conditional create-if-absent, origin verification and safe reconciliation of uncertain/concurrent outcomes. No remote code, global latest catalogue, translation service or CI authoring is introduced.
  • Keep publication separate from plugin releases: manual workflow dispatch only, exact main ref and affirmative input, non-cancelling concurrency, protected language-packs-production environment with main-only deployment rule and required owner approval. Credentials are bucket-scoped and available only to the publication step. This PR does not dispatch, publish, deploy, tag, release or enable remote ordinary builds.
  • Correct legacy mixed-English Russian/Chinese strings; Portuguese follows the plugin’s Brazilian variant. UI-copy audit follow-up is in progress on this branch.

Validation

Rebased onto current main. All eight non-English resources verify current (2333/2333 messages each). Remote unit run passed 737 suites / 4641 tests, with existing 70 skipped suites, 1000 skipped tests and 4 todo. Strict lint, typecheck, all 30 export/build-isolation/local HTTP/S3 script tests, both production build modes and size guards passed. Bundled: 4,662,448 bytes; downloadable: 3,580,287 bytes, each strictly below 5,000,000. Production npm dependency audit reports zero vulnerabilities; development dependency findings are not silently fixed here.

The npm-managed repository is not migrated to pnpm; remote checks use an uncommitted locally imported/hoisted pnpm bridge. Documentation site validation and a fresh isolated native acceptance run are pending and will be recorded here. Historical isolated desktop and Android 16 / Obsidian 1.13.8 pack acceptance is documented, not claimed as fresh execution.

Unverified/waived: iOS testing was explicitly waived, so compatibility remains an assumption. Physical/older Android and a full platform matrix are not verified. The main-only protected publication workflow has never run; existing operator/live conditional-write acceptance is not evidence of a CI publication. Newly generated catalogues are not published by this PR. Normal remote release opt-in requires separate owner approval.

@callumalpass

Copy link
Copy Markdown
Owner Author

Restart follow-up — e70b7ba6

Addressed both P2 review findings:

  • Bounded best-effort cache reads/writes; hung operations no longer keep selection/retry pending. Added real loader/controller tests for never-settling storage, retry and late completion/rejection.
  • Refresh ribbon tooltips/accessibility names in place on locale change, with listener disposal. Native regression cold-starts with saved uncached French, holds the download until English ribbons exist, then checks all eight French ribbons, translated commands and no duplicates.

Expanded the interface audit with 285 additional messages, authored in all eight target locales. Each catalogue is 2,618/2,618 current, with no stale/duplicate keys; usage checks pass. Recurrence controls now follow each locale's translated sentence order; user-authored names/paths/labels are preserved.

Verification:

  • GitHub CI green: test (20), bundle-size and build-test, including integration/coverage/built-plugin checks.
  • Final remote gates: typecheck, all lint, 739 unit suites / 4,691 tests passed (70 suites / 1,000 tests skipped, 4 todo), 30/30 pack delivery/export/publisher tests, docs checks and both build modes.
  • Bundled 4,827,658 bytes; downloadable 3,615,915 bytes, both below 5 MB.
  • Exact final downloadable artifact: fresh isolated Obsidian 1.13.7/Xvfb, 1 native test passed (21.0s), covering cold startup, picker switching, offline reload, corrupt-data retry and superseded selection. Owner-run local trace/log, not a GitHub CI browser run.
  • Targeted independent read-only re-review: both P2s closed, no blocker; reviewer did not run tests or review the entire copy audit.

Limits: requestUrl transport-memory/cancellation remains documented, not fixed. Internal mobile ribbon-menu titles remain unverified; Android was not repeated for this follow-up and iOS remains waived/unverified. A slow startup download can show the ordinary language-change notice. Normal builds remain fully bundled. No merge, publication, deployment or release.

@callumalpass
callumalpass marked this pull request as ready for review October 26, 2026 09:40
@callumalpass
callumalpass merged commit 78ed706 into main Oct 26, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant