From 62c739f57d26e5ef30ddfebaabbb871976355b1e Mon Sep 17 00:00:00 2001 From: Doxa Maps Date: Fri, 2 Oct 2026 13:27:54 +0000 Subject: [PATCH 01/11] Country Posters lists its poster in Poster Design: country-poster.letter (letter, phone-friendly), titled by the Country Posters tab label --- .../country-posters/country-poster-wall.meta.json | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/plugin-designs/country-posters/country-poster-wall.meta.json b/plugin-designs/country-posters/country-poster-wall.meta.json index 94a3b2e0a..1067f1bf0 100644 --- a/plugin-designs/country-posters/country-poster-wall.meta.json +++ b/plugin-designs/country-posters/country-poster-wall.meta.json @@ -1,5 +1,12 @@ { "type": "single", "label": "Country Posters — poster wall", - "note": "The printable poster wall pane of the Country Posters element (country-posters-mfe composes it); also embeddable alone. profile-config `countries` (ISO-3 list or {code,name,count} records) or `region` (a WAGF region label) shows only those, flat, under a host's own region heading (DX Life's /regions, 2026-09-30); without them the wall is unchanged." + "note": "The printable poster wall pane of the Country Posters element (country-posters-mfe composes it); also embeddable alone. profile-config `countries` (ISO-3 list or {code,name,count} records) or `region` (a WAGF region label) shows only those, flat, under a host's own region heading (DX Life's /regions, 2026-09-30); without them the wall is unchanged.", + "posterDesign": { + "family": "countryPoster", + "name": "country-poster.letter", + "size": "letter", + "mobileFriendly": true, + "labelKey": "tabs.countryPosters" + } } From 2759ff493edf8a81f1575c2b49aed3ff25f3a870 Mon Sep 17 00:00:00 2001 From: Doxa Maps Date: Fri, 2 Oct 2026 13:28:27 +0000 Subject: [PATCH 02/11] UPG-100: its territory posters in the Poster Design catalogue poster-wall.meta.json declares the poster designs this plugin makes, one block each (family upgList): - upg100-territory-poster.letter: the home-printer print (the sheet is generated at the click). mobileFriendly: true. - upg100-territory-poster.3x3 and upg100-territory-poster.3x4: the large-format downloads. mobileFriendly: false (not measured on a phone, so not claimed). The card title is upgMap.posterDesignTerritory, "UPG-100 territory poster", in all 11 locales. It uses the word the plugin already uses for a territory in each language. --- library/i18n/locales/ar/upgMap.json | 3 ++- library/i18n/locales/de/upgMap.json | 3 ++- library/i18n/locales/en/upgMap.json | 3 ++- library/i18n/locales/es/upgMap.json | 3 ++- library/i18n/locales/fr/upgMap.json | 3 ++- library/i18n/locales/hi/upgMap.json | 3 ++- library/i18n/locales/it/upgMap.json | 3 ++- library/i18n/locales/pt/upgMap.json | 3 ++- library/i18n/locales/ro/upgMap.json | 3 ++- library/i18n/locales/ru/upgMap.json | 3 ++- library/i18n/locales/zh/upgMap.json | 3 ++- .../my-upg-100-list/poster-wall.meta.json | 25 ++++++++++++++++++- 12 files changed, 46 insertions(+), 12 deletions(-) diff --git a/library/i18n/locales/ar/upgMap.json b/library/i18n/locales/ar/upgMap.json index bd9d8e2f5..47124c03d 100644 --- a/library/i18n/locales/ar/upgMap.json +++ b/library/i18n/locales/ar/upgMap.json @@ -19,5 +19,6 @@ "displayName": "ملصقات قائمة UPG 100", "wallHeading": "ملصقات قائمة UPG 100", "wallIntroA": "كيف تُطعم جمعًا من خمسة آلاف؟ أجلسهم يسوع جماعاتٍ من خمسين ومن مئة، فصار المستحيل قابلًا للمشاركة (لوقا ٩:١٤). فعلنا المثل مع {n} شعوب غير مبلَّغة: ٢٧ قائمة من نحو خمسين إلى مئة. تُطبع كل قائمة حزمةَ صلاة وملصقًا، ليحمل ٢٧ تلميذًا أو كنيسة أو قائدًا محليًا كلٌّ واحدة — مصلّين لأجلهم ", - "peopleStillLoading": "لا تزال الشعوب قيد التحميل، حاول مرة أخرى بعد لحظة" + "peopleStillLoading": "لا تزال الشعوب قيد التحميل، حاول مرة أخرى بعد لحظة", + "posterDesignTerritory": "ملصق منطقة UPG-100" } diff --git a/library/i18n/locales/de/upgMap.json b/library/i18n/locales/de/upgMap.json index 795efa24d..8413be719 100644 --- a/library/i18n/locales/de/upgMap.json +++ b/library/i18n/locales/de/upgMap.json @@ -19,5 +19,6 @@ "displayName": "Poster der UPG 100 Liste", "wallHeading": "Poster der UPG 100 Liste", "wallIntroA": "Wie würden Sie eine Menge von fünftausend speisen? Jesus ließ sie in Gruppen zu fünfzig und hundert lagern, und das Unmögliche wurde teilbar (Lukas 9,14). Dasselbe haben wir mit den {n} unerreichten Volksgruppen getan: 27 Listen von etwa fünfzig bis hundert. Jede Liste druckt als Gebetspaket und als Poster, damit 27 Jünger, Gemeinden oder einheimische Leiter je eine tragen können — und für sie beten ", - "peopleStillLoading": "die Volksgruppen werden noch geladen; versuchen Sie es gleich noch einmal" + "peopleStillLoading": "die Volksgruppen werden noch geladen; versuchen Sie es gleich noch einmal", + "posterDesignTerritory": "UPG-100-Gebietsplakat" } diff --git a/library/i18n/locales/en/upgMap.json b/library/i18n/locales/en/upgMap.json index 122cc67ae..cc9ffc168 100644 --- a/library/i18n/locales/en/upgMap.json +++ b/library/i18n/locales/en/upgMap.json @@ -19,5 +19,6 @@ "displayName": "UPG 100 List Posters", "wallHeading": "UPG 100 List Posters", "wallIntroA": "How would you feed a crowd of five thousand? Jesus sat them down in groups of fifty and a hundred, and the impossible became shareable (Luke 9:14). We did the same with the {n} unreached people groups: 27 lists of about fifty to a hundred. Each list prints as a prayer packet and a poster, so 27 disciples, churches or local leaders can each carry one — praying for them ", - "peopleStillLoading": "the people groups are still loading, try again in a moment" + "peopleStillLoading": "the people groups are still loading, try again in a moment", + "posterDesignTerritory": "UPG-100 territory poster" } diff --git a/library/i18n/locales/es/upgMap.json b/library/i18n/locales/es/upgMap.json index 396a3580f..e845af5b5 100644 --- a/library/i18n/locales/es/upgMap.json +++ b/library/i18n/locales/es/upgMap.json @@ -19,5 +19,6 @@ "displayName": "Carteles de la lista UPG 100", "wallHeading": "Carteles de la lista UPG 100", "wallIntroA": "¿Cómo alimentarías a una multitud de cinco mil? Jesús los sentó en grupos de cincuenta y de cien, y lo imposible se volvió compartible (Lucas 9:14). Hicimos lo mismo con los {n} pueblos no alcanzados: 27 listas de unos cincuenta a cien. Cada lista se imprime como paquete de oración y cartel, para que 27 discípulos, iglesias o líderes locales lleven una cada uno — orando por ellos ", - "peopleStillLoading": "los pueblos aún se están cargando; inténtalo de nuevo en un momento" + "peopleStillLoading": "los pueblos aún se están cargando; inténtalo de nuevo en un momento", + "posterDesignTerritory": "Cartel de territorio UPG-100" } diff --git a/library/i18n/locales/fr/upgMap.json b/library/i18n/locales/fr/upgMap.json index ffc650bfa..a69dfe9fa 100644 --- a/library/i18n/locales/fr/upgMap.json +++ b/library/i18n/locales/fr/upgMap.json @@ -19,5 +19,6 @@ "displayName": "Affiches de la liste UPG 100", "wallHeading": "Affiches de la liste UPG 100", "wallIntroA": "Comment nourririez-vous une foule de cinq mille personnes ? Jésus les a fait asseoir par groupes de cinquante et de cent, et l’impossible est devenu partageable (Luc 9.14). Nous avons fait de même avec les {n} peuples non atteints : 27 listes d’environ cinquante à cent. Chaque liste s’imprime en dossier de prière et en affiche, pour que 27 disciples, Églises ou responsables locaux en portent chacun une — en priant pour eux ", - "peopleStillLoading": "les peuples sont encore en cours de chargement ; réessayez dans un instant" + "peopleStillLoading": "les peuples sont encore en cours de chargement ; réessayez dans un instant", + "posterDesignTerritory": "Affiche de territoire UPG-100" } diff --git a/library/i18n/locales/hi/upgMap.json b/library/i18n/locales/hi/upgMap.json index 3931d5993..ccddb139e 100644 --- a/library/i18n/locales/hi/upgMap.json +++ b/library/i18n/locales/hi/upgMap.json @@ -19,5 +19,6 @@ "displayName": "UPG 100 सूची पोस्टर", "wallHeading": "UPG 100 सूची पोस्टर", "wallIntroA": "पाँच हज़ार की भीड़ को आप कैसे खिलाते? यीशु ने उन्हें पचास-पचास और सौ-सौ के समूहों में बिठाया, और असंभव बाँटने योग्य हो गया (लूका 9:14). हमने {n} अनपहुँचे जनसमूहों के साथ वही किया: लगभग पचास से सौ तक की 27 सूचियाँ. हर सूची प्रार्थना पैकेट और पोस्टर के रूप में छपती है, ताकि 27 शिष्य, कलीसियाएँ या स्थानीय अगुवे एक-एक ले सकें — उनके लिए प्रार्थना करते हुए ", - "peopleStillLoading": "जनसमूह अभी लोड हो रहे हैं, थोड़ी देर में फिर कोशिश करें" + "peopleStillLoading": "जनसमूह अभी लोड हो रहे हैं, थोड़ी देर में फिर कोशिश करें", + "posterDesignTerritory": "UPG-100 क्षेत्र पोस्टर" } diff --git a/library/i18n/locales/it/upgMap.json b/library/i18n/locales/it/upgMap.json index 3035b23be..2c5c84da9 100644 --- a/library/i18n/locales/it/upgMap.json +++ b/library/i18n/locales/it/upgMap.json @@ -19,5 +19,6 @@ "displayName": "Poster della lista UPG 100", "wallHeading": "Poster della lista UPG 100", "wallIntroA": "Come sfameresti una folla di cinquemila? Gesù li fece sedere a gruppi di cinquanta e di cento, e l’impossibile divenne condivisibile (Luca 9:14). Abbiamo fatto lo stesso con i {n} popoli non raggiunti: 27 liste di circa cinquanta-cento. Ogni lista si stampa come pacchetto di preghiera e manifesto, così 27 discepoli, chiese o responsabili locali ne portano una ciascuno — pregando per loro ", - "peopleStillLoading": "i popoli si stanno ancora caricando; riprova tra un momento" + "peopleStillLoading": "i popoli si stanno ancora caricando; riprova tra un momento", + "posterDesignTerritory": "Manifesto di territorio UPG-100" } diff --git a/library/i18n/locales/pt/upgMap.json b/library/i18n/locales/pt/upgMap.json index e7b76a6fc..2bf0729cf 100644 --- a/library/i18n/locales/pt/upgMap.json +++ b/library/i18n/locales/pt/upgMap.json @@ -19,5 +19,6 @@ "displayName": "Cartazes da lista UPG 100", "wallHeading": "Cartazes da lista UPG 100", "wallIntroA": "Como você alimentaria uma multidão de cinco mil? Jesus os sentou em grupos de cinquenta e de cem, e o impossível tornou-se compartilhável (Lucas 9.14). Fizemos o mesmo com os {n} povos não alcançados: 27 listas de cerca de cinquenta a cem. Cada lista imprime como pacote de oração e cartaz, para que 27 discípulos, igrejas ou líderes locais levem uma cada um — orando por eles ", - "peopleStillLoading": "os povos ainda estão carregando; tente de novo em um instante" + "peopleStillLoading": "os povos ainda estão carregando; tente de novo em um instante", + "posterDesignTerritory": "Cartaz de território UPG-100" } diff --git a/library/i18n/locales/ro/upgMap.json b/library/i18n/locales/ro/upgMap.json index abc4c3769..d8f27b18c 100644 --- a/library/i18n/locales/ro/upgMap.json +++ b/library/i18n/locales/ro/upgMap.json @@ -19,5 +19,6 @@ "displayName": "Afișe din lista UPG 100", "wallHeading": "Afișe din lista UPG 100", "wallIntroA": "Cum ai hrăni o mulțime de cinci mii? Isus i-a așezat în grupuri de cincizeci și de o sută, iar imposibilul a devenit împărțibil (Luca 9:14). Am făcut la fel cu cele {n} popoare neatinse: 27 de liste de aproximativ cincizeci până la o sută. Fiecare listă se tipărește ca pachet de rugăciune și afiș, ca 27 de ucenici, biserici sau lideri locali să poarte fiecare câte una — rugându-se pentru ei ", - "peopleStillLoading": "popoarele încă se încarcă; încearcă din nou peste o clipă" + "peopleStillLoading": "popoarele încă se încarcă; încearcă din nou peste o clipă", + "posterDesignTerritory": "Afiș de teritoriu UPG-100" } diff --git a/library/i18n/locales/ru/upgMap.json b/library/i18n/locales/ru/upgMap.json index 204aa90bc..974f5bade 100644 --- a/library/i18n/locales/ru/upgMap.json +++ b/library/i18n/locales/ru/upgMap.json @@ -19,5 +19,6 @@ "displayName": "Плакаты списка UPG 100", "wallHeading": "Плакаты списка UPG 100", "wallIntroA": "Как накормить толпу в пять тысяч человек? Иисус рассадил их группами по пятьдесят и по сто, и невозможное стало посильным (Лк. 9:14). Мы поступили так же с {n} неохваченными народами: 27 списков примерно по пятьдесят-сто. Каждый список печатается как молитвенный пакет и плакат, чтобы 27 учеников, церквей или местных служителей взяли по одному — молясь о них ", - "peopleStillLoading": "народы ещё загружаются; попробуйте ещё раз через мгновение" + "peopleStillLoading": "народы ещё загружаются; попробуйте ещё раз через мгновение", + "posterDesignTerritory": "Плакат территории UPG-100" } diff --git a/library/i18n/locales/zh/upgMap.json b/library/i18n/locales/zh/upgMap.json index 2be7bdaae..bcf7b625f 100644 --- a/library/i18n/locales/zh/upgMap.json +++ b/library/i18n/locales/zh/upgMap.json @@ -19,5 +19,6 @@ "displayName": "UPG 100 名单海报", "wallHeading": "UPG 100 名单海报", "wallIntroA": "你会怎样喂饱五千人的群众?耶稣让他们一排五十、一排一百地坐下,不可能的事就变得可以分担了(路加福音 9:14)。我们对 {n} 个未得之民做了同样的事:27 份名单,每份约五十到一百。每份名单都能印成祷告手册和海报,让 27 位门徒、教会或当地领袖各领一份 — 为他们祷告 ", - "peopleStillLoading": "族群仍在加载中,请稍后再试" + "peopleStillLoading": "族群仍在加载中,请稍后再试", + "posterDesignTerritory": "UPG-100 区域海报" } diff --git a/plugin-designs/my-upg-100-list/poster-wall.meta.json b/plugin-designs/my-upg-100-list/poster-wall.meta.json index efe09b883..3a7cd740f 100644 --- a/plugin-designs/my-upg-100-list/poster-wall.meta.json +++ b/plugin-designs/my-upg-100-list/poster-wall.meta.json @@ -1,4 +1,27 @@ { "_comment": "The printable half of UPG-100: a wall of prayer-card posters, one per 100-list entry, with the three print paths. Declared so the Studio rail names it rather than falling back to a humanized id (check:studio-rail).", - "label": "UPG 100 List Posters — Poster Wall" + "label": "UPG 100 List Posters — Poster Wall", + "posterDesign": [ + { + "family": "upgList", + "name": "upg100-territory-poster.letter", + "size": "letter", + "mobileFriendly": true, + "labelKey": "upgMap.posterDesignTerritory" + }, + { + "family": "upgList", + "name": "upg100-territory-poster.3x3", + "size": "3x3", + "mobileFriendly": false, + "labelKey": "upgMap.posterDesignTerritory" + }, + { + "family": "upgList", + "name": "upg100-territory-poster.3x4", + "size": "3x4", + "mobileFriendly": false, + "labelKey": "upgMap.posterDesignTerritory" + } + ] } From aa2a65051e47198c1724c6ea96a2456477879306 Mon Sep 17 00:00:00 2001 From: Doxa Maps Date: Fri, 2 Oct 2026 13:29:52 +0000 Subject: [PATCH 03/11] Wall of People Groups: its three Bless posters are listed in Poster Design The profile's meta.json declares one posterDesign block per poster the Wall prints, so they show under Poster Design, Styles, From other plugins: wall.bless-36x48 (3 x 4 ft), wall.bless-24x36 (2 x 3 ft) and wall.bless-60x96 (5 x 8 ft, three glued sheets). Family wall, not mobile-friendly (the Wall is desktop only), titled by the existing wall.blessBanner key (all 11 locales). check:poster-design-catalogue: PASS, 3 valid blocks, 3 new ledger names; its self-test PASS; i18n-keys-exist PASS. --- .../wall-of-people-groups/wall-of-people-groups.meta.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/plugin-designs/wall-of-people-groups/wall-of-people-groups.meta.json b/plugin-designs/wall-of-people-groups/wall-of-people-groups.meta.json index 20afbaf64..a9dca957a 100644 --- a/plugin-designs/wall-of-people-groups/wall-of-people-groups.meta.json +++ b/plugin-designs/wall-of-people-groups/wall-of-people-groups.meta.json @@ -5,5 +5,10 @@ "note": "Monolithic composite (capability 3): ONE root .vue nests the zoomable d3 wall, its cards, and the prayer and comments dialogs. index.js registers exactly ONE tag (wall-of-people-groups); none of the inner components is independently embeddable.", "config": { "pinHint": false - } + }, + "posterDesign": [ + {"family": "wall", "name": "wall.bless-36x48", "size": "36x48", "mobileFriendly": false, "labelKey": "wall.blessBanner"}, + {"family": "wall", "name": "wall.bless-24x36", "size": "24x36", "mobileFriendly": false, "labelKey": "wall.blessBanner"}, + {"family": "wall", "name": "wall.bless-60x96", "size": "60x96", "mobileFriendly": false, "labelKey": "wall.blessBanner"} + ] } From 088b92451aa9c00744d4ee4f847c1a80ff23357c Mon Sep 17 00:00:00 2001 From: Doxa Maps Date: Fri, 2 Oct 2026 13:31:52 +0000 Subject: [PATCH 04/11] Bible Posters: register its poster design in the Poster Design catalogue MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add a posterDesign block to bible-posters.meta.json (family biblePoster, name bible-poster.36x60, size 36x60, mobileFriendly false — a whole-book poster is a large-format print) and a biblePosters.posterDesign.label key in all 11 locales, so the Bible Posters design appears as a reference card in Poster Design. --- library/i18n/locales/ar/biblePosters.json | 3 +++ library/i18n/locales/de/biblePosters.json | 3 +++ library/i18n/locales/en/biblePosters.json | 3 +++ library/i18n/locales/es/biblePosters.json | 3 +++ library/i18n/locales/fr/biblePosters.json | 3 +++ library/i18n/locales/hi/biblePosters.json | 3 +++ library/i18n/locales/it/biblePosters.json | 3 +++ library/i18n/locales/pt/biblePosters.json | 3 +++ library/i18n/locales/ro/biblePosters.json | 3 +++ library/i18n/locales/ru/biblePosters.json | 3 +++ library/i18n/locales/zh/biblePosters.json | 3 +++ plugin-designs/bible-posters/bible-posters.meta.json | 9 ++++++++- 12 files changed, 41 insertions(+), 1 deletion(-) diff --git a/library/i18n/locales/ar/biblePosters.json b/library/i18n/locales/ar/biblePosters.json index ea729d9ba..cbaafd680 100644 --- a/library/i18n/locales/ar/biblePosters.json +++ b/library/i18n/locales/ar/biblePosters.json @@ -23,5 +23,8 @@ "1CO": "كورنثوس الأولى", "1PE": "بطرس الأولى", "JOS": "يشوع" + }, + "posterDesign": { + "label": "ملصق سفر من الكتاب المقدس" } } diff --git a/library/i18n/locales/de/biblePosters.json b/library/i18n/locales/de/biblePosters.json index 575b0b3f3..2825f95db 100644 --- a/library/i18n/locales/de/biblePosters.json +++ b/library/i18n/locales/de/biblePosters.json @@ -23,5 +23,8 @@ "1CO": "1. Korinther", "1PE": "1. Petrus", "JOS": "Josua" + }, + "posterDesign": { + "label": "Bibelbuch-Poster" } } diff --git a/library/i18n/locales/en/biblePosters.json b/library/i18n/locales/en/biblePosters.json index 0d7d5c6af..fa7719bc2 100644 --- a/library/i18n/locales/en/biblePosters.json +++ b/library/i18n/locales/en/biblePosters.json @@ -23,5 +23,8 @@ "1CO": "1 Corinthians", "1PE": "1 Peter", "JOS": "Joshua" + }, + "posterDesign": { + "label": "Bible book poster" } } diff --git a/library/i18n/locales/es/biblePosters.json b/library/i18n/locales/es/biblePosters.json index e63aed324..8eebcdc7f 100644 --- a/library/i18n/locales/es/biblePosters.json +++ b/library/i18n/locales/es/biblePosters.json @@ -23,5 +23,8 @@ "1CO": "1 Corintios", "1PE": "1 Pedro", "JOS": "Josué" + }, + "posterDesign": { + "label": "Cartel de un libro de la Biblia" } } diff --git a/library/i18n/locales/fr/biblePosters.json b/library/i18n/locales/fr/biblePosters.json index dc90054cd..a552e1f71 100644 --- a/library/i18n/locales/fr/biblePosters.json +++ b/library/i18n/locales/fr/biblePosters.json @@ -23,5 +23,8 @@ "1CO": "1 Corinthiens", "1PE": "1 Pierre", "JOS": "Josué" + }, + "posterDesign": { + "label": "Affiche d'un livre de la Bible" } } diff --git a/library/i18n/locales/hi/biblePosters.json b/library/i18n/locales/hi/biblePosters.json index e628bd9f4..e8bb01075 100644 --- a/library/i18n/locales/hi/biblePosters.json +++ b/library/i18n/locales/hi/biblePosters.json @@ -23,5 +23,8 @@ "1CO": "1 कुरिन्थियों", "1PE": "1 पतरस", "JOS": "यहोशू" + }, + "posterDesign": { + "label": "बाइबल पुस्तक पोस्टर" } } diff --git a/library/i18n/locales/it/biblePosters.json b/library/i18n/locales/it/biblePosters.json index 3435b16e9..a8ca49d82 100644 --- a/library/i18n/locales/it/biblePosters.json +++ b/library/i18n/locales/it/biblePosters.json @@ -23,5 +23,8 @@ "1CO": "1 Corinzi", "1PE": "1 Pietro", "JOS": "Giosuè" + }, + "posterDesign": { + "label": "Poster di un libro della Bibbia" } } diff --git a/library/i18n/locales/pt/biblePosters.json b/library/i18n/locales/pt/biblePosters.json index fdb0f3d60..748793864 100644 --- a/library/i18n/locales/pt/biblePosters.json +++ b/library/i18n/locales/pt/biblePosters.json @@ -23,5 +23,8 @@ "1CO": "1 Coríntios", "1PE": "1 Pedro", "JOS": "Josué" + }, + "posterDesign": { + "label": "Cartaz de um livro da Bíblia" } } diff --git a/library/i18n/locales/ro/biblePosters.json b/library/i18n/locales/ro/biblePosters.json index f9923ca81..b29b36b23 100644 --- a/library/i18n/locales/ro/biblePosters.json +++ b/library/i18n/locales/ro/biblePosters.json @@ -23,5 +23,8 @@ "1CO": "1 Corinteni", "1PE": "1 Petru", "JOS": "Iosua" + }, + "posterDesign": { + "label": "Poster cu o carte a Bibliei" } } diff --git a/library/i18n/locales/ru/biblePosters.json b/library/i18n/locales/ru/biblePosters.json index 820196ccc..6288a3645 100644 --- a/library/i18n/locales/ru/biblePosters.json +++ b/library/i18n/locales/ru/biblePosters.json @@ -23,5 +23,8 @@ "1CO": "1 Коринфянам", "1PE": "1 Петра", "JOS": "Иисус Навин" + }, + "posterDesign": { + "label": "Плакат книги Библии" } } diff --git a/library/i18n/locales/zh/biblePosters.json b/library/i18n/locales/zh/biblePosters.json index 1f6f60fe3..9a05bbac4 100644 --- a/library/i18n/locales/zh/biblePosters.json +++ b/library/i18n/locales/zh/biblePosters.json @@ -23,5 +23,8 @@ "1CO": "哥林多前书", "1PE": "彼得前书", "JOS": "约书亚记" + }, + "posterDesign": { + "label": "圣经书卷海报" } } diff --git a/plugin-designs/bible-posters/bible-posters.meta.json b/plugin-designs/bible-posters/bible-posters.meta.json index a59dea557..6b35d9918 100644 --- a/plugin-designs/bible-posters/bible-posters.meta.json +++ b/plugin-designs/bible-posters/bible-posters.meta.json @@ -3,5 +3,12 @@ "type": "single", "label": "Bible Posters", "targets": ["web"], - "note": "A generator that shows an ENTIRE BOOK of the Bible on one poster, in the languages of the top unreached people groups. Text is fetched at render time from the Free Use Bible API (public-domain / openly-licensed only); no Bibles are stored in the repo. Lives in the Posterverse Experimental shelf." + "posterDesign": { + "family": "biblePoster", + "name": "bible-poster.36x60", + "size": "36x60", + "mobileFriendly": false, + "labelKey": "biblePosters.posterDesign.label" + }, + "note": "A generator that shows an ENTIRE BOOK of the Bible on one poster, in the languages of the top unreached people groups. Text is fetched at render time from the Free Use Bible API (public-domain / openly-licensed only); no Bibles are stored in the repo. Lives in the Posterverse Experimental shelf. posterDesign: the whole-book poster is a large-format print (even standard paper is too small for a whole book), so mobileFriendly is false; the card/preview still renders on a phone." } From 58c6bb28af5e57742f09813c18d741195d04a828 Mon Sep 17 00:00:00 2001 From: Doxa Maps Date: Fri, 2 Oct 2026 13:32:19 +0000 Subject: [PATCH 05/11] Poster Design names sizes, and plugins' designs, in the reader's language Styles and Sizes now name every size the one way (src/sizeText.js, shared): templates.js carries each size as data (inches, side lanes, panels, paper), and posterDesign.sizes gains sideLanes, packetPage1, panels and anySize in all 11 locales, so Arabic readers no longer see "5 x 8 ft, side lanes" or "Letter, portrait". A plugin's declared size (a ladder key, letter, a4) is named through the shared ladder. A plugin's design title came from its labelKey, but Poster Design's bundle ships only the catalogue areas its own code names, so a plugin's own area (upgMap, ...) read English. internal/profile-meta.mjs now resolves each block's labelKey in every locale at build time and carries the titles in manifest.json (posterDesignLabels, only beside a posterDesign block), and Styles reads the reader's language from there. --- internal/profile-meta.mjs | 39 +++++++++++++++++-- library/i18n/locales/ar/posterDesign.json | 6 ++- library/i18n/locales/de/posterDesign.json | 6 ++- library/i18n/locales/en/posterDesign.json | 6 ++- library/i18n/locales/es/posterDesign.json | 6 ++- library/i18n/locales/fr/posterDesign.json | 6 ++- library/i18n/locales/hi/posterDesign.json | 6 ++- library/i18n/locales/it/posterDesign.json | 6 ++- library/i18n/locales/pt/posterDesign.json | 6 ++- library/i18n/locales/ro/posterDesign.json | 6 ++- library/i18n/locales/ru/posterDesign.json | 6 ++- library/i18n/locales/zh/posterDesign.json | 6 ++- plugin-designs/poster-design/poster-sizes.vue | 13 ++----- .../poster-design/poster-styles.vue | 21 +++++++--- .../poster-design/src/FullDetailsDialog.vue | 2 +- .../poster-design/src/pluginDesigns.js | 2 + plugin-designs/poster-design/src/sizeText.js | 39 +++++++++++++++++++ plugin-designs/poster-design/src/templates.js | 25 ++++++------ 18 files changed, 165 insertions(+), 42 deletions(-) create mode 100644 plugin-designs/poster-design/src/sizeText.js diff --git a/internal/profile-meta.mjs b/internal/profile-meta.mjs index 3da0f7b94..57e9b2a71 100644 --- a/internal/profile-meta.mjs +++ b/internal/profile-meta.mjs @@ -12,9 +12,42 @@ * posterDesign { family, name, size, mobileFriendly, labelKey?, instance? } or an array of them: the poster * design(s) this profile shows, listed by Poster Design's Styles. Carried as written, ONLY when present * (every other manifest keeps its bytes); check:poster-design-catalogue validates it. + * posterDesignLabels GENERATED beside it: { : { : title } } for every block with a labelKey, + * resolved here from library/i18n/locales//.json. Poster Design's bundle ships only the + * catalogue areas its own code names, so a plugin's own area (upgMap, …) would be missing there and the card + * would read English; carrying the titles in the manifest works for any area, with no Poster Design rebuild. */ -import { readFileSync } from 'node:fs' -import { join } from 'node:path' +import { readFileSync, readdirSync, existsSync } from 'node:fs' +import { join, dirname } from 'node:path' +import { fileURLToPath } from 'node:url' + +const LOCALES = join(dirname(fileURLToPath(import.meta.url)), '..', 'library', 'i18n', 'locales') +// A catalogue key ("area.a.b") in every locale that has it: { en: '…', ar: '…' }; {} when no locale does. +function catalogueTitles(key) { + const [area, ...path] = String(key || '').split('.') + const out = {} + if (!area || !path.length || !existsSync(LOCALES)) return out + for (const loc of readdirSync(LOCALES)) { + const f = join(LOCALES, loc, `${area}.json`) + if (!existsSync(f)) continue + try { + let o = JSON.parse(readFileSync(f, 'utf8')) + for (const p of path) o = o && typeof o === 'object' ? o[p] : undefined + if (typeof o === 'string' && o.trim()) out[loc] = o + } catch { /* a locale file that does not parse names nothing */ } + } + return out +} +function posterDesignLabels(pd) { + const out = {} + for (const b of Array.isArray(pd) ? pd : [pd]) { + if (b && typeof b.name === 'string' && typeof b.labelKey === 'string') { + const titles = catalogueTitles(b.labelKey) + if (Object.keys(titles).length) out[b.name] = titles + } + } + return out +} const CORNERS = ['bottom-right', 'bottom-left', 'top-right', 'top-left'] @@ -82,7 +115,7 @@ export function profileMetaFields(dir, profileName) { const m = readProfileMeta(dir, profileName) // visibility is emitted ONLY when it is "public": absent means team, so every manifest in the // tree today keeps the bytes it has and nothing becomes visible by upgrading the generator. - return { stage: m.stage, ...(m.visibility === 'public' ? { visibility: 'public' } : {}), ...(m.label ? { label: m.label } : {}), ...(m.targets ? { targets: m.targets } : {}), ...(m.heavy ? { heavy: true } : {}), ...(m.widget ? { widget: m.widget } : {}), ...(m.mobile ? { mobile: m.mobile } : {}), ...(m.posterDesign ? { posterDesign: m.posterDesign } : {}) } + return { stage: m.stage, ...(m.visibility === 'public' ? { visibility: 'public' } : {}), ...(m.label ? { label: m.label } : {}), ...(m.targets ? { targets: m.targets } : {}), ...(m.heavy ? { heavy: true } : {}), ...(m.widget ? { widget: m.widget } : {}), ...(m.mobile ? { mobile: m.mobile } : {}), ...(m.posterDesign ? { posterDesign: m.posterDesign } : {}), ...(m.posterDesign && Object.keys(posterDesignLabels(m.posterDesign)).length ? { posterDesignLabels: posterDesignLabels(m.posterDesign) } : {}) } } /** A bundle is production if ANY of its profiles says so. */ diff --git a/library/i18n/locales/ar/posterDesign.json b/library/i18n/locales/ar/posterDesign.json index 284c2d1cc..9b0f3fed2 100644 --- a/library/i18n/locales/ar/posterDesign.json +++ b/library/i18n/locales/ar/posterDesign.json @@ -28,7 +28,11 @@ "no": "لا", "printHome": "أي طابعة منزلية", "printShop": "مطبعة (ملف PDF، صفحة لكل ورقة)", - "layoutNote": "تعرض الأوراق تخطيط ملصق الدولة بمقاس 3 × 3 أقدام في كل مقاس: الترويسة والخريطة والأسماء والجدول وتذييل الآية. سيظهر الملصق المرسوم بكل مقاس في الأنماط عند توفره." + "layoutNote": "تعرض الأوراق تخطيط ملصق الدولة بمقاس 3 × 3 أقدام في كل مقاس: الترويسة والخريطة والأسماء والجدول وتذييل الآية. سيظهر الملصق المرسوم بكل مقاس في الأنماط عند توفره.", + "sideLanes": "{dims}، أعمدة جانبية", + "packetPage1": "{paper} (الصفحة 1 من حزمة الصلاة)", + "panels": "{dims}، عدد الألواح: {n}", + "anySize": "أي حجم من جدول الأحجام المشترك" }, "family": { "mapSheet": "صفحات الخرائط", diff --git a/library/i18n/locales/de/posterDesign.json b/library/i18n/locales/de/posterDesign.json index 20a0879b7..5c07f781e 100644 --- a/library/i18n/locales/de/posterDesign.json +++ b/library/i18n/locales/de/posterDesign.json @@ -28,7 +28,11 @@ "no": "Nein", "printHome": "Jeder Drucker zu Hause", "printShop": "Eine Druckerei (ein PDF, eine Seite pro Bogen)", - "layoutNote": "Die Bögen zeigen das Layout des 3 × 3 ft Länderposters in jeder Größe: Kopfzeile, Karte, Namen, Tabelle und die Fußzeile mit dem Bibelvers. Das in jeder Größe gezeichnete Poster erscheint unter Stile, sobald es verfügbar ist." + "layoutNote": "Die Bögen zeigen das Layout des 3 × 3 ft Länderposters in jeder Größe: Kopfzeile, Karte, Namen, Tabelle und die Fußzeile mit dem Bibelvers. Das in jeder Größe gezeichnete Poster erscheint unter Stile, sobald es verfügbar ist.", + "sideLanes": "{dims}, seitliche Namensspalten", + "packetPage1": "{paper} (Seite 1 der Gebetsmappe)", + "panels": "{dims}, Tafeln: {n}", + "anySize": "Jede Größe aus der gemeinsamen Größentabelle" }, "family": { "mapSheet": "Kartenblätter", diff --git a/library/i18n/locales/en/posterDesign.json b/library/i18n/locales/en/posterDesign.json index b970eaa7e..b37b07769 100644 --- a/library/i18n/locales/en/posterDesign.json +++ b/library/i18n/locales/en/posterDesign.json @@ -28,7 +28,11 @@ "no": "No", "printHome": "Any home printer", "printShop": "A print shop (a PDF, one page per sheet)", - "layoutNote": "The sheets show the layout of the 3 × 3 ft country poster at each size: the header, the map, the names, the table and the scripture footer. The poster drawn at each size appears in Styles as it becomes available." + "layoutNote": "The sheets show the layout of the 3 × 3 ft country poster at each size: the header, the map, the names, the table and the scripture footer. The poster drawn at each size appears in Styles as it becomes available.", + "sideLanes": "{dims}, side lanes", + "packetPage1": "{paper} (packet page 1)", + "panels": "{dims}, {n} panels", + "anySize": "Any size from the shared size table" }, "family": { "mapSheet": "Map sheets", diff --git a/library/i18n/locales/es/posterDesign.json b/library/i18n/locales/es/posterDesign.json index 2edc7e748..57d10b7bd 100644 --- a/library/i18n/locales/es/posterDesign.json +++ b/library/i18n/locales/es/posterDesign.json @@ -28,7 +28,11 @@ "no": "No", "printHome": "Cualquier impresora doméstica", "printShop": "Una imprenta (un PDF, una página por hoja)", - "layoutNote": "Las hojas muestran el diseño del póster de país de 3 × 3 ft en cada tamaño: el encabezado, el mapa, los nombres, la tabla y el pie con la Escritura. El póster dibujado en cada tamaño aparecerá en Estilos a medida que esté disponible." + "layoutNote": "Las hojas muestran el diseño del póster de país de 3 × 3 ft en cada tamaño: el encabezado, el mapa, los nombres, la tabla y el pie con la Escritura. El póster dibujado en cada tamaño aparecerá en Estilos a medida que esté disponible.", + "sideLanes": "{dims}, columnas laterales", + "packetPage1": "{paper} (página 1 del paquete de oración)", + "panels": "{dims}, paneles: {n}", + "anySize": "Cualquier tamaño de la tabla de tamaños compartida" }, "family": { "mapSheet": "Hojas de mapa", diff --git a/library/i18n/locales/fr/posterDesign.json b/library/i18n/locales/fr/posterDesign.json index 79c66a6b8..cfab7c740 100644 --- a/library/i18n/locales/fr/posterDesign.json +++ b/library/i18n/locales/fr/posterDesign.json @@ -28,7 +28,11 @@ "no": "Non", "printHome": "N'importe quelle imprimante", "printShop": "Un imprimeur (un PDF, une page par feuille)", - "layoutNote": "Les feuilles montrent la mise en page de l'affiche pays de 3 × 3 ft à chaque format : l'en-tête, la carte, les noms, le tableau et le pied avec l'Écriture. L'affiche dessinée à chaque format apparaîtra dans Styles dès qu'elle sera disponible." + "layoutNote": "Les feuilles montrent la mise en page de l'affiche pays de 3 × 3 ft à chaque format : l'en-tête, la carte, les noms, le tableau et le pied avec l'Écriture. L'affiche dessinée à chaque format apparaîtra dans Styles dès qu'elle sera disponible.", + "sideLanes": "{dims}, colonnes latérales", + "packetPage1": "{paper} (page 1 du dossier de prière)", + "panels": "{dims}, panneaux : {n}", + "anySize": "Toute taille du tableau de tailles commun" }, "family": { "mapSheet": "Feuilles de carte", diff --git a/library/i18n/locales/hi/posterDesign.json b/library/i18n/locales/hi/posterDesign.json index d17457e22..60b700f86 100644 --- a/library/i18n/locales/hi/posterDesign.json +++ b/library/i18n/locales/hi/posterDesign.json @@ -28,7 +28,11 @@ "no": "नहीं", "printHome": "कोई भी घरेलू प्रिंटर", "printShop": "प्रिंटिंग प्रेस (PDF, हर शीट के लिए एक पेज)", - "layoutNote": "शीटें हर आकार में 3 × 3 फ़ुट देश पोस्टर का लेआउट दिखाती हैं: शीर्षक, मानचित्र, नाम, तालिका और पवित्रशास्त्र वाला फ़ुटर। हर आकार में बना असली पोस्टर उपलब्ध होते ही शैलियाँ में दिखेगा।" + "layoutNote": "शीटें हर आकार में 3 × 3 फ़ुट देश पोस्टर का लेआउट दिखाती हैं: शीर्षक, मानचित्र, नाम, तालिका और पवित्रशास्त्र वाला फ़ुटर। हर आकार में बना असली पोस्टर उपलब्ध होते ही शैलियाँ में दिखेगा।", + "sideLanes": "{dims}, किनारे के कॉलम", + "packetPage1": "{paper} (प्रार्थना पैकेट का पेज 1)", + "panels": "{dims}, पैनल: {n}", + "anySize": "साझा आकार तालिका का कोई भी आकार" }, "family": { "mapSheet": "मानचित्र पृष्ठ", diff --git a/library/i18n/locales/it/posterDesign.json b/library/i18n/locales/it/posterDesign.json index 4aec62b44..8ef668a29 100644 --- a/library/i18n/locales/it/posterDesign.json +++ b/library/i18n/locales/it/posterDesign.json @@ -28,7 +28,11 @@ "no": "No", "printHome": "Qualsiasi stampante di casa", "printShop": "Una tipografia (un PDF, una pagina per foglio)", - "layoutNote": "I fogli mostrano l'impaginazione del poster di paese da 3 × 3 ft in ogni formato: intestazione, mappa, nomi, tabella e il piè di pagina con la Scrittura. Il poster disegnato in ogni formato comparirà in Stili appena disponibile." + "layoutNote": "I fogli mostrano l'impaginazione del poster di paese da 3 × 3 ft in ogni formato: intestazione, mappa, nomi, tabella e il piè di pagina con la Scrittura. Il poster disegnato in ogni formato comparirà in Stili appena disponibile.", + "sideLanes": "{dims}, colonne laterali", + "packetPage1": "{paper} (pagina 1 del fascicolo di preghiera)", + "panels": "{dims}, pannelli: {n}", + "anySize": "Qualsiasi formato dalla tabella dei formati comune" }, "family": { "mapSheet": "Fogli mappa", diff --git a/library/i18n/locales/pt/posterDesign.json b/library/i18n/locales/pt/posterDesign.json index 69af6993a..6cc35a844 100644 --- a/library/i18n/locales/pt/posterDesign.json +++ b/library/i18n/locales/pt/posterDesign.json @@ -28,7 +28,11 @@ "no": "Não", "printHome": "Qualquer impressora doméstica", "printShop": "Uma gráfica (um PDF, uma página por folha)", - "layoutNote": "As folhas mostram o layout do pôster de país de 3 × 3 ft em cada tamanho: o cabeçalho, o mapa, os nomes, a tabela e o rodapé com a Escritura. O pôster desenhado em cada tamanho aparecerá em Estilos quando estiver disponível." + "layoutNote": "As folhas mostram o layout do pôster de país de 3 × 3 ft em cada tamanho: o cabeçalho, o mapa, os nomes, a tabela e o rodapé com a Escritura. O pôster desenhado em cada tamanho aparecerá em Estilos quando estiver disponível.", + "sideLanes": "{dims}, colunas laterais", + "packetPage1": "{paper} (página 1 do pacote de oração)", + "panels": "{dims}, painéis: {n}", + "anySize": "Qualquer tamanho da tabela de tamanhos compartilhada" }, "family": { "mapSheet": "Folhas de mapa", diff --git a/library/i18n/locales/ro/posterDesign.json b/library/i18n/locales/ro/posterDesign.json index 86183bb77..e49d992a4 100644 --- a/library/i18n/locales/ro/posterDesign.json +++ b/library/i18n/locales/ro/posterDesign.json @@ -28,7 +28,11 @@ "no": "Nu", "printHome": "Orice imprimantă de acasă", "printShop": "O tipografie (un PDF, o pagină pe coală)", - "layoutNote": "Colile arată machetarea afișului de țară de 3 × 3 ft la fiecare dimensiune: antetul, harta, numele, tabelul și subsolul cu versetul din Scriptură. Afișul desenat la fiecare dimensiune va apărea în Stiluri când va fi disponibil." + "layoutNote": "Colile arată machetarea afișului de țară de 3 × 3 ft la fiecare dimensiune: antetul, harta, numele, tabelul și subsolul cu versetul din Scriptură. Afișul desenat la fiecare dimensiune va apărea în Stiluri când va fi disponibil.", + "sideLanes": "{dims}, coloane laterale", + "packetPage1": "{paper} (pagina 1 a pachetului de rugăciune)", + "panels": "{dims}, panouri: {n}", + "anySize": "Orice dimensiune din tabelul comun de dimensiuni" }, "family": { "mapSheet": "Foi de hartă", diff --git a/library/i18n/locales/ru/posterDesign.json b/library/i18n/locales/ru/posterDesign.json index d5f05a992..9ef47bbe0 100644 --- a/library/i18n/locales/ru/posterDesign.json +++ b/library/i18n/locales/ru/posterDesign.json @@ -28,7 +28,11 @@ "no": "Нет", "printHome": "Любой домашний принтер", "printShop": "Типография (PDF, одна страница на лист)", - "layoutNote": "На листах показан макет плаката страны 3 × 3 фута в каждом размере: заголовок, карта, названия, таблица и нижняя полоса со стихом из Писания. Плакат, нарисованный в каждом размере, появится в разделе «Стили», когда будет готов." + "layoutNote": "На листах показан макет плаката страны 3 × 3 фута в каждом размере: заголовок, карта, названия, таблица и нижняя полоса со стихом из Писания. Плакат, нарисованный в каждом размере, появится в разделе «Стили», когда будет готов.", + "sideLanes": "{dims}, боковые колонки", + "packetPage1": "{paper} (страница 1 молитвенного пакета)", + "panels": "{dims}, панелей: {n}", + "anySize": "Любой размер из общей таблицы размеров" }, "family": { "mapSheet": "Листы карт", diff --git a/library/i18n/locales/zh/posterDesign.json b/library/i18n/locales/zh/posterDesign.json index f54ea4e85..242396f13 100644 --- a/library/i18n/locales/zh/posterDesign.json +++ b/library/i18n/locales/zh/posterDesign.json @@ -28,7 +28,11 @@ "no": "否", "printHome": "任何家用打印机", "printShop": "印刷店(PDF,每张纸一页)", - "layoutNote": "纸张显示的是 3 × 3 英尺国家海报在各尺寸下的版式:标题、地图、名称、表格和经文页脚。各尺寸实际绘制的海报完成后会出现在“样式”中。" + "layoutNote": "纸张显示的是 3 × 3 英尺国家海报在各尺寸下的版式:标题、地图、名称、表格和经文页脚。各尺寸实际绘制的海报完成后会出现在“样式”中。", + "sideLanes": "{dims},两侧名单栏", + "packetPage1": "{paper}(祷告资料包第 1 页)", + "panels": "{dims},展板数:{n}", + "anySize": "共享尺寸表中的任意尺寸" }, "family": { "mapSheet": "地图页", diff --git a/plugin-designs/poster-design/poster-sizes.vue b/plugin-designs/poster-design/poster-sizes.vue index ec2c674b2..19f031522 100644 --- a/plugin-designs/poster-design/poster-sizes.vue +++ b/plugin-designs/poster-design/poster-sizes.vue @@ -20,19 +20,14 @@ import { POSTER_LADDER, POSTER_LADDER_ORDER, paperFor } from '@map/constants/pos import { useOptionalT, useOptionalI18n } from '@map/composables/useOptionalT.js' import { useShadowStyles } from '@map/composables/useShadowStyles.js' import { layoutSvgUrl } from './src/layoutSvg.js' +import { num, dimsText } from './src/sizeText.js' const t = useOptionalT('') const { locale } = useOptionalI18n('') -// A number as the sizes are spoken: whole, or one decimal place (5.5). -const n = (x) => (Number.isInteger(x) ? String(x) : String(Math.round(x * 10) / 10)) -// Feet once a side reaches a yard and both sides are whole or half feet (3 × 5.5 ft); inches below that (18 × 24 in). -function dims(w, h) { - const ft = (x) => x / 12 - const halfFeet = (x) => Number.isInteger(ft(x) * 2) - if (Math.min(w, h) >= 36 && halfFeet(w) && halfFeet(h)) return t('posterDesign.sizes.dimsFt', { w: n(ft(w)), h: n(ft(h)) }) - return t('posterDesign.sizes.dimsIn', { w: n(w), h: n(h) }) -} +// Sizes are named the one way Poster Design names them (src/sizeText.js, shared with Styles). +const n = num +const dims = (w, h) => dimsText(w, h, t) // Standard printer paper is Letter or A4 by the reader's region, as the print picker decides it. const paperIsA4 = computed(() => { const l = locale && (locale.value ?? locale) diff --git a/plugin-designs/poster-design/poster-styles.vue b/plugin-designs/poster-design/poster-styles.vue index 217031190..1fe3febbe 100644 --- a/plugin-designs/poster-design/poster-styles.vue +++ b/plugin-designs/poster-design/poster-styles.vue @@ -32,6 +32,7 @@ import { resolvePosterSize } from '@map/constants/posterSizes.js' import { listConfigurations, FAMILY_KEYS, SAMPLE_COUNTRY_ID } from './src/templates.js' import FullDetailsDialog from './src/FullDetailsDialog.vue' import { loadPluginDesigns } from './src/pluginDesigns.js' +import { sizeText, declaredSizeText } from './src/sizeText.js' const profileConfig = inject('profileConfig', ref(null)) const instanceId = computed(() => profileConfig.value?.instanceId || 'poster-design-styles') @@ -49,7 +50,7 @@ function stockLabel(s) { const dims = `${s.w} × ${s.h} in` return s.side ? `${noun} ${dims} (${t('wall.stockLandscape')})` : `${noun} ${dims}` } -const labelOf = (c) => (c.stock ? `${t(c.labelKey)}: ${stockLabel(c.stock)}` : `${t(c.labelKey)}: ${c.size}`) +const labelOf = (c) => (c.stock ? `${t(c.labelKey)}: ${stockLabel(c.stock)}` : `${t(c.labelKey)}: ${sizeText(c.size, t)}`) // Designs other plugins declare (their meta's posterDesign, via manifest.json): the built tree's manifest, or the dev // server's. A name already in templates.js stays the library's (the check refuses the clash; the page never doubles it). @@ -60,9 +61,17 @@ onMounted(async () => { const { designs } = await loadPluginDesigns(urls) pluginDesigns.value = designs.filter((d) => !byName.has(d.name)) }) -const pluginLabel = (d) => { +// The design's title in the reader's language: the build's per-locale titles (posterDesignLabels; any catalogue +// area), then this bundle's own catalogue, then English, then the profile's label. +const pluginTitle = (d) => { + const lang = String(getRuntimeLocale() || detectLocale() || 'en').split('-')[0] + if (d.titles && d.titles[lang]) return d.titles[lang] const v = d.labelKey ? t(d.labelKey) : '' - return `${v && v !== d.labelKey ? v : d.label}: ${d.size}` + if (v && v !== d.labelKey) return v + return (d.titles && d.titles.en) || d.label +} +const pluginLabel = (d) => { + return `${pluginTitle(d)}: ${declaredSizeText(d.size, t)}` } // No `count`: these are templates, not lists of people, so the sticker reads "Show full details" alone. @@ -175,15 +184,15 @@ async function sheet(item) { // ── "Show full details" ─────────────────────────────────────────────────────────────────────── const open = ref(null) -const openLabel = computed(() => (!open.value ? '' : open.value.design ? pluginLabel(open.value.design) : labelOf(open.value))) +const openLabel = computed(() => (!open.value ? '' : open.value.design ? pluginLabel(open.value.design) : labelOf(byName.get(open.value.name)))) // A plugin's design opens in the same dialog, as a configuration: its renderer is the plugin's page, and the dialog // shows that page live. function showDetails(item) { const d = byPluginName.value.get(item.id) open.value = d - ? { name: d.name, size: d.size, settings: { family: d.family, mobileFriendly: d.mobileFriendly, ...(d.instance ? { preset: d.instance } : {}) }, + ? { name: d.name, size: declaredSizeText(d.size, t), settings: { family: d.family, mobileFriendly: d.mobileFriendly, ...(d.instance ? { preset: d.instance } : {}) }, renderer: `plugin-designs/${d.bundle}/${d.profile}.vue`, pageUrl: d.pageUrl, design: d } - : byName.get(item.id) || null + : byName.has(item.id) ? { ...byName.get(item.id), size: sizeText(byName.get(item.id).size, t) } : null } const heading = computed(() => t('posterDesign.styles.heading')) diff --git a/plugin-designs/poster-design/src/FullDetailsDialog.vue b/plugin-designs/poster-design/src/FullDetailsDialog.vue index 06d73ab3a..cdf6d3e42 100644 --- a/plugin-designs/poster-design/src/FullDetailsDialog.vue +++ b/plugin-designs/poster-design/src/FullDetailsDialog.vue @@ -63,7 +63,7 @@ async function copyName() {
{{ config.name }}
{{ t('posterDesign.details.size') }}
-
{{ config.size }} · {{ config.px[0] }} × {{ config.px[1] }} px
+
{{ config.size }} · {{ ltr(`${config.px[0]} × ${config.px[1]} px`) }}