From 71826baa3d3065fcad9070b701440ea6140361ab Mon Sep 17 00:00:00 2001 From: Doxa Maps Date: Sun, 27 Sep 2026 01:56:58 +0000 Subject: [PATCH] PPLR maps: the toolbars, legends, pills, popups and pin card follow the reader's language The chrome around the maps was typed-in English: the search placeholder, Base map and Data sources, the legend titles, each view's header pill, the popup row labels, the pin card and the Rosetta legend. 42 keys in all eleven catalogues, reusing the product's own words for Legend, Close, Choose a view, Religion and Language. Registry names stay as they are (ROP3, ROP25, PEID, IMB PGID, JP Code, JoshuaProject, WCD, PGIC GeoID), as do the Data sources provenance labels. The reference pages (semantic trees, index, name locales) wait on the English-only ruling. --- library/i18n/locales/ar/pplr.json | 56 +++++++++++++++++++ library/i18n/locales/de/pplr.json | 56 +++++++++++++++++++ library/i18n/locales/en/pplr.json | 56 +++++++++++++++++++ library/i18n/locales/es/pplr.json | 56 +++++++++++++++++++ library/i18n/locales/fr/pplr.json | 56 +++++++++++++++++++ library/i18n/locales/hi/pplr.json | 56 +++++++++++++++++++ library/i18n/locales/it/pplr.json | 56 +++++++++++++++++++ library/i18n/locales/pt/pplr.json | 56 +++++++++++++++++++ library/i18n/locales/ro/pplr.json | 56 +++++++++++++++++++ library/i18n/locales/ru/pplr.json | 56 +++++++++++++++++++ library/i18n/locales/zh/pplr.json | 56 +++++++++++++++++++ .../pplr-data-maps/pplr-data-maps.vue | 2 +- .../src/components/DataSourcesDropdown.vue | 6 +- .../src/components/FlatLegend.vue | 8 ++- .../src/components/LoadingGlobe.vue | 8 ++- .../src/components/PinDetailCard.vue | 24 ++++---- .../src/components/SemanticTreeLegend.vue | 3 +- .../pplr-data-maps/src/utils/pplrMap.js | 12 ++-- .../src/views/pplr-coverage.vue | 8 +-- .../pplr-data-maps/src/views/pplr-d3-tree.vue | 8 +-- .../src/views/pplr-language-families.vue | 22 ++++---- .../pplr-data-maps/src/views/pplr-pins.vue | 6 +- .../src/views/pplr-religion.vue | 18 +++--- .../src/views/pplr-rop-tree.vue | 24 ++++---- .../src/views/pplr-rosetta-cards.vue | 18 +++--- 25 files changed, 706 insertions(+), 77 deletions(-) diff --git a/library/i18n/locales/ar/pplr.json b/library/i18n/locales/ar/pplr.json index 6d413ea7a..aefa0ba9d 100644 --- a/library/i18n/locales/ar/pplr.json +++ b/library/i18n/locales/ar/pplr.json @@ -32,5 +32,61 @@ "readyPins": "جاهز · دبابيس الشعوب في الدول: {pins} · انقر أي دبوس", "readyLanguage": "جاهز · الدبابيس: {pins} · تغطية العائلات {coverage}% · أعلى 25 = {top}%", "readyReligion": "الدبابيس: {pins} · الأكثر شيوعًا: {religion} ({count})" + }, + "ui": { + "chooseView": "اختر عرضًا", + "search": "ابحث بالشعب أو المكان أو اللغة أو الدين…", + "baseMap": "الخريطة الأساسية", + "dataSources": "مصادر البيانات", + "legend": "مفتاح الخريطة", + "openLegend": "افتح مفتاح الخريطة", + "clearSelectionEsc": "إلغاء التحديد (Esc)", + "closeEsc": "إغلاق (Esc)", + "close": "إغلاق", + "retry": "أعد المحاولة", + "loadingMap": "جارٍ تحميل الخريطة", + "flyToPin": "انتقل إلى الدبوس", + "primaryReligion": "الدين الرئيسي", + "ropHierarchy": "تسلسل ROP الهرمي" + }, + "pill": { + "religion": "توزيع الأديان · انقر دبوسًا للتفاصيل", + "ropTree": "تسلسل ROP الهرمي · الكتلة ← المجموعة ← الشعب ← PGIC", + "languageFamilies": "العائلات العرقية اللغوية (PPLR) · انقر دبوسًا للتفاصيل", + "sunburst": "تسلسل ROP الهرمي · الكتلة ← مجموعة الشعوب · مرّر للتكبير", + "pins": "كل دبابيس الشعوب في الدول · انقر لمعرّفات الأنظمة", + "coverage": "تغطية الترجمة · التظليل = متوسط اللغات المعبّأة لكل دولة · انقر دبوسًا أو دولة", + "rosetta": "جدول معرّفات الأنظمة · اللون = المعرّفات الموجودة · ★ = صف نموذجي" + }, + "legendTitle": { + "avgLocales": "متوسط اللغات / {n}", + "idCoverage": "تغطية المعرّفات" + }, + "rosetta": { + "legend": { + "all": "JP + IMB + WCD، الثلاثة", + "imbOnly": "IMB فقط", + "jpOnly": "JP فقط", + "neither": "لا هذا ولا ذاك" + }, + "samplePg": "★ شعب نموذجي", + "missingIds": "لم تُربط بعد في PPLR: {ids}. الصف الفارغ نقص في البيانات وليس خطأ." + }, + "popup": { + "noName": "(بلا اسم)", + "country": "الدولة", + "religion": "الدين", + "language": "اللغة", + "family": "العائلة", + "affinityBloc": "الكتلة", + "cluster": "المجموعة", + "peopleCluster": "مجموعة الشعوب", + "peopleGroup": "الشعب", + "pgCount": "الشعوب", + "avgLocalesFilled": "متوسط اللغات المعبّأة", + "iso3Country": "رمز الدولة ISO-3" + }, + "card": { + "nameInLocales": "الاسم في {n} لغة" } } diff --git a/library/i18n/locales/de/pplr.json b/library/i18n/locales/de/pplr.json index 095803fca..59574c246 100644 --- a/library/i18n/locales/de/pplr.json +++ b/library/i18n/locales/de/pplr.json @@ -32,5 +32,61 @@ "readyPins": "Bereit · Pins: {pins} · einen Pin anklicken", "readyLanguage": "Bereit · Pins: {pins} · Familienabdeckung {coverage} % · Top 25 = {top} %", "readyReligion": "Pins: {pins} · am häufigsten: {religion} ({count})" + }, + "ui": { + "chooseView": "Ansicht wählen", + "search": "Nach Volk, Ort, Sprache, Religion suchen…", + "baseMap": "Grundkarte", + "dataSources": "Datenquellen", + "legend": "Legende", + "openLegend": "Legende öffnen", + "clearSelectionEsc": "Auswahl aufheben (Esc)", + "closeEsc": "Schließen (Esc)", + "close": "Schließen", + "retry": "Erneut versuchen", + "loadingMap": "Karte wird geladen", + "flyToPin": "Zum Pin fliegen", + "primaryReligion": "Hauptreligion", + "ropHierarchy": "ROP-Hierarchie" + }, + "pill": { + "religion": "Verteilung der Religionen · Pin anklicken für Details", + "ropTree": "ROP-Hierarchie · Affinitätsblock → Cluster → Volk → PGIC", + "languageFamilies": "Ethnolinguistische Familien (PPLR) · Pin anklicken für Details", + "sunburst": "ROP-Hierarchie · Affinitätsblock → Volkscluster · scrollen zum Zoomen", + "pins": "Alle Volksgruppen-Pins je Land · anklicken für systemübergreifende IDs", + "coverage": "Übersetzungsabdeckung · Färbung = durchschnittlich gefüllte Sprachen je Land · Pin oder Land anklicken", + "rosetta": "ID-Rosetta · Farbe = vorhandene IDs · ★ = Beispielzeile" + }, + "legendTitle": { + "avgLocales": "Durchschnitt Sprachen / {n}", + "idCoverage": "ID-Abdeckung" + }, + "rosetta": { + "legend": { + "all": "JP + IMB + WCD, alle drei", + "imbOnly": "Nur IMB", + "jpOnly": "Nur JP", + "neither": "keins von beiden" + }, + "samplePg": "★ Beispiel-Volk", + "missingIds": "In PPLR noch nicht zugeordnet: {ids}. Eine leere Zeile ist eine Datenlücke, kein Fehler." + }, + "popup": { + "noName": "(ohne Namen)", + "country": "Land", + "religion": "Religion", + "language": "Sprache", + "family": "Familie", + "affinityBloc": "Affinitätsblock", + "cluster": "Cluster", + "peopleCluster": "Volkscluster", + "peopleGroup": "Volk", + "pgCount": "Völker", + "avgLocalesFilled": "Durchschnittlich gefüllte Sprachen", + "iso3Country": "ISO-3-Land" + }, + "card": { + "nameInLocales": "Name in {n} Sprachen" } } diff --git a/library/i18n/locales/en/pplr.json b/library/i18n/locales/en/pplr.json index 75b7eb4e4..21f093b0c 100644 --- a/library/i18n/locales/en/pplr.json +++ b/library/i18n/locales/en/pplr.json @@ -32,5 +32,61 @@ "readyPins": "Ready · {pins} PG-in-country pins · click any pin", "readyLanguage": "Ready · {pins} pins · {coverage}% family coverage · top-25 = {top}%", "readyReligion": "{pins} pins · {religion} most common ({count})" + }, + "ui": { + "chooseView": "Choose a view", + "search": "Search by people, place, language, religion…", + "baseMap": "Base map", + "dataSources": "Data sources", + "legend": "Legend", + "openLegend": "Open legend", + "clearSelectionEsc": "Clear selection (Esc)", + "closeEsc": "Close (Esc)", + "close": "Close", + "retry": "Retry", + "loadingMap": "Loading map", + "flyToPin": "Fly to pin", + "primaryReligion": "Primary religion", + "ropHierarchy": "ROP hierarchy" + }, + "pill": { + "religion": "Religion distribution · click a pin for detail", + "ropTree": "ROP hierarchy · Affinity Bloc → Cluster → People Group → PGIC", + "languageFamilies": "Ethnolinguistic families (PPLR) · click a pin for detail", + "sunburst": "ROP hierarchy · Affinity Bloc → People Cluster · scroll to zoom", + "pins": "All people-group-in-country pins · click for cross-system IDs", + "coverage": "Translation coverage · shading = average locales filled per country · click a pin or a country", + "rosetta": "Cross-system ID Rosetta · colour = which IDs exist · ★ = sample row" + }, + "legendTitle": { + "avgLocales": "Average locales / {n}", + "idCoverage": "ID coverage" + }, + "rosetta": { + "legend": { + "all": "JP + IMB + WCD, all three", + "imbOnly": "IMB only", + "jpOnly": "JP only", + "neither": "neither" + }, + "samplePg": "★ sample people group", + "missingIds": "Not yet cross-mapped in PPLR: {ids}. An empty row is a data gap, not an error." + }, + "popup": { + "noName": "(no name)", + "country": "Country", + "religion": "Religion", + "language": "Language", + "family": "Family", + "affinityBloc": "Affinity Bloc", + "cluster": "Cluster", + "peopleCluster": "People cluster", + "peopleGroup": "People group", + "pgCount": "People groups", + "avgLocalesFilled": "Average locales filled", + "iso3Country": "ISO-3 country" + }, + "card": { + "nameInLocales": "Name in {n} locales" } } diff --git a/library/i18n/locales/es/pplr.json b/library/i18n/locales/es/pplr.json index 4c01ffd43..d2b41931d 100644 --- a/library/i18n/locales/es/pplr.json +++ b/library/i18n/locales/es/pplr.json @@ -32,5 +32,61 @@ "readyPins": "Listo · pines: {pins} · haz clic en un pin", "readyLanguage": "Listo · pines: {pins} · cobertura de familias {coverage} % · top 25 = {top} %", "readyReligion": "Pines: {pins} · más común: {religion} ({count})" + }, + "ui": { + "chooseView": "Elige una vista", + "search": "Buscar por pueblo, lugar, idioma, religión…", + "baseMap": "Mapa base", + "dataSources": "Fuentes de datos", + "legend": "Leyenda", + "openLegend": "Abrir la leyenda", + "clearSelectionEsc": "Borrar la selección (Esc)", + "closeEsc": "Cerrar (Esc)", + "close": "Cerrar", + "retry": "Reintentar", + "loadingMap": "Cargando el mapa", + "flyToPin": "Ir al pin", + "primaryReligion": "Religión principal", + "ropHierarchy": "Jerarquía ROP" + }, + "pill": { + "religion": "Distribución de religiones · haz clic en un pin para ver detalles", + "ropTree": "Jerarquía ROP · bloque de afinidad → clúster → pueblo → PGIC", + "languageFamilies": "Familias etnolingüísticas (PPLR) · haz clic en un pin para ver detalles", + "sunburst": "Jerarquía ROP · bloque de afinidad → clúster de pueblos · desplázate para ampliar", + "pins": "Todos los pines de pueblos por país · haz clic para ver los identificadores de cada sistema", + "coverage": "Cobertura de traducción · sombreado = promedio de idiomas completados por país · haz clic en un pin o un país", + "rosetta": "Rosetta de identificadores · color = identificadores existentes · ★ = fila de ejemplo" + }, + "legendTitle": { + "avgLocales": "Promedio de idiomas / {n}", + "idCoverage": "Cobertura de identificadores" + }, + "rosetta": { + "legend": { + "all": "JP + IMB + WCD, los tres", + "imbOnly": "Solo IMB", + "jpOnly": "Solo JP", + "neither": "ninguno" + }, + "samplePg": "★ pueblo de ejemplo", + "missingIds": "Aún sin vincular en PPLR: {ids}. Una fila vacía es un hueco en los datos, no un error." + }, + "popup": { + "noName": "(sin nombre)", + "country": "País", + "religion": "Religión", + "language": "Idioma", + "family": "Familia", + "affinityBloc": "Bloque de afinidad", + "cluster": "Clúster", + "peopleCluster": "Clúster de pueblos", + "peopleGroup": "Pueblo", + "pgCount": "Pueblos", + "avgLocalesFilled": "Promedio de idiomas completados", + "iso3Country": "País ISO-3" + }, + "card": { + "nameInLocales": "Nombre en {n} idiomas" } } diff --git a/library/i18n/locales/fr/pplr.json b/library/i18n/locales/fr/pplr.json index a58199afd..595d650fc 100644 --- a/library/i18n/locales/fr/pplr.json +++ b/library/i18n/locales/fr/pplr.json @@ -32,5 +32,61 @@ "readyPins": "Prêt · épingles : {pins} · cliquez sur une épingle", "readyLanguage": "Prêt · épingles : {pins} · couverture des familles {coverage} % · top 25 = {top} %", "readyReligion": "Épingles : {pins} · la plus fréquente : {religion} ({count})" + }, + "ui": { + "chooseView": "Choisir une vue", + "search": "Rechercher par peuple, lieu, langue, religion…", + "baseMap": "Fond de carte", + "dataSources": "Sources des données", + "legend": "Légende", + "openLegend": "Ouvrir la légende", + "clearSelectionEsc": "Effacer la sélection (Échap)", + "closeEsc": "Fermer (Échap)", + "close": "Fermer", + "retry": "Réessayer", + "loadingMap": "Chargement de la carte", + "flyToPin": "Aller à l’épingle", + "primaryReligion": "Religion principale", + "ropHierarchy": "Hiérarchie ROP" + }, + "pill": { + "religion": "Répartition des religions · cliquez sur une épingle pour le détail", + "ropTree": "Hiérarchie ROP · bloc d’affinité → grappe → peuple → PGIC", + "languageFamilies": "Familles ethnolinguistiques (PPLR) · cliquez sur une épingle pour le détail", + "sunburst": "Hiérarchie ROP · bloc d’affinité → grappe de peuples · faites défiler pour zoomer", + "pins": "Toutes les épingles peuple-pays · cliquez pour les identifiants des systèmes", + "coverage": "Couverture de traduction · teinte = moyenne des langues renseignées par pays · cliquez sur une épingle ou un pays", + "rosetta": "Rosetta des identifiants · couleur = identifiants présents · ★ = ligne d’exemple" + }, + "legendTitle": { + "avgLocales": "Moyenne des langues / {n}", + "idCoverage": "Couverture des identifiants" + }, + "rosetta": { + "legend": { + "all": "JP + IMB + WCD, les trois", + "imbOnly": "IMB seulement", + "jpOnly": "JP seulement", + "neither": "aucun des deux" + }, + "samplePg": "★ peuple d’exemple", + "missingIds": "Pas encore mis en correspondance dans PPLR : {ids}. Une ligne vide est une lacune des données, pas une erreur." + }, + "popup": { + "noName": "(sans nom)", + "country": "Pays", + "religion": "Religion", + "language": "Langue", + "family": "Famille", + "affinityBloc": "Bloc d’affinité", + "cluster": "Grappe", + "peopleCluster": "Grappe de peuples", + "peopleGroup": "Peuple", + "pgCount": "Peuples", + "avgLocalesFilled": "Moyenne des langues renseignées", + "iso3Country": "Pays ISO-3" + }, + "card": { + "nameInLocales": "Nom dans {n} langues" } } diff --git a/library/i18n/locales/hi/pplr.json b/library/i18n/locales/hi/pplr.json index c00988366..ad22ca0ab 100644 --- a/library/i18n/locales/hi/pplr.json +++ b/library/i18n/locales/hi/pplr.json @@ -32,5 +32,61 @@ "readyPins": "तैयार · पिन: {pins} · किसी पिन पर क्लिक करें", "readyLanguage": "तैयार · पिन: {pins} · परिवार कवरेज {coverage}% · शीर्ष 25 = {top}%", "readyReligion": "पिन: {pins} · सबसे आम: {religion} ({count})" + }, + "ui": { + "chooseView": "दृश्य चुनें", + "search": "जनसमूह, स्थान, भाषा, धर्म से खोजें…", + "baseMap": "आधार मानचित्र", + "dataSources": "डेटा स्रोत", + "legend": "सूचकांक", + "openLegend": "सूचकांक खोलें", + "clearSelectionEsc": "चयन हटाएँ (Esc)", + "closeEsc": "बंद करें (Esc)", + "close": "बंद करें", + "retry": "फिर से कोशिश करें", + "loadingMap": "मानचित्र लोड हो रहा है", + "flyToPin": "पिन पर जाएँ", + "primaryReligion": "प्रमुख धर्म", + "ropHierarchy": "ROP पदानुक्रम" + }, + "pill": { + "religion": "धर्मों का वितरण · विवरण के लिए किसी पिन पर क्लिक करें", + "ropTree": "ROP पदानुक्रम · सम्बद्धता खंड → क्लस्टर → जनसमूह → PGIC", + "languageFamilies": "नृजातीय-भाषाई परिवार (PPLR) · विवरण के लिए किसी पिन पर क्लिक करें", + "sunburst": "ROP पदानुक्रम · सम्बद्धता खंड → जनसमूह क्लस्टर · ज़ूम के लिए स्क्रॉल करें", + "pins": "देश-वार सभी जनसमूह पिन · प्रणालियों की पहचान-संख्याओं के लिए क्लिक करें", + "coverage": "अनुवाद कवरेज · रंग = प्रति देश भरी गई भाषाओं का औसत · किसी पिन या देश पर क्लिक करें", + "rosetta": "पहचान-संख्या रोसेटा · रंग = कौन-सी पहचान-संख्याएँ हैं · ★ = नमूना पंक्ति" + }, + "legendTitle": { + "avgLocales": "भाषाओं का औसत / {n}", + "idCoverage": "पहचान-संख्या कवरेज" + }, + "rosetta": { + "legend": { + "all": "JP + IMB + WCD, तीनों", + "imbOnly": "केवल IMB", + "jpOnly": "केवल JP", + "neither": "दोनों में से कोई नहीं" + }, + "samplePg": "★ नमूना जनसमूह", + "missingIds": "PPLR में अभी मिलान नहीं हुआ: {ids}। खाली पंक्ति डेटा की कमी है, त्रुटि नहीं।" + }, + "popup": { + "noName": "(कोई नाम नहीं)", + "country": "देश", + "religion": "धर्म", + "language": "भाषा", + "family": "परिवार", + "affinityBloc": "सम्बद्धता खंड", + "cluster": "क्लस्टर", + "peopleCluster": "जनसमूह क्लस्टर", + "peopleGroup": "जनसमूह", + "pgCount": "जनसमूह", + "avgLocalesFilled": "भरी गई भाषाओं का औसत", + "iso3Country": "ISO-3 देश" + }, + "card": { + "nameInLocales": "{n} भाषाओं में नाम" } } diff --git a/library/i18n/locales/it/pplr.json b/library/i18n/locales/it/pplr.json index 733724be9..f650e4542 100644 --- a/library/i18n/locales/it/pplr.json +++ b/library/i18n/locales/it/pplr.json @@ -32,5 +32,61 @@ "readyPins": "Pronto · segnaposto: {pins} · clicca un segnaposto", "readyLanguage": "Pronto · segnaposto: {pins} · copertura famiglie {coverage}% · top 25 = {top}%", "readyReligion": "Segnaposto: {pins} · più comune: {religion} ({count})" + }, + "ui": { + "chooseView": "Scegli una vista", + "search": "Cerca per popolo, luogo, lingua, religione…", + "baseMap": "Mappa di base", + "dataSources": "Fonti dei dati", + "legend": "Legenda", + "openLegend": "Apri la legenda", + "clearSelectionEsc": "Cancella la selezione (Esc)", + "closeEsc": "Chiudi (Esc)", + "close": "Chiudi", + "retry": "Riprova", + "loadingMap": "Caricamento della mappa", + "flyToPin": "Vai al segnaposto", + "primaryReligion": "Religione principale", + "ropHierarchy": "Gerarchia ROP" + }, + "pill": { + "religion": "Distribuzione delle religioni · clicca un segnaposto per i dettagli", + "ropTree": "Gerarchia ROP · blocco di affinità → cluster → popolo → PGIC", + "languageFamilies": "Famiglie etnolinguistiche (PPLR) · clicca un segnaposto per i dettagli", + "sunburst": "Gerarchia ROP · blocco di affinità → cluster di popoli · scorri per ingrandire", + "pins": "Tutti i segnaposto popolo-paese · clicca per gli identificativi dei sistemi", + "coverage": "Copertura delle traduzioni · colore = media delle lingue compilate per paese · clicca un segnaposto o un paese", + "rosetta": "Rosetta degli identificativi · colore = identificativi presenti · ★ = riga di esempio" + }, + "legendTitle": { + "avgLocales": "Media delle lingue / {n}", + "idCoverage": "Copertura degli identificativi" + }, + "rosetta": { + "legend": { + "all": "JP + IMB + WCD, tutti e tre", + "imbOnly": "Solo IMB", + "jpOnly": "Solo JP", + "neither": "nessuno dei due" + }, + "samplePg": "★ popolo di esempio", + "missingIds": "Non ancora collegati in PPLR: {ids}. Una riga vuota è una lacuna nei dati, non un errore." + }, + "popup": { + "noName": "(senza nome)", + "country": "Paese", + "religion": "Religione", + "language": "Lingua", + "family": "Famiglia", + "affinityBloc": "Blocco di affinità", + "cluster": "Cluster", + "peopleCluster": "Cluster di popoli", + "peopleGroup": "Popolo", + "pgCount": "Popoli", + "avgLocalesFilled": "Media delle lingue compilate", + "iso3Country": "Paese ISO-3" + }, + "card": { + "nameInLocales": "Nome in {n} lingue" } } diff --git a/library/i18n/locales/pt/pplr.json b/library/i18n/locales/pt/pplr.json index 131e62d93..68c219455 100644 --- a/library/i18n/locales/pt/pplr.json +++ b/library/i18n/locales/pt/pplr.json @@ -32,5 +32,61 @@ "readyPins": "Pronto · marcadores: {pins} · clique num marcador", "readyLanguage": "Pronto · marcadores: {pins} · cobertura de famílias {coverage}% · top 25 = {top}%", "readyReligion": "Marcadores: {pins} · mais comum: {religion} ({count})" + }, + "ui": { + "chooseView": "Escolha uma vista", + "search": "Pesquisar por povo, lugar, idioma, religião…", + "baseMap": "Mapa base", + "dataSources": "Fontes de dados", + "legend": "Legenda", + "openLegend": "Abrir a legenda", + "clearSelectionEsc": "Limpar a seleção (Esc)", + "closeEsc": "Fechar (Esc)", + "close": "Fechar", + "retry": "Tentar novamente", + "loadingMap": "A carregar o mapa", + "flyToPin": "Ir para o marcador", + "primaryReligion": "Religião principal", + "ropHierarchy": "Hierarquia ROP" + }, + "pill": { + "religion": "Distribuição das religiões · clique num marcador para ver detalhes", + "ropTree": "Hierarquia ROP · bloco de afinidade → agrupamento → povo → PGIC", + "languageFamilies": "Famílias etnolinguísticas (PPLR) · clique num marcador para ver detalhes", + "sunburst": "Hierarquia ROP · bloco de afinidade → agrupamento de povos · role para ampliar", + "pins": "Todos os marcadores povo-país · clique para ver os identificadores dos sistemas", + "coverage": "Cobertura de tradução · cor = média de idiomas preenchidos por país · clique num marcador ou num país", + "rosetta": "Rosetta de identificadores · cor = identificadores existentes · ★ = linha de exemplo" + }, + "legendTitle": { + "avgLocales": "Média de idiomas / {n}", + "idCoverage": "Cobertura de identificadores" + }, + "rosetta": { + "legend": { + "all": "JP + IMB + WCD, os três", + "imbOnly": "Apenas IMB", + "jpOnly": "Apenas JP", + "neither": "nenhum" + }, + "samplePg": "★ povo de exemplo", + "missingIds": "Ainda não correspondidos no PPLR: {ids}. Uma linha vazia é uma lacuna nos dados, não um erro." + }, + "popup": { + "noName": "(sem nome)", + "country": "País", + "religion": "Religião", + "language": "Idioma", + "family": "Família", + "affinityBloc": "Bloco de afinidade", + "cluster": "Agrupamento", + "peopleCluster": "Agrupamento de povos", + "peopleGroup": "Povo", + "pgCount": "Povos", + "avgLocalesFilled": "Média de idiomas preenchidos", + "iso3Country": "País ISO-3" + }, + "card": { + "nameInLocales": "Nome em {n} idiomas" } } diff --git a/library/i18n/locales/ro/pplr.json b/library/i18n/locales/ro/pplr.json index 1bcb2b729..1caa6957d 100644 --- a/library/i18n/locales/ro/pplr.json +++ b/library/i18n/locales/ro/pplr.json @@ -32,5 +32,61 @@ "readyPins": "Gata · repere: {pins} · dați clic pe un reper", "readyLanguage": "Gata · repere: {pins} · acoperirea familiilor {coverage}% · top 25 = {top}%", "readyReligion": "Repere: {pins} · cea mai frecventă: {religion} ({count})" + }, + "ui": { + "chooseView": "Alegeți o vedere", + "search": "Căutați după popor, loc, limbă, religie…", + "baseMap": "Hartă de bază", + "dataSources": "Surse de date", + "legend": "Legendă", + "openLegend": "Deschide legenda", + "clearSelectionEsc": "Șterge selecția (Esc)", + "closeEsc": "Închide (Esc)", + "close": "Închide", + "retry": "Reîncercați", + "loadingMap": "Se încarcă harta", + "flyToPin": "Mergi la reper", + "primaryReligion": "Religia principală", + "ropHierarchy": "Ierarhia ROP" + }, + "pill": { + "religion": "Distribuția religiilor · dați clic pe un reper pentru detalii", + "ropTree": "Ierarhia ROP · bloc de afinitate → grup → popor → PGIC", + "languageFamilies": "Familii etnolingvistice (PPLR) · dați clic pe un reper pentru detalii", + "sunburst": "Ierarhia ROP · bloc de afinitate → grup de popoare · derulați pentru zoom", + "pins": "Toate reperele popor-țară · dați clic pentru identificatorii sistemelor", + "coverage": "Acoperirea traducerilor · nuanța = media limbilor completate pe țară · dați clic pe un reper sau pe o țară", + "rosetta": "Rosetta identificatorilor · culoare = identificatorii existenți · ★ = rând de exemplu" + }, + "legendTitle": { + "avgLocales": "Media limbilor / {n}", + "idCoverage": "Acoperirea identificatorilor" + }, + "rosetta": { + "legend": { + "all": "JP + IMB + WCD, toate trei", + "imbOnly": "Doar IMB", + "jpOnly": "Doar JP", + "neither": "niciunul" + }, + "samplePg": "★ popor de exemplu", + "missingIds": "Încă neasociate în PPLR: {ids}. Un rând gol este o lipsă de date, nu o eroare." + }, + "popup": { + "noName": "(fără nume)", + "country": "Țară", + "religion": "Religie", + "language": "Limbă", + "family": "Familie", + "affinityBloc": "Bloc de afinitate", + "cluster": "Grup", + "peopleCluster": "Grup de popoare", + "peopleGroup": "Popor", + "pgCount": "Popoare", + "avgLocalesFilled": "Media limbilor completate", + "iso3Country": "Țară ISO-3" + }, + "card": { + "nameInLocales": "Numele în {n} limbi" } } diff --git a/library/i18n/locales/ru/pplr.json b/library/i18n/locales/ru/pplr.json index 30269e0e0..8f1e50618 100644 --- a/library/i18n/locales/ru/pplr.json +++ b/library/i18n/locales/ru/pplr.json @@ -32,5 +32,61 @@ "readyPins": "Готово · меток: {pins} · нажмите на метку", "readyLanguage": "Готово · меток: {pins} · покрытие семей {coverage}% · топ-25 = {top}%", "readyReligion": "Меток: {pins} · чаще всего: {religion} ({count})" + }, + "ui": { + "chooseView": "Выберите вид", + "search": "Поиск по народу, месту, языку, религии…", + "baseMap": "Базовая карта", + "dataSources": "Источники данных", + "legend": "Легенда", + "openLegend": "Открыть легенду", + "clearSelectionEsc": "Снять выделение (Esc)", + "closeEsc": "Закрыть (Esc)", + "close": "Закрыть", + "retry": "Повторить", + "loadingMap": "Загрузка карты", + "flyToPin": "Перейти к метке", + "primaryReligion": "Основная религия", + "ropHierarchy": "Иерархия ROP" + }, + "pill": { + "religion": "Распределение религий · нажмите на метку, чтобы узнать подробности", + "ropTree": "Иерархия ROP · блок родства → кластер → народ → PGIC", + "languageFamilies": "Этнолингвистические семьи (PPLR) · нажмите на метку, чтобы узнать подробности", + "sunburst": "Иерархия ROP · блок родства → кластер народов · прокрутите для масштаба", + "pins": "Все метки «народ в стране» · нажмите, чтобы увидеть идентификаторы систем", + "coverage": "Покрытие переводов · заливка = среднее число заполненных языков по стране · нажмите на метку или страну", + "rosetta": "Розетта идентификаторов · цвет = какие идентификаторы есть · ★ = пример" + }, + "legendTitle": { + "avgLocales": "Среднее число языков / {n}", + "idCoverage": "Покрытие идентификаторов" + }, + "rosetta": { + "legend": { + "all": "JP + IMB + WCD, все три", + "imbOnly": "Только IMB", + "jpOnly": "Только JP", + "neither": "ни того, ни другого" + }, + "samplePg": "★ пример народа", + "missingIds": "Ещё не сопоставлено в PPLR: {ids}. Пустая строка — пробел в данных, а не ошибка." + }, + "popup": { + "noName": "(без названия)", + "country": "Страна", + "religion": "Религия", + "language": "Язык", + "family": "Семья", + "affinityBloc": "Блок родства", + "cluster": "Кластер", + "peopleCluster": "Кластер народов", + "peopleGroup": "Народ", + "pgCount": "Народы", + "avgLocalesFilled": "Среднее число заполненных языков", + "iso3Country": "Страна ISO-3" + }, + "card": { + "nameInLocales": "Название на {n} языках" } } diff --git a/library/i18n/locales/zh/pplr.json b/library/i18n/locales/zh/pplr.json index 7d373ee84..51f3c9fde 100644 --- a/library/i18n/locales/zh/pplr.json +++ b/library/i18n/locales/zh/pplr.json @@ -32,5 +32,61 @@ "readyPins": "就绪 · 族群标记:{pins} · 点击任一标记", "readyLanguage": "就绪 · 标记:{pins} · 语系覆盖率 {coverage}% · 前 25 = {top}%", "readyReligion": "标记:{pins} · 最常见:{religion}({count})" + }, + "ui": { + "chooseView": "选择视图", + "search": "按族群、地点、语言、宗教搜索…", + "baseMap": "底图", + "dataSources": "数据来源", + "legend": "图例", + "openLegend": "打开图例", + "clearSelectionEsc": "清除选择 (Esc)", + "closeEsc": "关闭 (Esc)", + "close": "关闭", + "retry": "重试", + "loadingMap": "正在加载地图", + "flyToPin": "飞到标记", + "primaryReligion": "主要宗教", + "ropHierarchy": "ROP 层级" + }, + "pill": { + "religion": "宗教分布 · 点击标记查看详情", + "ropTree": "ROP 层级 · 亲缘区块 → 民族群 → 族群 → PGIC", + "languageFamilies": "民族语言语系 (PPLR) · 点击标记查看详情", + "sunburst": "ROP 层级 · 亲缘区块 → 民族群 · 滚动缩放", + "pins": "全部国家内族群标记 · 点击查看跨系统 ID", + "coverage": "翻译覆盖率 · 着色 = 各国平均已填语种数 · 点击标记或国家", + "rosetta": "跨系统 ID 对照 · 颜色 = 已有哪些 ID · ★ = 示例行" + }, + "legendTitle": { + "avgLocales": "平均语种数 / {n}", + "idCoverage": "ID 覆盖" + }, + "rosetta": { + "legend": { + "all": "JP + IMB + WCD 三者俱全", + "imbOnly": "仅 IMB", + "jpOnly": "仅 JP", + "neither": "两者皆无" + }, + "samplePg": "★ 示例族群", + "missingIds": "PPLR 尚未对应:{ids}。空行是数据缺口,不是错误。" + }, + "popup": { + "noName": "(无名称)", + "country": "国家", + "religion": "宗教", + "language": "语言", + "family": "语系", + "affinityBloc": "亲缘区块", + "cluster": "民族群", + "peopleCluster": "民族群", + "peopleGroup": "族群", + "pgCount": "族群数", + "avgLocalesFilled": "平均已填语种数", + "iso3Country": "ISO-3 国家" + }, + "card": { + "nameInLocales": "{n} 种语言中的名称" } } diff --git a/plugin-designs/pplr-data-maps/pplr-data-maps.vue b/plugin-designs/pplr-data-maps/pplr-data-maps.vue index 55a19fb6e..0e9cef1ed 100644 --- a/plugin-designs/pplr-data-maps/pplr-data-maps.vue +++ b/plugin-designs/pplr-data-maps/pplr-data-maps.vue @@ -74,7 +74,7 @@ useShadowStyles(
PPLR data maps -
+
diff --git a/plugin-designs/pplr-data-maps/src/components/DataSourcesDropdown.vue b/plugin-designs/pplr-data-maps/src/components/DataSourcesDropdown.vue index e3a28c67b..29c1b93a6 100644 --- a/plugin-designs/pplr-data-maps/src/components/DataSourcesDropdown.vue +++ b/plugin-designs/pplr-data-maps/src/components/DataSourcesDropdown.vue @@ -9,6 +9,7 @@ * component into its toolbar. */ import { ref } from 'vue' +import { usePplrT } from '../composables/usePplrT.js' defineProps({ /** Array of { label, url, fields[] } */ @@ -16,19 +17,20 @@ defineProps({ }) const open = ref(false) +const t = usePplrT() function toggle() { open.value = !open.value } diff --git a/plugin-designs/pplr-data-maps/src/components/LoadingGlobe.vue b/plugin-designs/pplr-data-maps/src/components/LoadingGlobe.vue index cd1aa82ab..f24d1796f 100644 --- a/plugin-designs/pplr-data-maps/src/components/LoadingGlobe.vue +++ b/plugin-designs/pplr-data-maps/src/components/LoadingGlobe.vue @@ -12,12 +12,14 @@ * */ import { ref, onMounted, onBeforeUnmount, watch } from 'vue' +import { usePplrT } from '../composables/usePplrT.js' const props = defineProps({ - label: { type: String, default: 'Loading map' }, + label: { type: String, default: '' }, // empty = the translated "Loading map" stuckAfterMs:{ type: Number, default: 30000 }, }) const emit = defineEmits(['retry']) +const t = usePplrT() const stuck = ref(false) let stuckTimer = null @@ -56,13 +58,13 @@ function onRetry() { - {{ label }} + {{ label || t('pplr.ui.loadingMap') }}
diff --git a/plugin-designs/pplr-data-maps/src/components/PinDetailCard.vue b/plugin-designs/pplr-data-maps/src/components/PinDetailCard.vue index 22fe53fb6..106907fb7 100644 --- a/plugin-designs/pplr-data-maps/src/components/PinDetailCard.vue +++ b/plugin-designs/pplr-data-maps/src/components/PinDetailCard.vue @@ -19,6 +19,7 @@ import { computed, ref, watch, onMounted, onBeforeUnmount } from 'vue' import { useInstance } from '../composables/usePplrInstance.js' import { LOCALES, LOCALE_NAMES } from '../utils/pplrMap.js' import { loadNames } from '../utils/pplrData.js' +import { usePplrT } from '../composables/usePplrT.js' const props = defineProps({ /** Optional override — usually read from instance.pinDetail */ @@ -30,6 +31,7 @@ const props = defineProps({ const emit = defineEmits(['close', 'locate']) const instance = useInstance() +const tr = usePplrT() // not `t`: the names table below is already called t const pinData = computed(() => props.pin || instance?.pinDetail.value || null) // All 17 locale names for this PG (n_en, n_hi, n_bn, …). Per user 2026-05-02: @@ -59,12 +61,12 @@ const fields = computed(() => { const dash = v => (v == null || v === 'None' || v === '' || v === '*') ? '—' : v // Curated field order — most identifying first, registry IDs last return [ - { label: 'Country', value: dash(p.country), mono: false }, - { label: 'Religion', value: dash(p.religion), mono: false }, - { label: 'Language', value: dash(p.language), mono: false }, - { label: 'ISO-3 Country', value: dash(p.iso3), mono: true, hidden: !p.iso3 }, - { label: 'Affinity Bloc', value: dash(p.rop1), mono: true, hidden: !p.rop1 }, - { label: 'People Cluster', value: dash(p.rop2), mono: true, hidden: !p.rop2 }, + { label: tr('pplr.popup.country'), value: dash(p.country), mono: false }, + { label: tr('pplr.popup.religion'), value: dash(p.religion), mono: false }, + { label: tr('pplr.popup.language'), value: dash(p.language), mono: false }, + { label: tr('pplr.popup.iso3Country'), value: dash(p.iso3), mono: true, hidden: !p.iso3 }, + { label: tr('pplr.popup.affinityBloc'), value: dash(p.rop1), mono: true, hidden: !p.rop1 }, + { label: tr('pplr.popup.peopleCluster'), value: dash(p.rop2), mono: true, hidden: !p.rop2 }, { label: 'ROP25', value: dash(p.rop3), mono: true, hidden: !p.rop3 }, { label: 'PGIC GeoID', value: dash(p.rop25), mono: true, hidden: !p.rop25 }, { label: 'PEID', value: dash(p.peid), mono: true, hidden: !p.peid }, @@ -98,8 +100,8 @@ onBeforeUnmount(() => document.removeEventListener('keydown', onKey))
- People Group -
- Name in 17 locales + {{ tr('pplr.card.nameInLocales', { n: locales.length }) }}
{{ loc.name }} {{ loc.code }} @@ -134,9 +136,9 @@ onBeforeUnmount(() => document.removeEventListener('keydown', onKey)) - Fly to pin + {{ tr('pplr.ui.flyToPin') }} - +
diff --git a/plugin-designs/pplr-data-maps/src/components/SemanticTreeLegend.vue b/plugin-designs/pplr-data-maps/src/components/SemanticTreeLegend.vue index db1eae8ca..32fb1440a 100644 --- a/plugin-designs/pplr-data-maps/src/components/SemanticTreeLegend.vue +++ b/plugin-designs/pplr-data-maps/src/components/SemanticTreeLegend.vue @@ -34,6 +34,7 @@ const A11Y_EN = { 'legend.loadingRows': 'Loading {label}…', 'legend.loadingData': 'Loading data…', 'legend.noDataAtThisLevel': 'No data at this level', 'legend.showingTop': 'Showing top {n} of {m}', 'legend.useGeocoderHint': 'use the geocoder above to find the rest', + 'legend.sortByPop': 'Sort by Population', } const fillA11y = (str, p) => String(str).replace(/\{(\w+)\}/g, (m, k) => (p && k in p ? p[k] : m)) let ta = (key, p) => fillA11y(A11Y_EN[key] ?? key, p) @@ -441,7 +442,7 @@ function rowClasses(row) {