Skip to content

Port Obsidian plugin UI to shared Lingui kit - #2418

Merged
callumalpass merged 31 commits into
mainfrom
feat/lingui-port
Oct 26, 2026
Merged

callumalpass merged 31 commits into
mainfrom
feat/lingui-port

Conversation

@callumalpass

@callumalpass callumalpass commented Oct 23, 2026 •

Copy link
Copy Markdown
Owner

Lingui port — independent re-review N1–N9

Draft stacked on feat/downloadable-language-packs (#2417); base and draft status unchanged. Head: b96d2b8cf242d4719964ba586b7a790d357ca436. Validated implementation/native harness: 46c0752b833e761002d5cb8e1794387447660856; the final commit records evidence only.

Findings

Finding Disposition
N1 built-in field/group labels Restored all 14 display descriptors; English seeds/custom names remain untouched. Native en/de verifies every label.
N2 grouping and sorting English group identities/comparisons and HTTP/MCP keys; completed dates sort descending, then Invalid date / Not completed. Ambiguous user strings None/True/False need raw-value/schema provenance before display translation.
N3 eager translation English OpenAPI summaries; guard rejects eager decorators, module scope, static initializers and immediate IIFEs while allowing inert descriptors/deferred rendering.
N4 NLP compatibility Restored pre-port public parser/API/MCP/instant-conversion fallback. CLI retains missing-title rejection and explicit-title override. Only interactive adapters map missing-title identity to empty input. Persisted Source links heading stays English.
N5 TaskInfo fallback Cache-hit and cache-miss readers share localized read-only fallback; unrelated patches never persist the synthetic title.
N6 persisted defaults Reminder/calendar/provider fallback seeds stay English; unchanged defaults translate at display boundaries.
N7 label display/NLP/export data Unchanged default-label inputs and NLP suggestions/shortcuts translate without saving on render; stable values are inserted. Google Calendar metadata/title/duration fallbacks remain English and configured labels stay literal.
N8 ICS DESCRIPTION Exact pre-port English payload restored, including legacy duration wording; deliberate export policy documented.
N9 cleanup Removed converter/archive-rewriting tooling, unused grouping implementations/hierarchical API/helper/tests, stale legacy alias/config/comments. Historical migration ledgers remain unchanged.
M6 workflow parity All 20 checked-in shell steps pass via rpnpm/Node 22. Not hosted Actions acceptance; triggers/base unchanged and no dispatch.

Authorship and policies

  • 2,716 active messages per locale, zero missing across nine locales. Restored 16 descriptors / 128 translations verbatim from historical authorship (14 field/group descriptors plus two new-status/priority labels); 38 deliberate retirements are inventoried.
  • Every 2,700 retained entry per locale is unchanged from dcb21741. Direct original-translator comparison verifies 2,704 retained translations per target locale unchanged, including recovered text. No English target padding or newly authored translations in this round.
  • Prior plural work is retained: all 22 corrected one arms, six Russian stable-group sibling arms, and removal of 90 optional es/fr many arms. Current focused proof covers 94 active messages / 564 renders; the retired ICS descriptor S3yJwA is explicitly accounted for in es/fr, without allowing any corrected one arm to disappear.
  • Persist English seeds and stable identities; translate only recognized unchanged defaults for display. Edited/already-localized user data remains literal. Generated Bases configured status/priority values stay English/user-owned; instructional/count labels are deliberately localized at generation, never regenerated merely on language change.
  • The shared-kit integer coverage rule is still mirrored locally; the existing vendored kit is unchanged and must be replaced by its published package at merge time. NLP src/locales is unchanged.

Current validation

  • Strict catalogue check/compile, extraction sync and both source guards: pass, 416 marked modules.
  • Full coverage and fresh absent-generated-JSON Jest: 766 suites / 5,026 tests pass. Existing skips: 70 suites / 1,005 tests / 4 todo; no new skips. Integration: 5 suites / 77 tests, 12 existing skips.
  • 58 source/gate fixtures, 30 pack fixtures, 7 bundle/dependency fixtures, typecheck, lint and docs pass. Docs: 221 published pages, 5 generated references, 229 checked HTML files. Translation/source/docs gates passed again after the evidence update.
  • 24,444 authored contracts and 171,108 real operand renders pass (0/1/2/5/21/1.5/1,000,000), plus the 564 focused plural renders.
  • Both minified builds pass the unchanged strictly below 5,000,000-byte budget: bundled 4,185,491 bytes; downloadable 3,605,436 bytes. Exact graphs: nine UI catalogues versus English only; no legacy UI resources.
  • Exact checked-in workflow replay: 20 shell steps pass, SHA-256 9587bdf752e8b654fe6425e42eefd5b287ca835a89c8035ff238797b8fdf043c. No hosted checkout/setup/upload acceptance or OAuth-secret integration claim. The existing Node-20-only performance step remains skipped under Node 22.

Current native desktop evidence

Three bundled minified-build tests pass on isolated Linux/Xvfb Obsidian 1.14.2:

  1. Synchronous nine-catalogue decoding; en/ja/de/ru settings, commands and plurals.
  2. Real en/de/ru Kanban pointer drags, typed boolean/empty creation and saved ordering.
  3. All 14 en/de field/group labels, translated default-label inputs without writes, real completed-date grouping/sorting, programmatic fallback and interactive title validation.

The native run exposed Obsidian's icon-only empty-value representation. The group-label adapter now shares the existing classifier instead of guessing from user strings; a unit regression covers it. Final successful runs retain screenshot-bearing Playwright traces. Reports, artifact hashes and embedded en/de results are in docs/development/i18n-rereview.json; local files are under test-results/lingui-bundled/ and the three lingui-bundled-* trace directories. No personal vault/profile was used; fixtures/settings were restored and fixture folders removed.

Explicit limits

  • Current native acceptance is bundled desktop only. Downloadable offline/corrupt/retry/supersession evidence remains historical at source febb5f8905439a92196da119d901ead204755fb1, not claimed as rerun here; both current production build graphs/budgets pass.
  • Hosted Actions remains unverified. The PR stays draft on its existing stacked base; no trigger edits or workflow dispatch were used.
  • iOS remains unverified/explicitly waived; Android evidence is historical. No independent native-speaker certification.
  • Previously deferred minor scope remains: generated-view snapshot policy, remaining ICS note/template prose, generic number grouping, full live hot-refresh and broader noun/count authoring. The ICS DESCRIPTION and Google Calendar policies above are now deliberate, not accidental locale-dependent writes.
  • Worked alone. No main writes/merges, tags/releases, publication, deployment, personal vault/profile changes, subagents or canonical ~/projects changes.

Evidence: docs/development/i18n-rereview.json (current findings/source-bound validation/native report), i18n-acceptance.json, i18n-ci-workflow-parity.json. Historical plural/authorship/singleton inventories are retained and explicitly scoped; they are not regenerated as current migration ledgers.

Absorb all eight locale reviews, converter/codemods, compiled-pack runtime, and in-progress missing-copy remediation. Not release-ready: translations and audit/test migration remain incomplete; bundled size gate currently fails at 5,183,890 bytes.
Keep all nine locales synchronous and preserve uncompressed downloadable pack bytes. Bundle analysis versus e70b7ba: baseline 4,828,946; raw port 5,204,369; compact port 4,423,994 bytes. Focused catalogue/presentation tests pass. Full acceptance and translations remain pending.
@callumalpass callumalpass changed the title WIP: port plugin translations to Lingui and shared i18n kit Port Obsidian plugin UI to shared Lingui kit Oct 23, 2026
@callumalpass callumalpass mentioned this pull request Oct 24, 2026
@callumalpass
callumalpass changed the base branch from feat/downloadable-language-packs to main October 26, 2026 09:45
@callumalpass
callumalpass marked this pull request as ready for review October 26, 2026 09:45
@callumalpass
callumalpass merged commit 6ae88e9 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