From 3e83373258b27846781118249daae075be3312ee Mon Sep 17 00:00:00 2001 From: Jeroen Schweitzer Date: Thu, 18 Jun 2026 09:56:25 +0200 Subject: [PATCH] fix(i18n): close theme-picker + diff catalog gaps (T-463) theme-picker referenced section.appearance + toggle.highContrast with no catalog entries (silently fell to the placeholder); add both. builtin.diff contributes a localized tab but shipped no catalog file at all; create it with tab.title. Both namespaces now resolve from the catalog. Co-Authored-By: Claude Opus 4.8 (1M context) --- .pql/changelog/ticket_history/2026-06.sql | 1 + .pql/changelog/tickets/2026-06.sql | 10 ++++++++++ lib/kernel/src/i18n/catalog/builtin.diff_en_us.json | 3 +++ .../src/i18n/catalog/builtin.theme-picker_en_us.json | 4 +++- 4 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 lib/kernel/src/i18n/catalog/builtin.diff_en_us.json diff --git a/.pql/changelog/ticket_history/2026-06.sql b/.pql/changelog/ticket_history/2026-06.sql index 014ed8a7..c05c493b 100644 --- a/.pql/changelog/ticket_history/2026-06.sql +++ b/.pql/changelog/ticket_history/2026-06.sql @@ -5933,3 +5933,4 @@ INSERT INTO ticket_history (ticket_record_id, field, old_value, new_value, chang INSERT INTO ticket_history (ticket_record_id, field, old_value, new_value, changed_by, changed_at, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FDA0TPYSWEM10RP0Q76XAP58', 'status', 'backlog', 'ready', NULL, '2026-06-18 07:40:45', '2026-06-18 07:40:45.691', '2026-06-18 07:40:45.691', NULL, '8cc60761398868f5b9117db824f8651b', 2) ON CONFLICT(hash) DO NOTHING; INSERT INTO ticket_history (ticket_record_id, field, old_value, new_value, changed_by, changed_at, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FDA0TPYSWEM10RP0Q76XAP58', 'status', 'ready', 'in_progress', NULL, '2026-06-18 07:46:07', '2026-06-18 07:46:07.612', '2026-06-18 07:46:07.612', NULL, 'e8e84ffd0634306f2dc612d1d03152b4', 2) ON CONFLICT(hash) DO NOTHING; INSERT INTO ticket_history (ticket_record_id, field, old_value, new_value, changed_by, changed_at, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FDA0VPB99NGS4J6Z5B2RJM2M', 'status', 'backlog', 'in_progress', NULL, '2026-06-18 07:46:07', '2026-06-18 07:46:07.636', '2026-06-18 07:46:07.636', NULL, 'e9e9c6719b8a49a39309bf8268eeee55', 2) ON CONFLICT(hash) DO NOTHING; +INSERT INTO ticket_history (ticket_record_id, field, old_value, new_value, changed_by, changed_at, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FDA0VPB99NGS4J6Z5B2RJM2M', 'status', 'in_progress', 'done', NULL, '2026-06-18 07:56:10', '2026-06-18 07:56:10.133', '2026-06-18 07:56:10.133', NULL, '666602e799384337b8631789be144e53', 2) ON CONFLICT(hash) DO NOTHING; diff --git a/.pql/changelog/tickets/2026-06.sql b/.pql/changelog/tickets/2026-06.sql index cf056a45..6172774c 100644 --- a/.pql/changelog/tickets/2026-06.sql +++ b/.pql/changelog/tickets/2026-06.sql @@ -7286,3 +7286,13 @@ INSERT INTO tickets (record_id, type, parent_record_id, title, description, stat 2) builtin.diff contributes a TabContribution with titleKey ''tab.title'' + i18nNamespace ''builtin.diff'' (lib/builtin/diff/src/extension.dart) but ships NO catalog file. There is no lib/kernel/src/i18n/catalog/builtin.diff_en_us.json. Create it with tab.title (= ''Diff'', matching the placeholder). Acceptance: both theme-picker keys resolve from the catalog (not the placeholder); a builtin.diff catalog exists with tab.title; no ''missing key'' i18n warnings on boot for these namespaces.', 'in_progress', 'high', NULL, NULL, 'D-21', '2026-06-17 09:57:14.458', '2026-06-18 07:46:07.636', NULL, 'a950ae3e425a624a39254264c6f2cb5e', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash); +INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FDA0VPB99NGS4J6Z5B2RJM2M', 'task', '06FDA0TPYSWEM10RP0Q76XAP58', 'i18n: fix concrete catalog gaps (theme-picker missing keys + diff has no catalog)', 'Two confirmed catalog-behind-code gaps found in the June 2026 audit. Small, isolated fix — do this first. + +1) builtin.theme-picker requests two keys that are NOT in lib/kernel/src/i18n/catalog/builtin.theme-picker_en_us.json, so they silently fall through to the inline placeholder: + - section.appearance (lib/builtin/theme_picker/src/settings_view.dart:75) + - toggle.highContrast (lib/builtin/theme_picker/src/settings_view.dart:83) + Add both keys with their current placeholder text as the translation. + +2) builtin.diff contributes a TabContribution with titleKey ''tab.title'' + i18nNamespace ''builtin.diff'' (lib/builtin/diff/src/extension.dart) but ships NO catalog file. There is no lib/kernel/src/i18n/catalog/builtin.diff_en_us.json. Create it with tab.title (= ''Diff'', matching the placeholder). + +Acceptance: both theme-picker keys resolve from the catalog (not the placeholder); a builtin.diff catalog exists with tab.title; no ''missing key'' i18n warnings on boot for these namespaces.', 'done', 'high', NULL, NULL, 'D-21', '2026-06-17 09:57:14.458', '2026-06-18 07:56:10.133', NULL, '2d182b7c0f40848dc5a59771b73e4da1', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash); diff --git a/lib/kernel/src/i18n/catalog/builtin.diff_en_us.json b/lib/kernel/src/i18n/catalog/builtin.diff_en_us.json new file mode 100644 index 00000000..8315a1ef --- /dev/null +++ b/lib/kernel/src/i18n/catalog/builtin.diff_en_us.json @@ -0,0 +1,3 @@ +{ + "tab.title": { "translation": "Diff" } +} diff --git a/lib/kernel/src/i18n/catalog/builtin.theme-picker_en_us.json b/lib/kernel/src/i18n/catalog/builtin.theme-picker_en_us.json index 80572214..b78437de 100644 --- a/lib/kernel/src/i18n/catalog/builtin.theme-picker_en_us.json +++ b/lib/kernel/src/i18n/catalog/builtin.theme-picker_en_us.json @@ -3,5 +3,7 @@ "modal.title": { "translation": "Select theme" }, "modal.cancel": { "translation": "Cancel" }, "modal.cancel.hint": { "translation": "Close the theme picker without changing the current theme" }, - "row.select.hint": { "translation": "Activate this theme" } + "row.select.hint": { "translation": "Activate this theme" }, + "section.appearance": { "translation": "Appearance" }, + "toggle.highContrast": { "translation": "High contrast" } }