UPG Neighbor cockpit: the view switch, sort buttons, tooltip and legend follow the reader's language

Still typed-in English after the lens pass: MAP / FLOWER, the sender counter, the
sort buttons, the Details tooltip rows (% Christian, Bridge, Adjacency, Code), the
legend ribbon, the flower ring legend and the Flowers cluster-by modes. 21 keys in
all eleven catalogues; the ring legend reuses the Flower Mesh wording already there.

Method names (SEND, 4-D SEND join, Flower-Mesh, Bounded sets), the provenance
footers and the scripture references stay English, per the scope ruling.
This commit is contained in:
Doxa Maps 2026-09-27 02:01:35 +00:00
parent 71826baa3d
commit f716590740
15 changed files with 335 additions and 60 deletions

View file

@ -113,7 +113,13 @@
"colCountry": "الدولة",
"colLanguage": "اللغة",
"colPopulation": "عدد السكان",
"colReligion": "الدين"
"colReligion": "الدين",
"colPctChristian": "% مسيحيون",
"colAdjacency": "التجاور",
"colCode": "الرمز",
"sortMobilization": "التعبئة",
"sortFrontier": "المناطق الحدودية أولًا",
"colName": "الاسم"
},
"fc": {
"clusterBy": "التجميع حسب",
@ -124,7 +130,17 @@
"legendPetal": "جار مُبشَّر (تفصيلي، إحداثيات حقيقية)",
"legendHelp": "انقر دائرة عليا لإعادة التجميع · انقر نواة لتتفتح بتلاتها",
"clustering": "جارٍ تجميع الحصاد حسب اللغة…",
"signLanguage": "لغة الإشارة"
"signLanguage": "لغة الإشارة",
"mode": {
"family": "العائلة",
"language": "اللغة",
"dialect": "اللهجة"
},
"size": {
"fewerBigger": "أقل · أكبر",
"more": "أكثر",
"most": "الأكثر"
}
},
"mc": {
"greenEncoding": "ترميز اللون الأخضر",
@ -138,7 +154,16 @@
"cockpit": {
"viewSwitch": "عرض الخريطة أو الزهرة",
"loading": "جارٍ تحميل حقل الحصاد…",
"unreachedTarget": "هدف غير مُبشَّر"
"unreachedTarget": "هدف غير مُبشَّر",
"map": "الخريطة",
"flower": "الزهرة",
"details": "التفاصيل",
"senders": "مُرسِلون ←",
"clustersHidden": "مجموعات · {n} مخفية",
"legendSend": "SEND (متصل = اللغة نفسها · متقطع = مجموعة · منقط = داخل الدولة)",
"legendSelection": "التحديد · نصف القطر = لوغاريتم السكان · لوقا 10:2",
"navySend": "الكحلي = SEND",
"goldMesh": "الذهبي = شبكة اللغة الواحدة"
},
"flower": {
"pickTarget": "اختر هدفًا أحمر على الخريطة —",

View file

@ -113,7 +113,13 @@
"colCountry": "Land",
"colLanguage": "Sprache",
"colPopulation": "Bevölkerung",
"colReligion": "Religion"
"colReligion": "Religion",
"colPctChristian": "% Christen",
"colAdjacency": "Nachbarschaft",
"colCode": "Kennung",
"sortMobilization": "Mobilisierung",
"sortFrontier": "Grenzgebiete zuerst",
"colName": "Name"
},
"fc": {
"clusterBy": "Gruppieren nach",
@ -124,7 +130,17 @@
"legendPetal": "Erreichter Nachbar (fein, echte Koordinaten)",
"legendHelp": "oberen Kreis anklicken zum Neugruppieren · Kern anklicken, um die Blütenblätter zu öffnen",
"clustering": "Die Ernte wird nach Sprache gruppiert…",
"signLanguage": "Gebärdensprache"
"signLanguage": "Gebärdensprache",
"mode": {
"family": "Familie",
"language": "Sprache",
"dialect": "Dialekt"
},
"size": {
"fewerBigger": "weniger · größer",
"more": "mehr",
"most": "am meisten"
}
},
"mc": {
"greenEncoding": "Kodierung der Grünfarbe",
@ -138,7 +154,16 @@
"cockpit": {
"viewSwitch": "Karten- oder Blumenansicht",
"loading": "Erntefeld wird geladen…",
"unreachedTarget": "unerreichtes Ziel"
"unreachedTarget": "unerreichtes Ziel",
"map": "Karte",
"flower": "Blume",
"details": "Details",
"senders": "Sender →",
"clustersHidden": "Cluster · {n} ausgeblendet",
"legendSend": "SEND (durchgezogen = gleiche Sprache · gestrichelt = Cluster · gepunktet = im Land)",
"legendSelection": "Auswahl · Radius = log. Bevölkerung · Lukas 10,2",
"navySend": "Marineblau = SEND",
"goldMesh": "Gold = Netz gleicher Sprache"
},
"flower": {
"pickTarget": "Ein rotes Ziel auf der Karte wählen —",

View file

@ -113,7 +113,13 @@
"colCountry": "Country",
"colLanguage": "Language",
"colPopulation": "Population",
"colReligion": "Religion"
"colReligion": "Religion",
"colPctChristian": "% Christian",
"colAdjacency": "Adjacency",
"colCode": "Code",
"sortMobilization": "Mobilization",
"sortFrontier": "Frontier first",
"colName": "Name"
},
"fc": {
"clusterBy": "Cluster by",
@ -124,7 +130,17 @@
"legendPetal": "Reached neighbor (granular, real coordinates)",
"legendHelp": "click a top circle to re-cluster · click a core to bloom its petals",
"clustering": "Clustering the harvest by language…",
"signLanguage": "Sign Language"
"signLanguage": "Sign Language",
"mode": {
"family": "Family",
"language": "Language",
"dialect": "Dialect"
},
"size": {
"fewerBigger": "fewer · bigger",
"more": "more",
"most": "most"
}
},
"mc": {
"greenEncoding": "Green color encoding",
@ -138,7 +154,16 @@
"cockpit": {
"viewSwitch": "Map or flower view",
"loading": "Loading the harvest field…",
"unreachedTarget": "unreached target"
"unreachedTarget": "unreached target",
"map": "Map",
"flower": "Flower",
"details": "Details",
"senders": "senders →",
"clustersHidden": "clusters · {n} hidden",
"legendSend": "SEND (solid = same language · dashed = cluster · dotted = in-country)",
"legendSelection": "selection · radius = log of population · Luke 10:2",
"navySend": "navy = SEND",
"goldMesh": "gold = same-language mesh"
},
"flower": {
"pickTarget": "Pick a red target on the map —",

View file

@ -113,7 +113,13 @@
"colCountry": "País",
"colLanguage": "Idioma",
"colPopulation": "Población",
"colReligion": "Religión"
"colReligion": "Religión",
"colPctChristian": "% cristianos",
"colAdjacency": "Adyacencia",
"colCode": "Código",
"sortMobilization": "Movilización",
"sortFrontier": "Frontera primero",
"colName": "Nombre"
},
"fc": {
"clusterBy": "Agrupar por",
@ -124,7 +130,17 @@
"legendPetal": "Vecino alcanzado (detallado, coordenadas reales)",
"legendHelp": "haz clic en un círculo superior para reagrupar · haz clic en un núcleo para abrir sus pétalos",
"clustering": "Agrupando la cosecha por idioma…",
"signLanguage": "Lengua de señas"
"signLanguage": "Lengua de señas",
"mode": {
"family": "Familia",
"language": "Idioma",
"dialect": "Dialecto"
},
"size": {
"fewerBigger": "menos · más grandes",
"more": "más",
"most": "la mayoría"
}
},
"mc": {
"greenEncoding": "Codificación del color verde",
@ -138,7 +154,16 @@
"cockpit": {
"viewSwitch": "Vista de mapa o de flor",
"loading": "Cargando el campo de la cosecha…",
"unreachedTarget": "objetivo no alcanzado"
"unreachedTarget": "objetivo no alcanzado",
"map": "Mapa",
"flower": "Flor",
"details": "Detalles",
"senders": "emisores →",
"clustersHidden": "clústeres · {n} ocultos",
"legendSend": "SEND (continua = mismo idioma · discontinua = clúster · punteada = en el país)",
"legendSelection": "selección · radio = log de la población · Lucas 10:2",
"navySend": "azul marino = SEND",
"goldMesh": "dorado = red de un mismo idioma"
},
"flower": {
"pickTarget": "Elige un objetivo rojo en el mapa —",

View file

@ -113,7 +113,13 @@
"colCountry": "Pays",
"colLanguage": "Langue",
"colPopulation": "Population",
"colReligion": "Religion"
"colReligion": "Religion",
"colPctChristian": "% chrétiens",
"colAdjacency": "Proximité",
"colCode": "Code",
"sortMobilization": "Mobilisation",
"sortFrontier": "Frontières d’abord",
"colName": "Nom"
},
"fc": {
"clusterBy": "Regrouper par",
@ -124,7 +130,17 @@
"legendPetal": "Voisin atteint (détaillé, coordonnées réelles)",
"legendHelp": "cliquez sur un cercle du haut pour regrouper · cliquez sur un cœur pour ouvrir ses pétales",
"clustering": "Regroupement de la moisson par langue…",
"signLanguage": "Langue des signes"
"signLanguage": "Langue des signes",
"mode": {
"family": "Famille",
"language": "Langue",
"dialect": "Dialecte"
},
"size": {
"fewerBigger": "moins · plus grands",
"more": "plus",
"most": "le plus"
}
},
"mc": {
"greenEncoding": "Codage de la couleur verte",
@ -138,7 +154,16 @@
"cockpit": {
"viewSwitch": "Vue carte ou fleur",
"loading": "Chargement du champ de la moisson…",
"unreachedTarget": "cible non atteinte"
"unreachedTarget": "cible non atteinte",
"map": "Carte",
"flower": "Fleur",
"details": "Détails",
"senders": "envoyeurs →",
"clustersHidden": "grappes · {n} masqués",
"legendSend": "SEND (plein = même langue · tirets = grappe · pointillé = dans le pays)",
"legendSelection": "sélection · rayon = log de la population · Luc 10.2",
"navySend": "bleu marine = SEND",
"goldMesh": "or = réseau de même langue"
},
"flower": {
"pickTarget": "Choisissez une cible rouge sur la carte —",

View file

@ -113,7 +113,13 @@
"colCountry": "देश",
"colLanguage": "भाषा",
"colPopulation": "जनसंख्या",
"colReligion": "धर्म"
"colReligion": "धर्म",
"colPctChristian": "% ईसाई",
"colAdjacency": "निकटता",
"colCode": "कोड",
"sortMobilization": "संग्रहण",
"sortFrontier": "सीमांत पहले",
"colName": "नाम"
},
"fc": {
"clusterBy": "समूह बनाएँ",
@ -124,7 +130,17 @@
"legendPetal": "पहुँचा पड़ोसी (बारीक, असली निर्देशांक)",
"legendHelp": "फिर से समूह बनाने के लिए ऊपर के घेरे पर क्लिक करें · पंखुड़ियाँ खोलने के लिए केंद्र पर क्लिक करें",
"clustering": "फ़सल को भाषा के अनुसार समूहित किया जा रहा है…",
"signLanguage": "सांकेतिक भाषा"
"signLanguage": "सांकेतिक भाषा",
"mode": {
"family": "परिवार",
"language": "भाषा",
"dialect": "बोली"
},
"size": {
"fewerBigger": "कम · बड़े",
"more": "अधिक",
"most": "सर्वाधिक"
}
},
"mc": {
"greenEncoding": "हरे रंग की कोडिंग",
@ -138,7 +154,16 @@
"cockpit": {
"viewSwitch": "नक्शा या फूल दृश्य",
"loading": "फ़सल का खेत लोड हो रहा है…",
"unreachedTarget": "अपहुँचा लक्ष्य"
"unreachedTarget": "अपहुँचा लक्ष्य",
"map": "मानचित्र",
"flower": "फूल",
"details": "विवरण",
"senders": "भेजने वाले →",
"clustersHidden": "क्लस्टर · {n} छिपे",
"legendSend": "SEND (ठोस = वही भाषा · डैश = क्लस्टर · बिंदु = देश के भीतर)",
"legendSelection": "चयन · त्रिज्या = जनसंख्या का लघुगणक · लूका 10:2",
"navySend": "गहरा नीला = SEND",
"goldMesh": "सुनहरा = एक-भाषा जाल"
},
"flower": {
"pickTarget": "नक्शे पर एक लाल लक्ष्य चुनें —",

View file

@ -113,7 +113,13 @@
"colCountry": "Paese",
"colLanguage": "Lingua",
"colPopulation": "Popolazione",
"colReligion": "Religione"
"colReligion": "Religione",
"colPctChristian": "% cristiani",
"colAdjacency": "Adiacenza",
"colCode": "Codice",
"sortMobilization": "Mobilitazione",
"sortFrontier": "Prima le frontiere",
"colName": "Nome"
},
"fc": {
"clusterBy": "Raggruppa per",
@ -124,7 +130,17 @@
"legendPetal": "Vicino raggiunto (dettagliato, coordinate reali)",
"legendHelp": "clicca un cerchio in alto per raggruppare · clicca un nucleo per aprire i petali",
"clustering": "Raggruppamento del raccolto per lingua…",
"signLanguage": "Lingua dei segni"
"signLanguage": "Lingua dei segni",
"mode": {
"family": "Famiglia",
"language": "Lingua",
"dialect": "Dialetto"
},
"size": {
"fewerBigger": "meno · più grandi",
"more": "di più",
"most": "il massimo"
}
},
"mc": {
"greenEncoding": "Codifica del colore verde",
@ -138,7 +154,16 @@
"cockpit": {
"viewSwitch": "Vista mappa o fiore",
"loading": "Caricamento del campo della mietitura…",
"unreachedTarget": "obiettivo non raggiunto"
"unreachedTarget": "obiettivo non raggiunto",
"map": "Mappa",
"flower": "Fiore",
"details": "Dettagli",
"senders": "mittenti →",
"clustersHidden": "cluster · {n} nascosti",
"legendSend": "SEND (continua = stessa lingua · tratteggiata = cluster · punteggiata = nel paese)",
"legendSelection": "selezione · raggio = log della popolazione · Luca 10,2",
"navySend": "blu scuro = SEND",
"goldMesh": "oro = rete della stessa lingua"
},
"flower": {
"pickTarget": "Scegli un obiettivo rosso sulla mappa —",

View file

@ -113,7 +113,13 @@
"colCountry": "País",
"colLanguage": "Idioma",
"colPopulation": "População",
"colReligion": "Religião"
"colReligion": "Religião",
"colPctChristian": "% cristãos",
"colAdjacency": "Adjacência",
"colCode": "Código",
"sortMobilization": "Mobilização",
"sortFrontier": "Fronteira primeiro",
"colName": "Nome"
},
"fc": {
"clusterBy": "Agrupar por",
@ -124,7 +130,17 @@
"legendPetal": "Vizinho alcançado (detalhado, coordenadas reais)",
"legendHelp": "clique num círculo superior para reagrupar · clique num núcleo para abrir as pétalas",
"clustering": "A agrupar a colheita por idioma…",
"signLanguage": "Língua de sinais"
"signLanguage": "Língua de sinais",
"mode": {
"family": "Família",
"language": "Idioma",
"dialect": "Dialeto"
},
"size": {
"fewerBigger": "menos · maiores",
"more": "mais",
"most": "o máximo"
}
},
"mc": {
"greenEncoding": "Codificação da cor verde",
@ -138,7 +154,16 @@
"cockpit": {
"viewSwitch": "Visão de mapa ou de flor",
"loading": "Carregando o campo da colheita…",
"unreachedTarget": "alvo não alcançado"
"unreachedTarget": "alvo não alcançado",
"map": "Mapa",
"flower": "Flor",
"details": "Detalhes",
"senders": "enviadores →",
"clustersHidden": "agrupamentos · {n} ocultos",
"legendSend": "SEND (contínua = mesmo idioma · tracejada = agrupamento · pontilhada = no país)",
"legendSelection": "seleção · raio = log da população · Lucas 10:2",
"navySend": "azul-marinho = SEND",
"goldMesh": "dourado = rede do mesmo idioma"
},
"flower": {
"pickTarget": "Escolha um alvo vermelho no mapa —",

View file

@ -113,7 +113,13 @@
"colCountry": "Țară",
"colLanguage": "Limbă",
"colPopulation": "Populație",
"colReligion": "Religie"
"colReligion": "Religie",
"colPctChristian": "% creștini",
"colAdjacency": "Vecinătate",
"colCode": "Cod",
"sortMobilization": "Mobilizare",
"sortFrontier": "Frontiera întâi",
"colName": "Nume"
},
"fc": {
"clusterBy": "Grupați după",
@ -124,7 +130,17 @@
"legendPetal": "Vecin atins (detaliat, coordonate reale)",
"legendHelp": "clic pe un cerc de sus pentru regrupare · clic pe un nucleu pentru a-i deschide petalele",
"clustering": "Se grupează recolta după limbă…",
"signLanguage": "Limbajul semnelor"
"signLanguage": "Limbajul semnelor",
"mode": {
"family": "Familie",
"language": "Limbă",
"dialect": "Dialect"
},
"size": {
"fewerBigger": "mai puține · mai mari",
"more": "mai multe",
"most": "cele mai multe"
}
},
"mc": {
"greenEncoding": "Codificarea culorii verzi",
@ -138,7 +154,16 @@
"cockpit": {
"viewSwitch": "Vedere hartă sau floare",
"loading": "Se încarcă câmpul secerișului…",
"unreachedTarget": "țintă neatinsă"
"unreachedTarget": "țintă neatinsă",
"map": "Hartă",
"flower": "Floare",
"details": "Detalii",
"senders": "trimițători →",
"clustersHidden": "grupuri · {n} ascunse",
"legendSend": "SEND (continuă = aceeași limbă · întreruptă = grup · punctată = în țară)",
"legendSelection": "selecție · rază = log al populației · Luca 10:2",
"navySend": "bleumarin = SEND",
"goldMesh": "auriu = rețea de aceeași limbă"
},
"flower": {
"pickTarget": "Alege o țintă roșie pe hartă —",

View file

@ -113,7 +113,13 @@
"colCountry": "Страна",
"colLanguage": "Язык",
"colPopulation": "Численность",
"colReligion": "Религия"
"colReligion": "Религия",
"colPctChristian": "% христиан",
"colAdjacency": "Соседство",
"colCode": "Код",
"sortMobilization": "Мобилизация",
"sortFrontier": "Сначала рубежи",
"colName": "Название"
},
"fc": {
"clusterBy": "Группировать по",
@ -124,7 +130,17 @@
"legendPetal": "Охваченный сосед (детально, реальные координаты)",
"legendHelp": "нажмите верхний круг, чтобы перегруппировать · нажмите ядро, чтобы раскрыть лепестки",
"clustering": "Группировка жатвы по языку…",
"signLanguage": "Жестовый язык"
"signLanguage": "Жестовый язык",
"mode": {
"family": "Семья",
"language": "Язык",
"dialect": "Диалект"
},
"size": {
"fewerBigger": "меньше · крупнее",
"more": "больше",
"most": "больше всего"
}
},
"mc": {
"greenEncoding": "Кодирование зелёного цвета",
@ -138,7 +154,16 @@
"cockpit": {
"viewSwitch": "Вид карты или цветка",
"loading": "Загрузка поля жатвы…",
"unreachedTarget": "недостигнутая цель"
"unreachedTarget": "недостигнутая цель",
"map": "Карта",
"flower": "Цветок",
"details": "Подробности",
"senders": "отправителей →",
"clustersHidden": "кластеров · скрыто: {n}",
"legendSend": "SEND (сплошная = тот же язык · пунктир = кластер · точки = внутри страны)",
"legendSelection": "выбор · радиус = логарифм населения · Луки 10:2",
"navySend": "тёмно-синий = SEND",
"goldMesh": "золотой = сеть одного языка"
},
"flower": {
"pickTarget": "Выберите красную цель на карте —",

View file

@ -113,7 +113,13 @@
"colCountry": "国家",
"colLanguage": "语言",
"colPopulation": "人口",
"colReligion": "宗教"
"colReligion": "宗教",
"colPctChristian": "基督徒 %",
"colAdjacency": "邻近关系",
"colCode": "代码",
"sortMobilization": "动员",
"sortFrontier": "前沿优先",
"colName": "名称"
},
"fc": {
"clusterBy": "分组依据",
@ -124,7 +130,17 @@
"legendPetal": "已得邻居(细分,真实坐标)",
"legendHelp": "点击上方圆圈重新分组 · 点击核心展开花瓣",
"clustering": "正在按语言整理庄稼…",
"signLanguage": "手语"
"signLanguage": "手语",
"mode": {
"family": "语系",
"language": "语言",
"dialect": "方言"
},
"size": {
"fewerBigger": "更少 · 更大",
"more": "更多",
"most": "最多"
}
},
"mc": {
"greenEncoding": "绿色编码",
@ -138,7 +154,16 @@
"cockpit": {
"viewSwitch": "地图或花朵视图",
"loading": "正在加载庄稼之田…",
"unreachedTarget": "未得目标"
"unreachedTarget": "未得目标",
"map": "地图",
"flower": "花朵",
"details": "详情",
"senders": "派遣方 →",
"clustersHidden": "个民族群 · 隐藏 {n} 个",
"legendSend": "SEND(实线 = 同语言 · 虚线 = 民族群 · 点线 = 国内)",
"legendSelection": "选中 · 半径 = 人口对数 · 路加福音 10:2",
"navySend": "深蓝 = SEND",
"goldMesh": "金色 = 同语言网络"
},
"flower": {
"pickTarget": "在地图上选择一个红色目标 —",

View file

@ -146,8 +146,8 @@ useShadowStyles(`
<input class="cpt-search" type="search" :value="store.search.value" @input="onSearch"
:placeholder="$t('neighbor.searchCockpit')" :aria-label="$t('neighbor.search')" />
<span class="cpt-counter">
<b>{{ store.counts.value.senders.toLocaleString() }}</b> senders →
<b>{{ store.counts.value.clusters.toLocaleString() }}</b> clusters · {{ store.counts.value.hidden }} hidden
<b>{{ store.counts.value.senders.toLocaleString() }}</b> {{ $t('neighbor.cockpit.senders') }}
<b>{{ store.counts.value.clusters.toLocaleString() }}</b> {{ $t('neighbor.cockpit.clustersHidden', { n: store.counts.value.hidden }) }}
</span>
<span class="cpt-prov" :class="{ err: store.provenance.value.apiError }"
:title="store.provenance.value.reachedFilter">
@ -163,8 +163,8 @@ useShadowStyles(`
<div class="cpt-cell map"><MapCell /></div>
<div class="cpt-cell flower"><FlowerCell /></div>
<div class="cpt-seg" role="tablist" :aria-label="$t('neighbor.cockpit.viewSwitch')">
<button :class="{ on: store.mode.value === 'map' }" @click="setMode('map')">MAP</button>
<button :class="{ on: store.mode.value === 'flower' }" @click="setMode('flower')">FLOWER</button>
<button :class="{ on: store.mode.value === 'map' }" @click="setMode('map')">{{ $t('neighbor.cockpit.map') }}</button>
<button :class="{ on: store.mode.value === 'flower' }" @click="setMode('flower')">{{ $t('neighbor.cockpit.flower') }}</button>
</div>
</div>
@ -177,13 +177,13 @@ useShadowStyles(`
<!-- LEGEND RIBBON (one shared key for all four cells) -->
<div class="cpt-legend">
<span class="cpt-lg"><span class="cpt-sw" :style="{ background: COLORS.RED }"></span> {{ $t('neighbor.cockpit.unreachedTarget') }}</span>
<span class="cpt-lg">reached %
<span class="cpt-lg">{{ $t('neighbor.strip.pctReached') }}
<span class="cpt-ramp">
<i v-for="(g, i) in COLORS.GREEN_BINS" :key="i" :style="{ background: g }"></i>
</span>
</span>
<span class="cpt-lg"><span class="cpt-line" :style="{ borderColor: COLORS.NAVY }"></span> SEND (solid=same-lang · dashed=cluster · dotted=in-country)</span>
<span class="cpt-lg"><span class="cpt-sw" :style="{ background: COLORS.GOLD }"></span> selection · pop = log radius · Luke 10:2</span>
<span class="cpt-lg"><span class="cpt-line" :style="{ borderColor: COLORS.NAVY }"></span> {{ $t('neighbor.cockpit.legendSend') }}</span>
<span class="cpt-lg"><span class="cpt-sw" :style="{ background: COLORS.GOLD }"></span> {{ $t('neighbor.cockpit.legendSelection') }}</span>
</div>
<!-- loading / error overlay -->

View file

@ -395,8 +395,8 @@ useShadowStyles(
<!-- ring legend -->
<div v-if="placed" class="cf-rings">
<b>inner</b> same-country · <b>petals</b> cross-border<br>
navy = SEND · <span :style="{ color: COLORS.GOLD }">gold</span> = same-language mesh
{{ $t('neighbor.fm.whorl') }}<br>
{{ $t('neighbor.cockpit.navySend') }} · <span :style="{ color: COLORS.GOLD }">{{ $t('neighbor.cockpit.goldMesh') }}</span>
</div>
</div>

View file

@ -328,9 +328,9 @@ useShadowStyles(`
`, 'flower-clusters')
const MODES = [
{ key: 'family', label: 'Family', sz: 'fewer · bigger' },
{ key: 'language', label: 'Language', sz: 'more' },
{ key: 'dialect', label: 'Dialect', sz: 'most' }
{ key: 'family', tKey: 'neighbor.fc.mode.family', szKey: 'neighbor.fc.size.fewerBigger' },
{ key: 'language', tKey: 'neighbor.fc.mode.language', szKey: 'neighbor.fc.size.more' },
{ key: 'dialect', tKey: 'neighbor.fc.mode.dialect', szKey: 'neighbor.fc.size.most' }
]
</script>
@ -343,9 +343,9 @@ const MODES = [
<div class="fc-modes" role="tablist" :aria-label="$t('neighbor.fc.clusterBy')">
<button v-for="md in MODES" :key="md.key" class="fc-mode" :class="{ on: mode === md.key }"
role="tab" :aria-selected="mode === md.key" @click="setMode(md.key)">
<span class="fc-circle">{{ md.label.slice(0,3).toUpperCase() }}</span>
<span class="fc-mode-lbl">{{ md.label }}</span>
<span class="fc-mode-sz">{{ md.sz }}</span>
<span class="fc-circle">{{ md.key.slice(0,3).toUpperCase() }}</span>
<span class="fc-mode-lbl">{{ $t(md.tKey) }}</span>
<span class="fc-mode-sz">{{ $t(md.szKey) }}</span>
</button>
</div>

View file

@ -63,12 +63,12 @@ const hiddenCount = computed(() => counts.value.hidden || 0)
// ── sort options ──────────────────────────────────────────────────────────────
const SORTS = [
{ key: 'mobilization', label: 'Mobilization' },
{ key: 'pct', label: '%Christian' },
{ key: 'pop', label: 'Population' },
{ key: 'bridge', label: 'Bridge' },
{ key: 'name', label: 'Name' },
{ key: 'frontier', label: 'Frontier first' }
{ key: 'mobilization', tKey: 'neighbor.list.sortMobilization' },
{ key: 'pct', tKey: 'neighbor.list.colPctChristian' },
{ key: 'pop', tKey: 'neighbor.list.colPopulation' },
{ key: 'bridge', tKey: 'neighbor.strip.bridgeType' },
{ key: 'name', tKey: 'neighbor.list.colName' },
{ key: 'frontier', tKey: 'neighbor.list.sortFrontier' }
]
function pickSort(key) { store.setSort(key) }
@ -303,7 +303,7 @@ useShadowStyles(`
:class="{ active: sortKey === s.key, frontier: s.key === 'frontier' }"
type="button"
@click="pickSort(s.key)"
>{{ s.label }}</button>
>{{ $t(s.tKey) }}</button>
</div>
</div>
@ -363,7 +363,7 @@ useShadowStyles(`
class="cpt-l-info"
:class="{ on: pinnedInfo === r.id }"
type="button"
title="Details"
:title="$t('neighbor.cockpit.details')"
@click.stop="toggleInfo(r.id)"
>i</button>
</div>
@ -374,12 +374,12 @@ useShadowStyles(`
<dt>{{ $t('neighbor.list.colPeopleGroup') }}</dt><dd>{{ r.name }}</dd>
<dt>{{ $t('neighbor.list.colCountry') }}</dt><dd>{{ r.country }}</dd>
<dt>{{ $t('neighbor.list.colLanguage') }}</dt><dd>{{ r.lang }}<span v-if="r.rol3"> · {{ r.rol3 }}</span></dd>
<dt>%Christian</dt><dd>{{ pctLabel(r.pct) }} · {{ binLabel(r.pct) }}</dd>
<dt>{{ $t('neighbor.list.colPctChristian') }}</dt><dd>{{ pctLabel(r.pct) }} · {{ binLabel(r.pct) }}</dd>
<dt>{{ $t('neighbor.list.colPopulation') }}</dt><dd>{{ fmtPop(r.pop) }}</dd>
<dt>Bridge</dt><dd>{{ r.bridge }}</dd>
<dt>Adjacency</dt><dd>{{ r.adjacency }}</dd>
<dt>{{ $t('neighbor.strip.bridgeType') }}</dt><dd>{{ r.bridge }}</dd>
<dt>{{ $t('neighbor.list.colAdjacency') }}</dt><dd>{{ r.adjacency }}</dd>
<dt>{{ $t('neighbor.list.colReligion') }}</dt><dd>{{ r.religion_bg || r.religionFamily }}</dd>
<dt v-if="r.code">Code</dt><dd v-if="r.code">{{ r.code }}</dd>
<dt v-if="r.code">{{ $t('neighbor.list.colCode') }}</dt><dd v-if="r.code">{{ r.code }}</dd>
</dl>
</div>
</div>