From 087b0053506cc2447c67c005f3cd9a42284e5eb3 Mon Sep 17 00:00:00 2001 From: Doxa Maps Date: Sat, 26 Sep 2026 18:24:53 +0000 Subject: [PATCH] Big Picture: the live count speaks, and the locale reaches the children MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit rega, row 47 at 52eeb0db. Two findings, both mine, and the first is the smaller and more certain of the two. "2107 shown" STAYED ENGLISH IN BOTH CHANNELS, because it was never a lookup: BpResearchHeader rendered the count and then the bare word. It reads the catalogue now, with the English wording kept exactly as it was — "{n} shown" — per the standing rule that translating existing wording is not a product decision. Eleven locales. THE CHILDREN WERE HANDED ONLY THE LIST. big-picture built its children's profile-config from `list` alone, so the one documented channel a partner has for asking a nested element to speak Arabic arrived empty of any locale. setRuntimeLocale covers everything that reads tStatic, which is why the headline and much of the chrome were already correct through both channels; it does not cover a child that reads its own profile-config. Threading the locale is what ProfileLoader would have done had one existed beneath this composite — and the reason none does is the (C) failure mode this element is the last example of: a composite that BAKES its children in has no loader under it, so it must do that job itself. ★ THIS IS ONE IDENTIFIED GAP, NOT A CLAIM TO HAVE CLOSED THE MEASURED ONE. check:host-locale-contract reports 402 against 888 for this leaf, and 31 Arabic text nodes against 79. I can see that the children were given no locale and that giving it to them is correct regardless; I cannot see from here how much of that difference it accounts for, and I am not going to assert a number I have not measured. The gate is a browser gate and rega owns the re-run. Source only. STUDIO: needs a rebuild of big-picture. --- library/i18n/locales/ar/dashboard.json | 3 ++- library/i18n/locales/de/dashboard.json | 3 ++- library/i18n/locales/en/dashboard.json | 3 ++- library/i18n/locales/es/dashboard.json | 3 ++- library/i18n/locales/fr/dashboard.json | 3 ++- library/i18n/locales/hi/dashboard.json | 3 ++- library/i18n/locales/it/dashboard.json | 3 ++- library/i18n/locales/pt/dashboard.json | 3 ++- library/i18n/locales/ro/dashboard.json | 3 ++- library/i18n/locales/ru/dashboard.json | 3 ++- library/i18n/locales/zh/dashboard.json | 3 ++- plugin-designs/big-picture/big-picture.vue | 18 +++++++++++++++++- .../src/components/BpResearchHeader.vue | 2 +- 13 files changed, 40 insertions(+), 13 deletions(-) diff --git a/library/i18n/locales/ar/dashboard.json b/library/i18n/locales/ar/dashboard.json index edd0999c2..f1b3459d0 100644 --- a/library/i18n/locales/ar/dashboard.json +++ b/library/i18n/locales/ar/dashboard.json @@ -76,5 +76,6 @@ "people_committed": "الأشخاص الملتزمون", "people_praying": "الأشخاص المصلّون", "selected_first": "المحدَّدة أولاً", - "selected_first_hint": "رفع الشعوب المحدَّدة إلى الأعلى مع الإبقاء على ترتيب الأعمدة" + "selected_first_hint": "رفع الشعوب المحدَّدة إلى الأعلى مع الإبقاء على ترتيب الأعمدة", + "n_shown": "{n} معروض" } diff --git a/library/i18n/locales/de/dashboard.json b/library/i18n/locales/de/dashboard.json index 71265b477..42c446f13 100644 --- a/library/i18n/locales/de/dashboard.json +++ b/library/i18n/locales/de/dashboard.json @@ -76,5 +76,6 @@ "people_committed": "Verbindlich zugesagte Personen", "people_praying": "Betende Personen", "selected_first": "Ausgewählte zuerst", - "selected_first_hint": "Die ausgewählten Volksgruppen nach oben holen, die Spaltensortierung bleibt erhalten" + "selected_first_hint": "Die ausgewählten Volksgruppen nach oben holen, die Spaltensortierung bleibt erhalten", + "n_shown": "{n} angezeigt" } diff --git a/library/i18n/locales/en/dashboard.json b/library/i18n/locales/en/dashboard.json index e606331ad..5c14c0a65 100644 --- a/library/i18n/locales/en/dashboard.json +++ b/library/i18n/locales/en/dashboard.json @@ -76,5 +76,6 @@ "people_committed": "People committed", "people_praying": "People praying", "selected_first": "Selected first", - "selected_first_hint": "Float the selected people groups to the top, keeping your column sort" + "selected_first_hint": "Float the selected people groups to the top, keeping your column sort", + "n_shown": "{n} shown" } diff --git a/library/i18n/locales/es/dashboard.json b/library/i18n/locales/es/dashboard.json index 1ff973162..0e62f7edd 100644 --- a/library/i18n/locales/es/dashboard.json +++ b/library/i18n/locales/es/dashboard.json @@ -76,5 +76,6 @@ "people_committed": "Personas comprometidas", "people_praying": "Personas que oran", "selected_first": "Los seleccionados primero", - "selected_first_hint": "Llevar arriba los grupos de personas seleccionados, manteniendo el orden de las columnas" + "selected_first_hint": "Llevar arriba los grupos de personas seleccionados, manteniendo el orden de las columnas", + "n_shown": "{n} mostrados" } diff --git a/library/i18n/locales/fr/dashboard.json b/library/i18n/locales/fr/dashboard.json index 3258a0b77..cb69c14be 100644 --- a/library/i18n/locales/fr/dashboard.json +++ b/library/i18n/locales/fr/dashboard.json @@ -76,5 +76,6 @@ "people_committed": "Personnes engagées", "people_praying": "Personnes qui prient", "selected_first": "La sélection en premier", - "selected_first_hint": "Faire remonter les groupes de personnes sélectionnés, en conservant le tri des colonnes" + "selected_first_hint": "Faire remonter les groupes de personnes sélectionnés, en conservant le tri des colonnes", + "n_shown": "{n} affichés" } diff --git a/library/i18n/locales/hi/dashboard.json b/library/i18n/locales/hi/dashboard.json index 3b364d1bc..9ab951d37 100644 --- a/library/i18n/locales/hi/dashboard.json +++ b/library/i18n/locales/hi/dashboard.json @@ -76,5 +76,6 @@ "people_committed": "प्रतिबद्ध लोग", "people_praying": "प्रार्थना करने वाले लोग", "selected_first": "चयनित पहले", - "selected_first_hint": "चयनित जनसमूहों को ऊपर लाएँ, आपका कॉलम क्रम बनाए रखते हुए" + "selected_first_hint": "चयनित जनसमूहों को ऊपर लाएँ, आपका कॉलम क्रम बनाए रखते हुए", + "n_shown": "{n} दिखाए गए" } diff --git a/library/i18n/locales/it/dashboard.json b/library/i18n/locales/it/dashboard.json index 6d419ba50..38962bbe7 100644 --- a/library/i18n/locales/it/dashboard.json +++ b/library/i18n/locales/it/dashboard.json @@ -76,5 +76,6 @@ "people_committed": "Persone impegnate", "people_praying": "Persone che pregano", "selected_first": "Prima i selezionati", - "selected_first_hint": "Porta in alto i gruppi di persone selezionati, mantenendo l’ordinamento delle colonne" + "selected_first_hint": "Porta in alto i gruppi di persone selezionati, mantenendo l’ordinamento delle colonne", + "n_shown": "{n} mostrati" } diff --git a/library/i18n/locales/pt/dashboard.json b/library/i18n/locales/pt/dashboard.json index 645a833a5..58e608c35 100644 --- a/library/i18n/locales/pt/dashboard.json +++ b/library/i18n/locales/pt/dashboard.json @@ -76,5 +76,6 @@ "people_committed": "Pessoas comprometidas", "people_praying": "Pessoas a orar", "selected_first": "Os selecionados primeiro", - "selected_first_hint": "Trazer para cima os grupos de pessoas selecionados, mantendo a ordenação das colunas" + "selected_first_hint": "Trazer para cima os grupos de pessoas selecionados, mantendo a ordenação das colunas", + "n_shown": "{n} apresentados" } diff --git a/library/i18n/locales/ro/dashboard.json b/library/i18n/locales/ro/dashboard.json index d823f4e01..67edd6723 100644 --- a/library/i18n/locales/ro/dashboard.json +++ b/library/i18n/locales/ro/dashboard.json @@ -76,5 +76,6 @@ "people_committed": "Persoane angajate", "people_praying": "Persoane care se roagă", "selected_first": "Cele selectate primele", - "selected_first_hint": "Ridică grupurile de oameni selectate în partea de sus, păstrând sortarea coloanelor" + "selected_first_hint": "Ridică grupurile de oameni selectate în partea de sus, păstrând sortarea coloanelor", + "n_shown": "{n} afișate" } diff --git a/library/i18n/locales/ru/dashboard.json b/library/i18n/locales/ru/dashboard.json index 39f01f844..851688878 100644 --- a/library/i18n/locales/ru/dashboard.json +++ b/library/i18n/locales/ru/dashboard.json @@ -76,5 +76,6 @@ "people_committed": "Взявшие обязательство", "people_praying": "Молящиеся", "selected_first": "Выбранные сначала", - "selected_first_hint": "Поднять выбранные народы наверх, сохранив сортировку столбцов" + "selected_first_hint": "Поднять выбранные народы наверх, сохранив сортировку столбцов", + "n_shown": "{n} показано" } diff --git a/library/i18n/locales/zh/dashboard.json b/library/i18n/locales/zh/dashboard.json index 36f9583e9..17727a3c8 100644 --- a/library/i18n/locales/zh/dashboard.json +++ b/library/i18n/locales/zh/dashboard.json @@ -76,5 +76,6 @@ "people_committed": "已承诺的人数", "people_praying": "祷告的人数", "selected_first": "所选优先", - "selected_first_hint": "将所选民族置顶,同时保留您的列排序" + "selected_first_hint": "将所选民族置顶,同时保留您的列排序", + "n_shown": "显示 {n} 个" } diff --git a/plugin-designs/big-picture/big-picture.vue b/plugin-designs/big-picture/big-picture.vue index a3fb020d5..669ce5b89 100644 --- a/plugin-designs/big-picture/big-picture.vue +++ b/plugin-designs/big-picture/big-picture.vue @@ -112,7 +112,23 @@ watch(textDir, reflectDir) // The host's people-group LIST (library/lists/), handed to both children as the only key of their // profile-config, so nothing else about them changes. Absent = the default list. -const listConfig = computed(() => (config.value.list ? JSON.stringify({ list: config.value.list }) : '')) +// ★ THE LOCALE TRAVELS WITH THE LIST (rega, row 47: big-picture rendered 31 Arabic text nodes +// through profile-config against 79 through ?lang=, and check:host-locale-contract measured 402 +// against 888). This handed each child ONLY the list, so the one documented channel a partner has +// for asking a nested element to speak Arabic — its profile-config — arrived empty of any locale. +// setRuntimeLocale above covers everything that reads tStatic, which is why the headline and much +// of the chrome were already right; it does not cover a child that reads its own profile-config. +// Threading it costs nothing and is what ProfileLoader would have done had one existed beneath this +// composite, which is exactly the (C) failure mode: a composite that BAKES its children in has no +// ProfileLoader under it, so it must do that job itself. +// This is ONE identified gap, not a claim to have closed the whole 402/888 difference; rega +// re-measures. +const listConfig = computed(() => { + const cfg = {} + if (config.value.list) cfg.list = config.value.list + if (hostLang.value) cfg.lang = hostLang.value + return Object.keys(cfg).length ? JSON.stringify(cfg) : '' +}) const prayBaseUrl = computed(() => config.value.prayBaseUrl || '') const languageCode = computed(() => config.value.languageCode || '') diff --git a/plugin-designs/big-picture/src/components/BpResearchHeader.vue b/plugin-designs/big-picture/src/components/BpResearchHeader.vue index 9d43f9fc4..66d246cbe 100644 --- a/plugin-designs/big-picture/src/components/BpResearchHeader.vue +++ b/plugin-designs/big-picture/src/components/BpResearchHeader.vue @@ -161,7 +161,7 @@ onMounted(loadOptions) class="rh-count" role="status" aria-live="polite" - >{{ count }} shown + >{{ (L('n_shown', '') || tStatic('dashboard.n_shown') || '{n} shown').replace('{n}', count) }}