From 6cd0a8b73cebca9e6b8b03f865900635387af044 Mon Sep 17 00:00:00 2001 From: Doxa Maps Date: Fri, 2 Oct 2026 17:22:33 +0000 Subject: [PATCH] Localize Bless India plugin UI in all 11 locales + RTL The plugin's own page chrome (title, intro, buttons, stats, notes) was English in every locale, and in RTL shells its full stops jumped to the start. Add the page strings to blessIndiaPosters.json x11, look them up from the reader's locale (profile-config from the shells; ?lang / on the standalone leaf), set dir=rtl for ar/he/fa/ur, and format counts via the locale. Verified: ar leaf draws dir=rtl with the Arabic title; en draws dir=ltr. --- .../i18n/locales/ar/blessIndiaPosters.json | 10 +++- .../i18n/locales/de/blessIndiaPosters.json | 10 +++- .../i18n/locales/en/blessIndiaPosters.json | 10 +++- .../i18n/locales/es/blessIndiaPosters.json | 10 +++- .../i18n/locales/fr/blessIndiaPosters.json | 10 +++- .../i18n/locales/hi/blessIndiaPosters.json | 10 +++- .../i18n/locales/it/blessIndiaPosters.json | 10 +++- .../i18n/locales/pt/blessIndiaPosters.json | 10 +++- .../i18n/locales/ro/blessIndiaPosters.json | 10 +++- .../i18n/locales/ru/blessIndiaPosters.json | 10 +++- .../i18n/locales/zh/blessIndiaPosters.json | 10 +++- .../bless-india-posters.vue | 48 ++++++++++++------- 12 files changed, 129 insertions(+), 29 deletions(-) diff --git a/library/i18n/locales/ar/blessIndiaPosters.json b/library/i18n/locales/ar/blessIndiaPosters.json index 9f43bc12e..8d561b382 100644 --- a/library/i18n/locales/ar/blessIndiaPosters.json +++ b/library/i18n/locales/ar/blessIndiaPosters.json @@ -2,5 +2,13 @@ "title": "ملصقات باركوا الهند", "rangeBadge60x96": "شارات النطاق · 60×96 (5×8 قدم)", "count": "{count} مجموعة شعبية", - "desktopOnly": "سطح المكتب فقط حاليًا — لم يَثبُت بعد أن هذا الملصق الكبير يُطبع بأمان على الهاتف." + "desktopOnly": "سطح المكتب فقط حاليًا — لم يَثبُت بعد أن هذا الملصق الكبير يُطبع بأمان على الهاتف.", + "experimental": "تجريبي", + "intro": "كل مجموعة شعبية في الهند على ورقة واحدة قابلة للطباعة، تُولَّد مباشرةً وتُعرَض كأوراقها القابلة للطباعة مع شرائط اللصق — بالطريقة نفسها التي يعرض بها عرض المقاسات التنسيقات الكبيرة.", + "print": "اطبع هذا الملصق", + "attempt": "شارات النطاق · 60×96 (5×8 قدم) · 3 أوراق", + "stat": "{groups} مجموعة · {badges} شارة نطاق · 0 تداخل", + "generating": "جارٍ توليد الملصق من البيانات الحية…", + "error": "تعذَّر توليد الملصق: {msg}", + "photos": "فقط {real} من {total} مجموعة في الهند لديها صورة في البيانات؛ المستند المطبوع يحملها، بينما الصورة المسطحة لا تستطيع. هذا التصميم المرقَّم يطبع الأسماء بدون صور لتكون كل مجموعة متساوية وواضحة." } diff --git a/library/i18n/locales/de/blessIndiaPosters.json b/library/i18n/locales/de/blessIndiaPosters.json index f081f89d9..2694041a5 100644 --- a/library/i18n/locales/de/blessIndiaPosters.json +++ b/library/i18n/locales/de/blessIndiaPosters.json @@ -2,5 +2,13 @@ "title": "„Segne Indien“-Poster", "rangeBadge60x96": "Nummern-Marken · 60×96 (5×8 Fuß)", "count": "{count} Volksgruppen", - "desktopOnly": "Vorerst nur am Desktop — es ist noch nicht erwiesen, dass dieses große Poster sicher auf einem Telefon druckt." + "desktopOnly": "Vorerst nur am Desktop — es ist noch nicht erwiesen, dass dieses große Poster sicher auf einem Telefon druckt.", + "experimental": "experimentell", + "intro": "Jede Volksgruppe Indiens auf einem druckbaren Bogen, live erzeugt und als ihre druckbaren Bögen mit Klebestreifen gezeigt — so wie die Größen-Ansicht von Poster Design die großen Formate zeigt.", + "print": "Dieses Poster drucken", + "attempt": "Nummern-Marken · 60×96 (5×8 Fuß) · 3 Bögen", + "stat": "{groups} Gruppen · {badges} Nummern-Marken · 0 Überlappungen", + "generating": "Poster wird aus den Live-Daten erzeugt…", + "error": "Poster konnte nicht erzeugt werden: {msg}", + "photos": "Nur {real} von {total} indischen Gruppen haben ein Foto in den Daten; ein gedrucktes Dokument trägt sie, ein flaches Bild nicht. Dieses nummerierte Design druckt Namen ohne Fotos, damit jede Gruppe gleich und lesbar ist." } diff --git a/library/i18n/locales/en/blessIndiaPosters.json b/library/i18n/locales/en/blessIndiaPosters.json index fc99767fa..5f06673e8 100644 --- a/library/i18n/locales/en/blessIndiaPosters.json +++ b/library/i18n/locales/en/blessIndiaPosters.json @@ -2,5 +2,13 @@ "title": "Bless India Posters", "rangeBadge60x96": "Range badges · 60×96 (5×8 ft)", "count": "{count} people groups", - "desktopOnly": "Desktop only for now — this large poster isn’t yet proven to print safely on a phone." + "desktopOnly": "Desktop only for now — this large poster isn’t yet proven to print safely on a phone.", + "experimental": "experimental", + "intro": "Every India people group on one printable sheet, generated live and shown as its printable sheets with glue strips — the way Poster Design's Sizes view shows the big formats.", + "print": "Print this poster", + "attempt": "Range badges · 60×96 (5×8 ft) · 3 sheets", + "stat": "{groups} groups · {badges} range badges · 0 overlaps", + "generating": "Generating the poster from the live data…", + "error": "Couldn't generate the poster: {msg}", + "photos": "Only {real} of {total} India groups have a photo in the data; a printed document carries them, a flat image can't. This numbered design prints names without photos so every group is equal and legible." } diff --git a/library/i18n/locales/es/blessIndiaPosters.json b/library/i18n/locales/es/blessIndiaPosters.json index ff4aab3ed..a8ebb9e68 100644 --- a/library/i18n/locales/es/blessIndiaPosters.json +++ b/library/i18n/locales/es/blessIndiaPosters.json @@ -2,5 +2,13 @@ "title": "Pósteres «Bendice a la India»", "rangeBadge60x96": "Insignias numeradas · 60×96 (5×8 pies)", "count": "{count} grupos de población", - "desktopOnly": "Solo escritorio por ahora: aún no se ha comprobado que este póster grande se imprima de forma segura en un teléfono." + "desktopOnly": "Solo escritorio por ahora: aún no se ha comprobado que este póster grande se imprima de forma segura en un teléfono.", + "experimental": "experimental", + "intro": "Cada grupo de población de la India en una sola hoja imprimible, generada en vivo y mostrada como sus hojas imprimibles con las tiras de pegado, igual que la vista Tamaños de Poster Design muestra los formatos grandes.", + "print": "Imprimir este póster", + "attempt": "Insignias numeradas · 60×96 (5×8 pies) · 3 hojas", + "stat": "{groups} grupos · {badges} insignias numeradas · 0 solapamientos", + "generating": "Generando el póster a partir de los datos en vivo…", + "error": "No se pudo generar el póster: {msg}", + "photos": "Solo {real} de {total} grupos de la India tienen foto en los datos; un documento impreso las lleva, una imagen plana no. Este diseño numerado imprime los nombres sin fotos para que cada grupo sea igual y legible." } diff --git a/library/i18n/locales/fr/blessIndiaPosters.json b/library/i18n/locales/fr/blessIndiaPosters.json index c81bdedce..dde51349d 100644 --- a/library/i18n/locales/fr/blessIndiaPosters.json +++ b/library/i18n/locales/fr/blessIndiaPosters.json @@ -2,5 +2,13 @@ "title": "Affiches « Bénis l’Inde »", "rangeBadge60x96": "Badges de numéros · 60×96 (5×8 pi)", "count": "{count} groupes de population", - "desktopOnly": "Ordinateur uniquement pour l’instant — il n’est pas encore prouvé que cette grande affiche s’imprime correctement sur un téléphone." + "desktopOnly": "Ordinateur uniquement pour l’instant — il n’est pas encore prouvé que cette grande affiche s’imprime correctement sur un téléphone.", + "experimental": "expérimental", + "intro": "Chaque groupe de population de l'Inde sur une seule feuille imprimable, générée en direct et montrée comme ses feuilles imprimables avec les bandes de collage — comme la vue Tailles de Poster Design montre les grands formats.", + "print": "Imprimer cette affiche", + "attempt": "Badges de numéros · 60×96 (5×8 pi) · 3 feuilles", + "stat": "{groups} groupes · {badges} badges de numéros · 0 chevauchement", + "generating": "Génération de l'affiche à partir des données en direct…", + "error": "Impossible de générer l'affiche : {msg}", + "photos": "Seulement {real} des {total} groupes de l'Inde ont une photo dans les données ; un document imprimé les porte, une image plate non. Ce modèle numéroté imprime les noms sans photos pour que chaque groupe soit égal et lisible." } diff --git a/library/i18n/locales/hi/blessIndiaPosters.json b/library/i18n/locales/hi/blessIndiaPosters.json index 0255c1fcf..f18c7b6db 100644 --- a/library/i18n/locales/hi/blessIndiaPosters.json +++ b/library/i18n/locales/hi/blessIndiaPosters.json @@ -2,5 +2,13 @@ "title": "भारत को आशीष दें — पोस्टर", "rangeBadge60x96": "क्रमांकित बैज · 60×96 (5×8 फुट)", "count": "{count} लोग समूह", - "desktopOnly": "अभी केवल डेस्कटॉप — यह बड़ा पोस्टर अभी फ़ोन पर सुरक्षित रूप से प्रिंट होना सिद्ध नहीं हुआ है।" + "desktopOnly": "अभी केवल डेस्कटॉप — यह बड़ा पोस्टर अभी फ़ोन पर सुरक्षित रूप से प्रिंट होना सिद्ध नहीं हुआ है।", + "experimental": "प्रायोगिक", + "intro": "भारत का हर लोग-समूह एक ही प्रिंट-योग्य शीट पर, लाइव डेटा से बनाया गया और गोंद-पट्टियों के साथ अपनी प्रिंट-योग्य शीटों के रूप में दिखाया गया — जैसे Poster Design का Sizes व्यू बड़े फ़ॉर्मैट दिखाता है।", + "print": "यह पोस्टर प्रिंट करें", + "attempt": "रेंज बैज · 60×96 (5×8 फुट) · 3 शीट", + "stat": "{groups} समूह · {badges} रेंज बैज · 0 ओवरलैप", + "generating": "लाइव डेटा से पोस्टर बनाया जा रहा है…", + "error": "पोस्टर नहीं बन सका: {msg}", + "photos": "डेटा में {total} में से केवल {real} भारतीय समूहों के पास फ़ोटो है; मुद्रित दस्तावेज़ उन्हें ले जाता है, सपाट छवि नहीं। यह क्रमांकित डिज़ाइन बिना फ़ोटो के नाम छापता है ताकि हर समूह समान और सुपाठ्य हो।" } diff --git a/library/i18n/locales/it/blessIndiaPosters.json b/library/i18n/locales/it/blessIndiaPosters.json index 379b8dbf1..9ab674538 100644 --- a/library/i18n/locales/it/blessIndiaPosters.json +++ b/library/i18n/locales/it/blessIndiaPosters.json @@ -2,5 +2,13 @@ "title": "Poster «Benedici l’India»", "rangeBadge60x96": "Badge numerati · 60×96 (5×8 ft)", "count": "{count} gruppi di popolazione", - "desktopOnly": "Solo desktop per ora — non è ancora dimostrato che questo grande poster si stampi in sicurezza su un telefono." + "desktopOnly": "Solo desktop per ora — non è ancora dimostrato che questo grande poster si stampi in sicurezza su un telefono.", + "experimental": "sperimentale", + "intro": "Ogni gruppo di popolazione dell'India su un unico foglio stampabile, generato dal vivo e mostrato come i suoi fogli stampabili con le strisce di colla — come la vista Dimensioni di Poster Design mostra i grandi formati.", + "print": "Stampa questo poster", + "attempt": "Badge numerati · 60×96 (5×8 ft) · 3 fogli", + "stat": "{groups} gruppi · {badges} badge numerati · 0 sovrapposizioni", + "generating": "Generazione del poster dai dati dal vivo…", + "error": "Impossibile generare il poster: {msg}", + "photos": "Solo {real} di {total} gruppi dell'India hanno una foto nei dati; un documento stampato le porta, un'immagine piatta no. Questo design numerato stampa i nomi senza foto così ogni gruppo è uguale e leggibile." } diff --git a/library/i18n/locales/pt/blessIndiaPosters.json b/library/i18n/locales/pt/blessIndiaPosters.json index d351a1c28..2a574ff8d 100644 --- a/library/i18n/locales/pt/blessIndiaPosters.json +++ b/library/i18n/locales/pt/blessIndiaPosters.json @@ -2,5 +2,13 @@ "title": "Pôsteres «Abençoe a Índia»", "rangeBadge60x96": "Emblemas numerados · 60×96 (5×8 pés)", "count": "{count} grupos populacionais", - "desktopOnly": "Apenas no computador por enquanto — ainda não se comprovou que este pôster grande imprime com segurança num telemóvel." + "desktopOnly": "Apenas no computador por enquanto — ainda não se comprovou que este pôster grande imprime com segurança num telemóvel.", + "experimental": "experimental", + "intro": "Cada grupo populacional da Índia numa única folha imprimível, gerada ao vivo e mostrada como as suas folhas imprimíveis com as tiras de cola — como a vista Tamanhos do Poster Design mostra os formatos grandes.", + "print": "Imprimir este pôster", + "attempt": "Emblemas numerados · 60×96 (5×8 pés) · 3 folhas", + "stat": "{groups} grupos · {badges} emblemas numerados · 0 sobreposições", + "generating": "A gerar o pôster a partir dos dados ao vivo…", + "error": "Não foi possível gerar o pôster: {msg}", + "photos": "Apenas {real} de {total} grupos da Índia têm foto nos dados; um documento impresso leva-as, uma imagem plana não. Este design numerado imprime os nomes sem fotos para que cada grupo seja igual e legível." } diff --git a/library/i18n/locales/ro/blessIndiaPosters.json b/library/i18n/locales/ro/blessIndiaPosters.json index 10aa0220e..1560da610 100644 --- a/library/i18n/locales/ro/blessIndiaPosters.json +++ b/library/i18n/locales/ro/blessIndiaPosters.json @@ -2,5 +2,13 @@ "title": "Postere „Binecuvântează India”", "rangeBadge60x96": "Insigne numerotate · 60×96 (5×8 ft)", "count": "{count} grupuri de popoare", - "desktopOnly": "Doar pe desktop deocamdată — nu s-a dovedit încă că acest poster mare se tipărește în siguranță pe un telefon." + "desktopOnly": "Doar pe desktop deocamdată — nu s-a dovedit încă că acest poster mare se tipărește în siguranță pe un telefon.", + "experimental": "experimental", + "intro": "Fiecare grup de popoare din India pe o singură coală imprimabilă, generată live și afișată ca foile sale imprimabile cu benzile de lipici — așa cum vizualizarea Dimensiuni din Poster Design arată formatele mari.", + "print": "Imprimă acest poster", + "attempt": "Insigne numerotate · 60×96 (5×8 ft) · 3 foi", + "stat": "{groups} grupuri · {badges} insigne numerotate · 0 suprapuneri", + "generating": "Se generează posterul din datele live…", + "error": "Nu s-a putut genera posterul: {msg}", + "photos": "Doar {real} din {total} grupuri din India au o fotografie în date; un document tipărit le poartă, o imagine plană nu. Acest design numerotat tipărește numele fără fotografii, astfel încât fiecare grup să fie egal și lizibil." } diff --git a/library/i18n/locales/ru/blessIndiaPosters.json b/library/i18n/locales/ru/blessIndiaPosters.json index 2bd836c01..24ef9ce2d 100644 --- a/library/i18n/locales/ru/blessIndiaPosters.json +++ b/library/i18n/locales/ru/blessIndiaPosters.json @@ -2,5 +2,13 @@ "title": "Плакаты «Благослови Индию»", "rangeBadge60x96": "Номерные значки · 60×96 (5×8 футов)", "count": "{count} народностей", - "desktopOnly": "Пока только на компьютере — ещё не доказано, что этот большой плакат безопасно печатается на телефоне." + "desktopOnly": "Пока только на компьютере — ещё не доказано, что этот большой плакат безопасно печатается на телефоне.", + "experimental": "экспериментально", + "intro": "Каждая народность Индии на одном печатном листе, создаётся вживую и показывается как её печатные листы с полосами склейки — так же, как представление «Размеры» в Poster Design показывает большие форматы.", + "print": "Напечатать этот плакат", + "attempt": "Номерные значки · 60×96 (5×8 футов) · 3 листа", + "stat": "{groups} народностей · {badges} номерных значков · 0 наложений", + "generating": "Плакат создаётся по «живым» данным…", + "error": "Не удалось создать плакат: {msg}", + "photos": "Только у {real} из {total} народностей Индии есть фото в данных; печатный документ несёт их, плоское изображение — нет. Этот нумерованный дизайн печатает имена без фото, чтобы каждая народность была равной и читаемой." } diff --git a/library/i18n/locales/zh/blessIndiaPosters.json b/library/i18n/locales/zh/blessIndiaPosters.json index dbf09cefd..9a670dfdf 100644 --- a/library/i18n/locales/zh/blessIndiaPosters.json +++ b/library/i18n/locales/zh/blessIndiaPosters.json @@ -2,5 +2,13 @@ "title": "祝福印度海报", "rangeBadge60x96": "编号标记 · 60×96(5×8 英尺)", "count": "{count} 个族群", - "desktopOnly": "目前仅限桌面——尚未证明这张大海报能在手机上安全打印。" + "desktopOnly": "目前仅限桌面——尚未证明这张大海报能在手机上安全打印。", + "experimental": "实验性", + "intro": "印度的每个族群都在一张可打印的大纸上,由实时数据生成,并像其可打印的分页那样带着拼接胶条显示——就像 Poster Design 的尺寸视图展示大幅面那样。", + "print": "打印此海报", + "attempt": "编号标记 · 60×96(5×8 英尺)· 3 张", + "stat": "{groups} 个族群 · {badges} 个编号标记 · 0 重叠", + "generating": "正在根据实时数据生成海报……", + "error": "无法生成海报:{msg}", + "photos": "数据中 {total} 个印度族群中只有 {real} 个有照片;打印文档能承载它们,而平面图像不能。此编号设计打印名称而不带照片,使每个族群平等且清晰易读。" } diff --git a/plugin-designs/bless-india-posters/bless-india-posters.vue b/plugin-designs/bless-india-posters/bless-india-posters.vue index 55754ab6b..4315e1536 100644 --- a/plugin-designs/bless-india-posters/bless-india-posters.vue +++ b/plugin-designs/bless-india-posters/bless-india-posters.vue @@ -16,32 +16,29 @@ onto letter would be shrunk). --> @@ -92,11 +85,30 @@ const parsedConfig = (() => { try { return JSON.parse(c) } catch { return {} } })() +// Lightweight i18n for the plugin's OWN page chrome, so Arabic readers read Arabic (not English with +// misplaced RTL punctuation). Reads the locale the shells pass (profileConfig.locale/lang), loads the +// blessIndiaPosters.json for that language (English fallback), and sets dir for RTL scripts. Counts go +// through the locale's number format. The POSTER's blessing header/footer is the separate footer work. +const LOCALE_MSGS = import.meta.glob('../../library/i18n/locales/*/blessIndiaPosters.json', { eager: true }) +const msgPath = (l) => `../../library/i18n/locales/${l}/blessIndiaPosters.json` +const urlLang = (() => { try { return new URLSearchParams(location.search).get('lang') || '' } catch { return '' } })() +const docLang = (() => { try { return document.documentElement.lang || '' } catch { return '' } })() +const lang = String(parsedConfig.locale || parsedConfig.lang || urlLang || docLang || 'en').split('-')[0].toLowerCase() +const EN = (LOCALE_MSGS[msgPath('en')] || {}).default || {} +const MSGS = (LOCALE_MSGS[msgPath(lang)] || {}).default || EN +const dir = ['ar', 'he', 'fa', 'ur', 'ps', 'sd', 'yi'].includes(lang) ? 'rtl' : 'ltr' +const nf = (() => { try { return new Intl.NumberFormat(lang) } catch { return new Intl.NumberFormat('en') } })() +const n = (x) => nf.format(Number(x) || 0) +const t = (key, vars) => { + let s = (MSGS[key] != null ? MSGS[key] : EN[key] != null ? EN[key] : key) + if (vars) for (const [k, v] of Object.entries(vars)) s = String(s).split(`{${k}}`).join(v) + return s +} + const SHEETS = POSTER_LADDER['60x96'].sheets // { sheetW:60, sheetH:36, count:3, direction, joinIn:6 } const seriesDef = (seriesJson && seriesJson.country) || {} const isPhone = typeof window !== 'undefined' && window.matchMedia && window.matchMedia('(max-width: 767px)').matches -const phoneLimitMsg = 'Desktop only for now — this large poster isn’t yet proven to print safely on a phone.' const busy = ref(true) const error = ref('')