fix(i18n): fix 5 P1/P2 bugs — timeAgo count, community widget, Linux AppImage, locale gaps, lang normalization

- Fix relative-time {{count}} placeholders in all 12 locales (5m ago, not m ago)
- Localize CommunityWidget: replace 3 hardcoded English strings with t() calls
- Add Linux AppImage to tech/finance Tauri configs, CI matrix (ubuntu-22.04), packaging scripts, and download-node.sh
- Fix language code normalization: add supportedLngs/nonExplicitSupportedLngs to i18next, normalize getCurrentLanguage()
- Translate ~240 untranslated English strings across 11 locale files (ru/ar/zh now 100% translated)
- Add components.community section to all 12 locales
- All 12 locales at 1130-key parity, 0 placeholder mismatches
This commit is contained in:
Elie Habib
2026-02-18 07:16:47 +04:00
parent 2ed199a6e0
commit 71d0a5a4d6
19 changed files with 422 additions and 330 deletions
+11
View File
@@ -50,6 +50,11 @@ jobs:
node_target: 'x86_64-pc-windows-msvc'
label: 'Windows-x64'
timeout: 120
- platform: 'ubuntu-22.04'
args: ''
node_target: 'x86_64-unknown-linux-gnu'
label: 'Linux-x64'
timeout: 120
runs-on: ${{ matrix.platform }}
name: Build (${{ matrix.label }})
@@ -80,6 +85,12 @@ jobs:
workspaces: './src-tauri -> target'
cache-on-failure: true
- name: Install Linux system dependencies
if: contains(matrix.platform, 'ubuntu')
run: |
sudo apt-get update
sudo apt-get install -y libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf
- name: Install frontend dependencies
run: npm ci
+5 -4
View File
@@ -19,16 +19,16 @@ const sign = hasFlag('sign');
const skipNodeRuntime = hasFlag('skip-node-runtime');
const showHelp = hasFlag('help') || hasFlag('h');
const validOs = new Set(['macos', 'windows']);
const validOs = new Set(['macos', 'windows', 'linux']);
const validVariants = new Set(['full', 'tech']);
if (showHelp) {
console.log('Usage: npm run desktop:package -- --os <macos|windows> --variant <full|tech> [--sign] [--skip-node-runtime]');
console.log('Usage: npm run desktop:package -- --os <macos|windows|linux> --variant <full|tech> [--sign] [--skip-node-runtime]');
process.exit(0);
}
if (!validOs.has(os)) {
console.error('Usage: npm run desktop:package -- --os <macos|windows> --variant <full|tech> [--sign] [--skip-node-runtime]');
console.error('Usage: npm run desktop:package -- --os <macos|windows|linux> --variant <full|tech> [--sign] [--skip-node-runtime]');
process.exit(1);
}
@@ -37,7 +37,7 @@ if (!validVariants.has(variant)) {
process.exit(1);
}
const bundles = os === 'macos' ? 'app,dmg' : 'nsis,msi';
const bundles = os === 'macos' ? 'app,dmg' : os === 'linux' ? 'appimage' : 'nsis,msi';
const env = {
...process.env,
VITE_VARIANT: variant,
@@ -60,6 +60,7 @@ if (variant === 'tech') {
const resolveNodeTarget = () => {
if (env.NODE_TARGET) return env.NODE_TARGET;
if (os === 'windows') return 'x86_64-pc-windows-msvc';
if (os === 'linux') return 'x86_64-unknown-linux-gnu';
if (os === 'macos') {
if (process.arch === 'arm64') return 'aarch64-apple-darwin';
if (process.arch === 'x64') return 'x86_64-apple-darwin';
+13
View File
@@ -14,6 +14,7 @@ Supported targets:
- x86_64-pc-windows-msvc
- x86_64-apple-darwin
- aarch64-apple-darwin
- x86_64-unknown-linux-gnu
Environment:
NODE_VERSION Node.js version to bundle (default: 22.14.0)
@@ -70,6 +71,9 @@ if [[ -z "${TARGET}" ]]; then
;;
esac
;;
Linux)
TARGET="x86_64-unknown-linux-gnu"
;;
*)
echo "Unsupported RUNNER_OS: ${RUNNER_OS}" >&2
exit 1
@@ -91,6 +95,9 @@ if [[ -z "${TARGET}" ]]; then
;;
esac
;;
Linux)
TARGET="x86_64-unknown-linux-gnu"
;;
MINGW*|MSYS*|CYGWIN*|Windows_NT)
TARGET="x86_64-pc-windows-msvc"
;;
@@ -122,6 +129,12 @@ case "${TARGET}" in
NODE_RELATIVE_PATH="bin/node"
OUTPUT_NAME="node"
;;
x86_64-unknown-linux-gnu)
DIST_NAME="node-v${NODE_VERSION}-linux-x64"
ARCHIVE_NAME="${DIST_NAME}.tar.gz"
NODE_RELATIVE_PATH="bin/node"
OUTPUT_NAME="node"
;;
*)
echo "Unsupported target: ${TARGET}" >&2
exit 1
+2 -1
View File
@@ -17,7 +17,8 @@
"app",
"dmg",
"nsis",
"msi"
"msi",
"appimage"
],
"macOS": {
"hardenedRuntime": true
+2 -1
View File
@@ -17,7 +17,8 @@
"app",
"dmg",
"nsis",
"msi"
"msi",
"appimage"
],
"macOS": {
"hardenedRuntime": true
+5 -3
View File
@@ -1,3 +1,5 @@
import { t } from '@/services/i18n';
const DISMISSED_KEY = 'wm-community-dismissed';
const DISCUSSION_URL = 'https://github.com/koala73/worldmonitor/discussions/94';
@@ -9,11 +11,11 @@ export function mountCommunityWidget(): void {
widget.innerHTML = `
<div class="cw-pill">
<div class="cw-dot"></div>
<span class="cw-text">Join the Discussion</span>
<a class="cw-cta" href="${DISCUSSION_URL}" target="_blank" rel="noopener">Open Discussion</a>
<span class="cw-text">${t('components.community.joinDiscussion')}</span>
<a class="cw-cta" href="${DISCUSSION_URL}" target="_blank" rel="noopener">${t('components.community.openDiscussion')}</a>
<button class="cw-close" aria-label="Close">&times;</button>
</div>
<button class="cw-dismiss">Don't show again</button>
<button class="cw-dismiss">${t('components.community.dontShowAgain')}</button>
`;
const dismiss = () => {
+15 -10
View File
@@ -39,9 +39,9 @@
"conflictEvents": "أحداث نزاع"
},
"timeAgo": {
"m": "د مضت",
"h": "س مضت",
"d": "ي مضت"
"m": "{{count}}د مضت",
"h": "{{count}}س مضت",
"d": "{{count}}ي مضت"
},
"infra": {
"pipeline": "خطوط أنابيب",
@@ -346,9 +346,9 @@
"conflictEvents": "أحداث نزاع"
},
"timeAgo": {
"m": "د مضت",
"h": "س مضت",
"d": "ي مضت"
"m": "{{count}}د مضت",
"h": "{{count}}س مضت",
"d": "{{count}}ي مضت"
},
"infra": {
"pipeline": "خطوط أنابيب",
@@ -507,6 +507,11 @@
"base": "قاعدة",
"nuclear": "نووي"
},
"community": {
"joinDiscussion": "انضم إلى النقاش",
"openDiscussion": "فتح النقاش",
"dontShowAgain": "عدم العرض مجدداً"
},
"threatLabels": {
"critical": "حرج",
"high": "عال",
@@ -1081,10 +1086,10 @@
"viewUSGS": "عرض على USGS",
"expired": "منتهي الصلاحية",
"timeAgo": {
"s": "ث مضت",
"m": "د مضت",
"h": "س مضت",
"d": "ي مضت"
"s": "{{count}}ث مضت",
"m": "{{count}}د مضت",
"h": "{{count}}س مضت",
"d": "{{count}}ي مضت"
},
"cableAdvisory": {
"reported": "مُبلّغ",
+64 -59
View File
@@ -39,9 +39,9 @@
"conflictEvents": "Konfliktereignisse"
},
"timeAgo": {
"m": "vor m",
"h": "vor h",
"d": "vor d"
"m": "{{count}}vor m",
"h": "{{count}}vor h",
"d": "{{count}}vor d"
},
"infra": {
"pipeline": "Pipelines",
@@ -107,7 +107,7 @@
"displacement": "UNHCR Vertreibung",
"climate": "Klima-Anomalien",
"populationExposure": "Bevölkerungsexposition",
"startups": "Startups & VC",
"startups": "Startups & Risikokapital",
"vcblogs": "VC-Einblicke und Essays",
"regionalStartups": "Globale Startup-Nachrichten",
"unicorns": "Einhorn-Tracker",
@@ -597,8 +597,8 @@
"precip": "Niederschlag",
"severityLabel": "Schwere",
"severity": {
"extreme": "EXTREME",
"moderate": "MODERATE",
"extreme": "EXTREM",
"moderate": "MÄSSIG",
"normal": "NORMAL"
},
"infoTooltip": "<strong>Klimanomalie-Monitor</strong> Temperatur- und Niederschlagsabweichungen von der 30-Tage-Basislinie. Daten von Open-Meteo (ERA5-Reanalyse).<ul><li><strong>Extrem</strong>: >5°C oder >80mm/Tag Abweichung</li><li><strong>Moderat</strong>: >3°C oder >40mm/Tag Abweichung</li></ul>Überwacht 15 konflikt-/katastrophengefährdete Zonen."
@@ -623,6 +623,11 @@
"base": "Basis",
"nuclear": "Nuklear"
},
"community": {
"joinDiscussion": "An der Diskussion teilnehmen",
"openDiscussion": "Diskussion öffnen",
"dontShowAgain": "Nicht mehr anzeigen"
},
"threatLabels": {
"critical": "KRIT",
"high": "HOCH",
@@ -631,17 +636,17 @@
"info": "INFO"
},
"pizzint": {
"title": "Pentagon Pizza Index",
"title": "Pentagon-Pizza-Index",
"tensionsTitle": "Geopolitische Spannungen",
"source": "Quelle:",
"defcon": "DEFCON {{level}}",
"updated": "Aktualisiert {{timeAgo}}",
"statusClosed": "CLOSED",
"statusSpike": "SPIKE",
"statusHigh": "HIGH",
"statusElevated": "ELEVATED",
"statusNominal": "NOMINAL",
"statusQuiet": "QUIET",
"statusClosed": "GESCHLOSSEN",
"statusSpike": "ANSTIEG",
"statusHigh": "HOCH",
"statusElevated": "ERHÖHT",
"statusNominal": "NORMAL",
"statusQuiet": "RUHIG",
"justNow": "soeben",
"minutesAgo": "Vor {{m}}m",
"hoursAgo": "Vor {{h}}h",
@@ -757,10 +762,10 @@
"more": "+{{count}} weitere Erkenntnisse",
"all": "Alle Geheimdienstergebnisse ({{count}})",
"priority": {
"critical": "CRITICAL",
"high": "HIGH",
"medium": "MEDIUM",
"low": "LOW"
"critical": "KRITISCH",
"high": "HOCH",
"medium": "MITTEL",
"low": "NIEDRIG"
},
"insights": {
"criticalDestabilization": "Kritische Destabilisierung sofortige Aufmerksamkeit",
@@ -800,9 +805,9 @@
"origins": "Ursprünge",
"hosts": "Gastgeber",
"badges": {
"crisis": "CRISIS",
"high": "HIGH",
"elevated": "ELEVATED"
"crisis": "KRISE",
"high": "HOCH",
"elevated": "ERHÖHT"
},
"country": "Land",
"status": "Status",
@@ -955,7 +960,7 @@
"centralBank": "ZENTRALBANK",
"financialHub": "FINANZZENTRUM"
},
"closed": "CLOSED"
"closed": "GESCHLOSSEN"
},
"irradiator": {
"subtitle": "Industrielle Gamma-Bestrahlungsanlage",
@@ -1080,15 +1085,15 @@
"viewUSGS": "Auf USGS ansehen",
"expired": "Abgelaufen",
"timeAgo": {
"s": "s her",
"m": "m her",
"h": "h her",
"d": "d her"
"s": "{{count}}s her",
"m": "{{count}}m her",
"h": "{{count}}h her",
"d": "{{count}}d her"
},
"updated": "Aktualisiert",
"cableAdvisory": {
"reported": "REPORTED",
"impact": "IMPACT",
"reported": "GEMELDET",
"impact": "AUSWIRKUNG",
"eta": "ETA"
},
"outage": {
@@ -1098,21 +1103,21 @@
"partial": "TEILWEISE STÖRUNG",
"disruption": "STÖRUNG"
},
"reported": "REPORTED",
"reported": "GEMELDET",
"categories": "KATEGORIEN",
"readReport": "Vollständigen Bericht lesen"
},
"datacenter": {
"status": {
"existing": "BETRIEBSFÄHIG",
"planned": "PLANNED",
"planned": "GEPLANT",
"decommissioned": "STILLGESTELLT",
"unknown": "UNKNOWN"
"unknown": "UNBEKANNT"
},
"gpuChipCount": "GPU-/CHIP-ANZAHL",
"chipType": "CHIP-TYP",
"power": "POWER",
"sector": "SECTOR",
"power": "LEISTUNG",
"sector": "SEKTOR",
"attribution": "Daten: Epoch AI GPU-Cluster",
"chips": "Chips",
"cluster": {
@@ -1120,7 +1125,7 @@
"totalChips": "GESAMT-CHIPS",
"totalPower": "GESAMTKRAFT",
"operational": "BETRIEBSFÄHIG",
"planned": "PLANNED",
"planned": "GEPLANT",
"moreDataCenters": "+ {{count}} mehr Rechenzentren",
"sampledSites": "Zeigt eine Beispielliste von {{count}}-Sites."
}
@@ -1129,20 +1134,20 @@
"tiers": {
"mega": "MEGA-HUB",
"major": "WICHTIGER HUB",
"emerging": "EMERGING",
"emerging": "AUFSTREBEND",
"hub": "HUB"
},
"unicorns": "UNICORNS"
"unicorns": "EINHÖRNER"
},
"cloudRegion": {
"provider": "PROVIDER",
"provider": "ANBIETER",
"availabilityZones": "VERFÜGBARKEITSZONEN"
},
"techHQ": {
"types": {
"faang": "GROSSE TECHNIK",
"unicorn": "UNICORN",
"public": "PUBLIC",
"unicorn": "EINHORN",
"public": "BÖRSENNOTIERT",
"tech": "TECH"
},
"marketCap": "MARKTKAP",
@@ -1154,16 +1159,16 @@
"incubator": "INKUBATOR",
"studio": "STARTUP-STUDIO"
},
"founded": "FOUNDED",
"founded": "GEGRÜNDET",
"notableAlumni": "BEMERKENSWERTE ALUMNI"
},
"techEvent": {
"days": {
"today": "TODAY",
"tomorrow": "TOMORROW",
"today": "HEUTE",
"tomorrow": "MORGEN",
"inDays": "IN {{count}} TAGEN"
},
"date": "DATE",
"date": "DATUM",
"moreInformation": "Weitere Informationen"
},
"techHQCluster": {
@@ -1192,10 +1197,10 @@
"specialOps": "Spezialoperationen",
"vip": "VIP-Transport"
},
"altitude": "ALTITUDE",
"altitude": "HÖHE",
"ground": "Boden",
"speed": "SPEED",
"heading": "HEADING",
"speed": "GESCHW.",
"heading": "KURS",
"hexCode": "HEX-CODE",
"squawk": "SQUAWK",
"attribution": "Quelle: OpenSky Network"
@@ -1203,8 +1208,8 @@
"militaryVessel": {
"aisDark": "AIS DUNKEL",
"vessel": "Schiff",
"speed": "SPEED",
"heading": "HEADING",
"speed": "GESCHW.",
"heading": "KURS",
"mmsi": "MMSI",
"hull": "RUMPF #",
"darkDescription": "⚠ Das Schiff ist dunkel geworden AIS-Signal verloren. Kann auf sensible Vorgänge hinweisen."
@@ -1218,9 +1223,9 @@
},
"moreAircraft": "+{{count}} mehr Flugzeuge",
"aircraftCount": "{{count}} FLUGZEUG",
"aircraft": "AIRCRAFT",
"activity": "ACTIVITY",
"primary": "PRIMARY",
"aircraft": "FLUGZEUGE",
"activity": "AKTIVITÄT",
"primary": "PRIMÄR",
"trackedAircraft": "KETTENFLUGZEUG",
"vesselActivity": {
"exercise": "Marineübung",
@@ -1231,13 +1236,13 @@
},
"moreVessels": "+{{count}} weitere Schiffe",
"vesselsCount": "{{count}} SCHIFFE",
"vessels": "VESSELS",
"vessels": "SCHIFFE",
"trackedVessels": "RAUPENSCHIFFE"
},
"naturalEvent": {
"closed": "CLOSED",
"active": "ACTIVE",
"reported": "REPORTED",
"closed": "GESCHLOSSEN",
"active": "AKTIV",
"reported": "GEMELDET",
"viewOnSource": "Auf {{source}} ansehen",
"attribution": "Daten: NASA EONET"
},
@@ -1247,16 +1252,16 @@
"oil": "ÖLTERMINAL",
"lng": "LNG-TERMINAL",
"naval": "MARINEHAFEN",
"mixed": "MIXED",
"bulk": "BULK"
"mixed": "GEMISCHT",
"bulk": "MASSENGUT"
},
"worldRank": "WELTRANG"
},
"spaceport": {
"status": {
"active": "ACTIVE",
"active": "AKTIV",
"construction": "KONSTRUKTION",
"inactive": "INACTIVE"
"inactive": "INAKTIV"
},
"launchActivity": "AKTIVITÄT STARTEN",
"description": "Strategische Weltraumstartanlage. Startfrequenz und Orbit-Zugangsmöglichkeiten sind wichtige geopolitische Indikatoren."
@@ -1277,7 +1282,7 @@
"specialties": "SPEZIALITÄTEN"
},
"centralBank": {
"currency": "CURRENCY"
"currency": "WÄHRUNG"
},
"commodityHub": {
"commodities": "WAREN"
+15 -10
View File
@@ -39,9 +39,9 @@
"conflictEvents": "conflict events"
},
"timeAgo": {
"m": "m ago",
"h": "h ago",
"d": "d ago"
"m": "{{count}}m ago",
"h": "{{count}}h ago",
"d": "{{count}}d ago"
},
"infra": {
"pipeline": "Pipelines",
@@ -346,9 +346,9 @@
"conflictEvents": "conflict events"
},
"timeAgo": {
"m": "m ago",
"h": "h ago",
"d": "d ago"
"m": "{{count}}m ago",
"h": "{{count}}h ago",
"d": "{{count}}d ago"
},
"infra": {
"pipeline": "Pipelines",
@@ -507,6 +507,11 @@
"base": "Base",
"nuclear": "Nuclear"
},
"community": {
"joinDiscussion": "Join the Discussion",
"openDiscussion": "Open Discussion",
"dontShowAgain": "Don't show again"
},
"threatLabels": {
"critical": "CRIT",
"high": "HIGH",
@@ -1081,10 +1086,10 @@
"viewUSGS": "View on USGS",
"expired": "Expired",
"timeAgo": {
"s": "s ago",
"m": "m ago",
"h": "h ago",
"d": "d ago"
"s": "{{count}}s ago",
"m": "{{count}}m ago",
"h": "{{count}}h ago",
"d": "{{count}}d ago"
},
"cableAdvisory": {
"reported": "REPORTED",
+29 -24
View File
@@ -39,9 +39,9 @@
"conflictEvents": "eventos de conflicto"
},
"timeAgo": {
"m": "hace m",
"h": "hace h",
"d": "hace d"
"m": "{{count}}hace m",
"h": "{{count}}hace h",
"d": "{{count}}hace d"
},
"infra": {
"pipeline": "Oleoductos",
@@ -88,7 +88,7 @@
"asia": "Asia-Pacífico",
"energy": "Energía y Recursos",
"gov": "Gobierno",
"thinktanks": "Think Tanks",
"thinktanks": "Centros de Estudio",
"polymarket": "Predicciones",
"commodities": "Materias primas",
"economic": "Indicadores económicos",
@@ -444,7 +444,7 @@
"techHQ": "Sede Tech",
"accelerator": "Aceleradora",
"cloudRegion": "Región Cloud",
"datacenter": "Datacenter",
"datacenter": "Centro de datos",
"stockExchange": "Bolsa de valores",
"financialCenter": "Centro financiero",
"centralBank": "Banco central",
@@ -597,8 +597,8 @@
"precip": "Precipicio",
"severityLabel": "Gravedad",
"severity": {
"extreme": "EXTREME",
"moderate": "MODERATE",
"extreme": "EXTREMO",
"moderate": "MODERADO",
"normal": "NORMAL"
},
"infoTooltip": "<strong>Monitor de anomalías climáticas</strong> Desviaciones de temperatura y precipitación con respecto a la línea base de 30 días. Datos de Open-Meteo (reanálisis ERA5).<ul><li><strong>Extremo</strong>: >5°C o >80mm/día de desviación</li><li><strong>Moderado</strong>: >3°C o >40mm/día de desviación</li></ul>Monitorea 15 zonas propensas a conflictos/desastres."
@@ -619,10 +619,15 @@
"relatedAssets": {
"pipeline": "Ducto",
"cable": "Cable",
"datacenter": "Datacenter",
"datacenter": "Centro de datos",
"base": "Base",
"nuclear": "Nuclear"
},
"community": {
"joinDiscussion": "Únete a la discusión",
"openDiscussion": "Abrir discusión",
"dontShowAgain": "No mostrar de nuevo"
},
"threatLabels": {
"critical": "CRÍT",
"high": "ALTO",
@@ -636,12 +641,12 @@
"source": "Fuente:",
"defcon": "DEFCON {{level}}",
"updated": "Actualizado {{timeAgo}}",
"statusClosed": "CLOSED",
"statusSpike": "SPIKE",
"statusHigh": "HIGH",
"statusElevated": "ELEVATED",
"statusClosed": "CERRADO",
"statusSpike": "PICO",
"statusHigh": "ALTO",
"statusElevated": "ELEVADO",
"statusNominal": "NOMINAL",
"statusQuiet": "QUIET",
"statusQuiet": "TRANQUILO",
"justNow": "En este momento",
"minutesAgo": "Hace {{m}}m",
"hoursAgo": "Hace {{h}}h",
@@ -656,7 +661,7 @@
"playback": {
"toggleMode": "Alternar modo de reproducción",
"historicalPlayback": "Reproducción histórica",
"live": "LIVE"
"live": "EN VIVO"
},
"stablecoins": {
"pegHealth": "Salud del anclaje",
@@ -757,10 +762,10 @@
"more": "+{{count}} más hallazgos",
"all": "Todos los hallazgos de inteligencia ({{count}})",
"priority": {
"critical": "CRITICAL",
"high": "HIGH",
"medium": "MEDIUM",
"low": "LOW"
"critical": "CRÍTICO",
"high": "ALTO",
"medium": "MEDIO",
"low": "BAJO"
},
"insights": {
"criticalDestabilization": "Desestabilización crítica: atención inmediata",
@@ -801,8 +806,8 @@
"hosts": "Anfitriones",
"badges": {
"crisis": "CRISIS",
"high": "HIGH",
"elevated": "ELEVATED"
"high": "ALTO",
"elevated": "ELEVADO"
},
"country": "País",
"status": "Estado",
@@ -1080,10 +1085,10 @@
"viewUSGS": "Ver en USGS",
"expired": "Expirado",
"timeAgo": {
"s": "s atrás",
"m": "m atrás",
"h": "h atrás",
"d": "d atrás"
"s": "{{count}}s atrás",
"m": "{{count}}m atrás",
"h": "{{count}}h atrás",
"d": "{{count}}d atrás"
},
"updated": "Actualizado",
"cableAdvisory": {
+51 -46
View File
@@ -44,7 +44,7 @@
"d": "il y a {{count}}j"
},
"infra": {
"pipeline": "Pipelines",
"pipeline": "Oléoducs",
"cable": "Câbles sous-marins",
"datacenter": "Centres de données",
"base": "Bases militaires",
@@ -55,7 +55,7 @@
"header": {
"world": "MONDE",
"tech": "TECH",
"live": "LIVE",
"live": "EN DIRECT",
"search": "Recherche",
"settings": "PANNEAUX",
"sources": "SOURCES",
@@ -88,7 +88,7 @@
"asia": "Asie-Pacifique",
"energy": "Énergie & Ressources",
"gov": "Gouvernement",
"thinktanks": "Think Tanks",
"thinktanks": "Groupes de Réflexion",
"polymarket": "Prédictions",
"commodities": "Matières premières",
"economic": "Indicateurs économiques",
@@ -107,7 +107,7 @@
"displacement": "Déplacements HCR",
"climate": "Anomalies climatiques",
"populationExposure": "Exposition de la population",
"startups": "Startups & VC",
"startups": "Startups & Capital-risque",
"vcblogs": "Insights VC & Essais",
"regionalStartups": "Actualités startups mondiales",
"unicorns": "Suivi des licornes",
@@ -125,7 +125,7 @@
"events": "Événements Tech",
"serviceStatus": "État des services",
"techReadiness": "Indice de maturité technologique",
"techHubs": "Hot Tech Hubs",
"techHubs": "Pôles Technologiques",
"gccInvestments": "Investissements du CCG",
"geoHubs": "Centres géopolitiques"
},
@@ -147,7 +147,7 @@
"prediction": "Prédiction",
"conflict": "Conflit",
"base": "Base militaire",
"pipeline": "Pipeline",
"pipeline": "Oléoduc",
"cable": "Câble sous-marin",
"datacenter": "Centre de données",
"earthquake": "Séisme",
@@ -189,20 +189,20 @@
"marketMove": "Mouvement de marché expliqué",
"sectorCascade": "Cascade sectorielle",
"militarySurge": "Montée militaire",
"country": "Country:",
"scoreChange": "Score Change:",
"instabilityLevel": "Instability Level:",
"primaryDriver": "Primary Driver:",
"location": "Location:",
"eventTypes": "Event Types:",
"eventCount": "Event Count:",
"eventCountValue": "{{count}} events in 24h",
"source": "Source:",
"countriesAffected": "Countries Affected:",
"impactLevel": "Impact Level:",
"focalPoints": "CORRELATED FOCAL POINTS",
"newsCorrelation": "NEWS CORRELATION",
"viewOnMap": "View on map"
"country": "Pays :",
"scoreChange": "Évolution du score :",
"instabilityLevel": "Niveau d'instabilité :",
"primaryDriver": "Facteur principal :",
"location": "Localisation :",
"eventTypes": "Types d'événements :",
"eventCount": "Nombre d'événements :",
"eventCountValue": "{{count}} événements en 24h",
"source": "Source :",
"countriesAffected": "Pays affectés :",
"impactLevel": "Niveau d'impact :",
"focalPoints": "POINTS FOCAUX CORRÉLÉS",
"newsCorrelation": "CORRÉLATION D'ACTUALITÉS",
"viewOnMap": "Voir sur la carte"
},
"story": {
"generating": "Génération de l'histoire...",
@@ -215,8 +215,8 @@
"copied": "Copié !",
"opening": "Ouverture...",
"error": "Échec de la génération.",
"shareTitle": "Share story",
"close": "Close"
"shareTitle": "Partager l'histoire",
"close": "Fermer"
},
"mobileWarning": {
"title": "Vue Mobile",
@@ -232,8 +232,8 @@
"macIntel": "macOS (Intel)",
"windows": "Windows (.exe)",
"dismiss": "Ignorer",
"showAllPlatforms": "Show all platforms",
"showLess": "Show less"
"showAllPlatforms": "Afficher toutes les plateformes",
"showLess": "Afficher moins"
},
"runtimeConfig": {
"title": "Configuration Bureau",
@@ -308,7 +308,7 @@
"fresh": "Frais",
"noMarkets": "Aucun marché de prédiction trouvé",
"predictionMarkets": "Marchés de Prédiction",
"unavailable": "AI brief unavailable — configure GROQ_API_KEY in Settings."
"unavailable": "Briefing IA indisponible — configurez GROQ_API_KEY dans les Paramètres."
},
"countryBrief": {
"components": {
@@ -343,15 +343,15 @@
"infrastructure": "Exposition aux infrastructures",
"briefUnavailable": "Brief AI indisponible configurez GROQ_API_KEY dans Paramètres.",
"cached": "En cache",
"fresh": "Fresh",
"fresh": "Récent",
"noMarkets": "Aucun marché de prédiction trouvé",
"timeAgo": {
"m": "m ago",
"h": "h ago",
"d": "d ago"
"m": "il y a {{count}}m",
"h": "il y a {{count}}h",
"d": "il y a {{count}}j"
},
"infra": {
"pipeline": "Pipelines",
"pipeline": "Oléoducs",
"cable": "Câbles sous-marins",
"datacenter": "Centres de données",
"base": "Bases militaires",
@@ -384,7 +384,7 @@
"emptyDeadlines": "Aucune échéance à venir dans les 12 prochains mois",
"keyProvisions": "Dispositions Clés",
"learnMore": "En savoir plus",
"active": "Active",
"active": "Actif",
"proposed": "Proposée",
"updated": "Mis à jour"
},
@@ -444,7 +444,7 @@
},
"playback": {
"toggleMode": "Basculer le mode lecture",
"live": "LIVE",
"live": "EN DIRECT",
"historicalPlayback": "Lecture historique"
},
"pizzint": {
@@ -501,12 +501,17 @@
"sourceRef": "Source [{{n}}]"
},
"relatedAssets": {
"pipeline": "Pipeline",
"pipeline": "Oléoduc",
"cable": "Câble",
"datacenter": "Datacenter",
"datacenter": "Centre de données",
"base": "Base",
"nuclear": "Nucléaire"
},
"community": {
"joinDiscussion": "Rejoindre la discussion",
"openDiscussion": "Ouvrir la discussion",
"dontShowAgain": "Ne plus afficher"
},
"threatLabels": {
"critical": "CRIT",
"high": "HAUT",
@@ -524,7 +529,7 @@
"techHQ": "Siège Tech",
"accelerator": "Accélérateur",
"cloudRegion": "Région Cloud",
"datacenter": "Datacenter",
"datacenter": "Centre de données",
"stockExchange": "Bourse",
"financialCenter": "Centre financier",
"centralBank": "Banque centrale",
@@ -598,7 +603,7 @@
"techEventsCount": "{{count}} événements techniques",
"dataCentersCount": "{{count}} centres de données",
"underseaCable": "Câble sous-marin",
"pipeline": "Pipeline",
"pipeline": "Oléoduc",
"conflictZone": "Zone de conflit",
"naturalEvent": "Événement naturel",
"financialCenter": "place financière",
@@ -693,13 +698,13 @@
"noImpacts": "Aucun impact pays détecté",
"filters": {
"cables": "Câbles",
"pipelines": "Pipelines",
"pipelines": "Oléoducs",
"ports": "Ports",
"chokepoints": "Points d'étranglement"
},
"filterType": {
"cable": "câble",
"pipeline": "pipeline",
"pipeline": "oléoduc",
"port": "port",
"chokepoint": "point d'étranglement",
"country": "pays"
@@ -708,15 +713,15 @@
"analyzeImpact": "Analyser l'impact",
"impactLevels": {
"critical": "critique",
"high": "high",
"medium": "medium",
"high": "élevé",
"medium": "moyen",
"low": "faible"
},
"capacityPercent": "Capacité {{percent}}%",
"noCountryImpacts": "Aucun impact pays détecté",
"alternativeRoutes": "Itinéraires alternatifs",
"countriesAffected": "Pays concernés ({{count}})",
"links": "links",
"links": "liens",
"selectInfrastructureHint": "Sélectionnez linfrastructure pour analyser limpact en cascade",
"infoTooltip": "<strong>Analyse en cascade</strong> Modélise les dépendances de l'infrastructure :<ul><li>Câbles sous-marins, pipelines, ports, points d'étranglement</li><li>Sélectionner l'infrastructure pour simuler une panne</li><li>Affiche les pays touchés et la perte de capacité</li><li>Identifie les itinéraires redondants</li></ul>Données provenant de sources TeleGeography et industrielles."
},
@@ -772,7 +777,7 @@
},
"displacement": {
"noData": "Aucune donnée",
"refugees": "Refugees",
"refugees": "Réfugs",
"asylumSeekers": "Demandeurs d'asile",
"idps": "personnes déplacées",
"total": "Total",
@@ -796,7 +801,7 @@
"severityLabel": "Gravité",
"severity": {
"extreme": "EXTRÊME",
"moderate": "MODERATE",
"moderate": "MODÉRÉ",
"normal": "NORMALE"
},
"infoTooltip": "<strong>Moniteur des anomalies climatiques</strong> Écarts de température et de précipitations par rapport à la référence de 30 jours. Données d'Open-Meteo (réanalyse ERA5).<ul><li><strong>Extrême</strong> : >5 °C ou >80 mm/jour d'écart</li><li><strong>Modéré</strong> : >3 °C ou >40 mm/jour déviation</li></ul>Surveille 15 zones sujettes aux conflits/catastrophes."
@@ -830,7 +835,7 @@
"priority": {
"critical": "CRITIQUE",
"high": "HAUT",
"medium": "MEDIUM",
"medium": "MOYEN",
"low": "FAIBLE"
},
"insights": {
@@ -1085,7 +1090,7 @@
"h": "il y a {{count}}h",
"d": "il y a {{count}}j"
},
"updated": "Updated",
"updated": "Mis à jour",
"cableAdvisory": {
"reported": "RAPPORTÉ",
"impact": "IMPACT",
@@ -1478,7 +1483,7 @@
"exportImage": "Exporter l'image",
"selectAll": "Sélectionner tout",
"selectNone": "Sélectionnez Aucun",
"noDataAvailable": "No data available",
"noDataAvailable": "Aucune donnée disponible",
"new": "NOUVEAU",
"live": "EN DIRECT",
"cached": "EN CACHE",
+22 -17
View File
@@ -39,9 +39,9 @@
"conflictEvents": "eventi di conflitto"
},
"timeAgo": {
"m": "m fa",
"h": "h fa",
"d": "g fa"
"m": "{{count}}m fa",
"h": "{{count}}h fa",
"d": "{{count}}g fa"
},
"infra": {
"pipeline": "Oleodotti",
@@ -55,7 +55,7 @@
"header": {
"world": "MONDO",
"tech": "TECH",
"live": "LIVE",
"live": "IN DIRETTA",
"search": "Cerca",
"settings": "PANNELLI",
"sources": "FONTI",
@@ -444,7 +444,7 @@
"techHQ": "Sede Tech",
"accelerator": "Acceleratore",
"cloudRegion": "Regione Cloud",
"datacenter": "Datacenter",
"datacenter": "Centro dati",
"stockExchange": "Borsa valori",
"financialCenter": "Centro finanziario",
"centralBank": "Banca centrale",
@@ -619,10 +619,15 @@
"relatedAssets": {
"pipeline": "Gasdotto",
"cable": "Cavo",
"datacenter": "Datacenter",
"datacenter": "Centro dati",
"base": "Base",
"nuclear": "Nucleare"
},
"community": {
"joinDiscussion": "Unisciti alla discussione",
"openDiscussion": "Apri discussione",
"dontShowAgain": "Non mostrare più"
},
"threatLabels": {
"critical": "CRIT",
"high": "ALTO",
@@ -636,12 +641,12 @@
"source": "Fonte:",
"defcon": "DEFCON {{level}}",
"updated": "Aggiornato {{timeAgo}}",
"statusClosed": "CLOSED",
"statusSpike": "SPIKE",
"statusHigh": "HIGH",
"statusElevated": "ELEVATED",
"statusNominal": "NOMINAL",
"statusQuiet": "QUIET",
"statusClosed": "CHIUSO",
"statusSpike": "PICCO",
"statusHigh": "ALTO",
"statusElevated": "ELEVATO",
"statusNominal": "NOMINALE",
"statusQuiet": "CALMO",
"justNow": "proprio adesso",
"minutesAgo": "{{m}}m fa",
"hoursAgo": "{{h}}h fa",
@@ -656,7 +661,7 @@
"playback": {
"toggleMode": "Attiva/disattiva la modalità di riproduzione",
"historicalPlayback": "Riproduzione storica",
"live": "LIVE"
"live": "IN DIRETTA"
},
"stablecoins": {
"pegHealth": "Salute dell'ancoraggio",
@@ -1080,10 +1085,10 @@
"viewUSGS": "Visualizza su USGS",
"expired": "Scaduto",
"timeAgo": {
"s": "s fa",
"m": "m fa",
"h": "h fa",
"d": "d fa"
"s": "{{count}}s fa",
"m": "{{count}}m fa",
"h": "{{count}}h fa",
"d": "{{count}}d fa"
},
"updated": "Aggiornato",
"cableAdvisory": {
+31 -26
View File
@@ -399,7 +399,7 @@
"advisory": "Adviserend",
"repairShip": "Reparatie schip",
"internetOutage": "Internetstoring",
"medium": "medium",
"medium": "gemiddeld",
"news": "Nieuws",
"undisclosed": "Niet openbaar gemaakt",
"stake": "inzet"
@@ -475,13 +475,13 @@
"climate": {
"noAnomalies": "Er zijn geen significante afwijkingen gedetecteerd",
"zone": "Zone",
"temp": "Temp",
"temp": "Temp.",
"precip": "Neerslag",
"severityLabel": "Ernst",
"severity": {
"extreme": "EXTREME",
"moderate": "MODERATE",
"normal": "NORMAL"
"extreme": "EXTREEM",
"moderate": "MATIG",
"normal": "NORMAAL"
},
"infoTooltip": "<strong>Klimaatafwijkingsmonitor</strong> Temperatuur- en neerslagafwijkingen ten opzichte van de basislijn van 30 dagen. Gegevens uit Open-Meteo (heranalyse van ERA5).<ul><li><strong>Extreem</strong>: afwijking van >5°C of >80 mm/dag</li><li><strong>Gemiddeld</strong>: afwijking van >3°C of >40 mm/dag</li></ul>Bewaakt 15 conflict-/rampgevoelige zones."
},
@@ -505,6 +505,11 @@
"base": "Basis",
"nuclear": "Nucleair"
},
"community": {
"joinDiscussion": "Doe mee aan de discussie",
"openDiscussion": "Open discussie",
"dontShowAgain": "Niet meer tonen"
},
"threatLabels": {
"critical": "KRIT",
"high": "HOOG",
@@ -518,12 +523,12 @@
"source": "Bron:",
"defcon": "DEFCON {{level}}",
"updated": "Bijgewerkt {{timeAgo}}",
"statusClosed": "CLOSED",
"statusSpike": "SPIKE",
"statusHigh": "HIGH",
"statusElevated": "ELEVATED",
"statusNominal": "NOMINAL",
"statusQuiet": "QUIET",
"statusClosed": "GESLOTEN",
"statusSpike": "PIEK",
"statusHigh": "HOOG",
"statusElevated": "VERHOOGD",
"statusNominal": "NOMINAAL",
"statusQuiet": "RUSTIG",
"justNow": "zojuist",
"minutesAgo": "{{m}}m geleden",
"hoursAgo": "{{h}}u geleden",
@@ -608,7 +613,7 @@
"impactLevels": {
"critical": "kritisch",
"high": "hoog",
"medium": "medium",
"medium": "gemiddeld",
"low": "laag"
},
"capacityPercent": "{{percent}}% capaciteit",
@@ -634,10 +639,10 @@
"more": "+{{count}} meer bevindingen",
"all": "Alle inlichtingenbevindingen ({{count}})",
"priority": {
"critical": "CRITICAL",
"high": "HIGH",
"medium": "MEDIUM",
"low": "LOW"
"critical": "KRITIEK",
"high": "HOOG",
"medium": "GEMIDDELD",
"low": "LAAG"
},
"insights": {
"criticalDestabilization": "Kritische destabilisatie - onmiddellijke aandacht",
@@ -691,8 +696,8 @@
"hosts": "Gastheren",
"badges": {
"crisis": "CRISIS",
"high": "HIGH",
"elevated": "ELEVATED"
"high": "HOOG",
"elevated": "VERHOOGD"
},
"country": "Land",
"status": "Status",
@@ -1011,10 +1016,10 @@
"viewUSGS": "Bekijk op USGS",
"expired": "Verlopen",
"timeAgo": {
"s": "s geleden",
"m": "m geleden",
"h": "u geleden",
"d": "d geleden"
"s": "{{count}}s geleden",
"m": "{{count}}m geleden",
"h": "{{count}}u geleden",
"d": "{{count}}d geleden"
},
"updated": "Bijgewerkt",
"cableAdvisory": {
@@ -1137,7 +1142,7 @@
"speed": "SNELHEID",
"heading": "RUBRIEK",
"mmsi": "MMSI",
"hull": "HULL #",
"hull": "ROMP #",
"darkDescription": "⚠ Het schip is donker geworden - AIS-signaal verloren. Kan duiden op gevoelige operaties."
},
"militaryCluster": {
@@ -1416,15 +1421,15 @@
"ago": "{{time}} geleden"
},
"header": {
"world": "WORLD",
"world": "WERELD",
"tech": "TECH",
"viewOnGitHub": "Bekijk op GitHub",
"live": "LIVE",
"search": "Zoekopdracht",
"copyLink": "Kopieer link",
"fullscreen": "Volledig scherm",
"settings": "PANELS",
"sources": "SOURCES",
"settings": "PANELEN",
"sources": "BRONNEN",
"pinMap": "Kaart bovenaan vastzetten",
"filterSources": "Bronnen filteren...",
"sourcesEnabled": "{{enabled}}/{{total}} ingeschakeld",
+31 -26
View File
@@ -39,9 +39,9 @@
"conflictEvents": "wydarzenia konfliktowe"
},
"timeAgo": {
"m": "m temu",
"h": "h temu",
"d": "d temu"
"m": "{{count}}m temu",
"h": "{{count}}h temu",
"d": "{{count}}d temu"
},
"infra": {
"pipeline": "Rurociągi",
@@ -593,13 +593,13 @@
"climate": {
"noAnomalies": "Nie wykryto żadnych znaczących anomalii",
"zone": "Strefa",
"temp": "Temp",
"temp": "Temp.",
"precip": "Opad",
"severityLabel": "Powaga",
"severity": {
"extreme": "EXTREME",
"moderate": "MODERATE",
"normal": "NORMAL"
"extreme": "EKSTREMALNY",
"moderate": "UMIARKOWANY",
"normal": "NORMALNY"
},
"infoTooltip": "<strong>Monitor anomalii klimatycznych</strong> Odchylenia temperatury i opadów od 30-dniowej wartości bazowej. Dane z Open-Meteo (ponowna analiza ERA5).<ul><li><strong>Ekstremalne</strong>: >5°C lub >80mm/dzień odchylenie</li><li><strong>Umiarkowane</strong>: >3°C lub >40mm/dzień odchylenie</li></ul>Monitoruje 15 stref konfliktów/podatnych na katastrofy."
},
@@ -623,6 +623,11 @@
"base": "Baza",
"nuclear": "Obiekt jądrowy"
},
"community": {
"joinDiscussion": "Dołącz do dyskusji",
"openDiscussion": "Otwórz dyskusję",
"dontShowAgain": "Nie pokazuj ponownie"
},
"threatLabels": {
"critical": "KRYT",
"high": "WYS",
@@ -636,12 +641,12 @@
"source": "Źródło:",
"defcon": "DEFCON {{level}}",
"updated": "Zaktualizowano {{timeAgo}}",
"statusClosed": "CLOSED",
"statusSpike": "SPIKE",
"statusHigh": "HIGH",
"statusElevated": "ELEVATED",
"statusNominal": "NOMINAL",
"statusQuiet": "QUIET",
"statusClosed": "ZAMKNIĘTE",
"statusSpike": "SKOK",
"statusHigh": "WYSOKI",
"statusElevated": "PODWYŻSZONY",
"statusNominal": "NOMINALNY",
"statusQuiet": "SPOKOJNY",
"justNow": "właśnie",
"minutesAgo": "{{m}}m temu",
"hoursAgo": "{{h}}h temu",
@@ -656,7 +661,7 @@
"playback": {
"toggleMode": "Przełącz tryb odtwarzania",
"historicalPlayback": "Odtwarzanie historyczne",
"live": "LIVE"
"live": "NA ŻYWO"
},
"stablecoins": {
"pegHealth": "Stabilność powiązania",
@@ -757,10 +762,10 @@
"more": "+{{count}} więcej ustaleń",
"all": "Wszystkie ustalenia wywiadowcze ({{count}})",
"priority": {
"critical": "CRITICAL",
"high": "HIGH",
"medium": "MEDIUM",
"low": "LOW"
"critical": "KRYTYCZNY",
"high": "WYSOKI",
"medium": "ŚREDNI",
"low": "NISKI"
},
"insights": {
"criticalDestabilization": "Krytyczna destabilizacja natychmiastowa uwaga",
@@ -800,9 +805,9 @@
"origins": "Początki",
"hosts": "Zastępy niebieskie",
"badges": {
"crisis": "CRISIS",
"high": "HIGH",
"elevated": "ELEVATED"
"crisis": "KRYZYS",
"high": "WYSOKI",
"elevated": "PODWYŻSZONY"
},
"country": "Kraj",
"status": "Status",
@@ -1080,10 +1085,10 @@
"viewUSGS": "Zobacz na USGS",
"expired": "Wygasły",
"timeAgo": {
"s": "s temu",
"m": "m temu",
"h": "h temu",
"d": "d temu"
"s": "{{count}}s temu",
"m": "{{count}}m temu",
"h": "{{count}}h temu",
"d": "{{count}}d temu"
},
"updated": "Zaktualizowano",
"cableAdvisory": {
@@ -1400,7 +1405,7 @@
"cascadeAlert": "Alert kaskady infrastruktury",
"infraAlert": "Alert infrastruktury: {{name}}",
"countriesAffected": "{{count}} krajów dotkniętych, największy wpływ: {{impact}}",
"alert": "Alert: {{location}}",
"alert": "Alarm: {{location}}",
"multipleRegions": "Wiele regionów",
"trending": "\"{{term}}\" w trendach — {{count}} wzmianek w {{hours}}h",
"eventsDetected": "{{count}} zdarzeń wykrytych w regionie ({{lat}}°, {{lon}}°)"
+29 -24
View File
@@ -479,8 +479,8 @@
"precip": "Precipício",
"severityLabel": "Gravidade",
"severity": {
"extreme": "EXTREME",
"moderate": "MODERATE",
"extreme": "EXTREMO",
"moderate": "MODERADO",
"normal": "NORMAL"
},
"infoTooltip": "<strong>Climate Anomaly Monitor</strong> Temperature and precipitation deviations from 30-day baseline. Dados do Open-Meteo (reanálise ERA5).<ul><li><strong>Extremo</strong>: >5°C ou >80mm/dia de desvio</li><li><strong>Moderado</strong>: >3°C ou >40mm/dia de desvio</li></ul>Monitora 15 zonas propensas a conflitos/desastres."
@@ -505,6 +505,11 @@
"base": "Base",
"nuclear": "Nuclear"
},
"community": {
"joinDiscussion": "Junte-se à discussão",
"openDiscussion": "Abrir discussão",
"dontShowAgain": "Não mostrar novamente"
},
"threatLabels": {
"critical": "CRÍT",
"high": "ALTO",
@@ -518,12 +523,12 @@
"source": "Fonte:",
"defcon": "DEFCON{{level}}",
"updated": "Atualizado {{timeAgo}}",
"statusClosed": "CLOSED",
"statusSpike": "SPIKE",
"statusHigh": "HIGH",
"statusElevated": "ELEVATED",
"statusClosed": "FECHADO",
"statusSpike": "PICO",
"statusHigh": "ALTO",
"statusElevated": "ELEVADO",
"statusNominal": "NOMINAL",
"statusQuiet": "QUIET",
"statusQuiet": "CALMO",
"justNow": "agora mesmo",
"minutesAgo": "{{m}}m atrás",
"hoursAgo": "{{h}}h atrás",
@@ -634,10 +639,10 @@
"more": "+{{count}} mais descobertas",
"all": "Todas as descobertas de inteligência ({{count}})",
"priority": {
"critical": "CRITICAL",
"high": "HIGH",
"medium": "MEDIUM",
"low": "LOW"
"critical": "CRÍTICO",
"high": "ALTO",
"medium": "MÉDIO",
"low": "BAIXO"
},
"insights": {
"criticalDestabilization": "Desestabilização crítica atenção imediata",
@@ -690,9 +695,9 @@
"origins": "Origens",
"hosts": "Anfitriões",
"badges": {
"crisis": "CRISIS",
"high": "HIGH",
"elevated": "ELEVATED"
"crisis": "CRISE",
"high": "ALTO",
"elevated": "ELEVADO"
},
"country": "País",
"status": "Status",
@@ -1011,14 +1016,14 @@
"viewUSGS": "Ver no USGS",
"expired": "Expirado",
"timeAgo": {
"s": "s atrás",
"m": "m atrás",
"h": "h atrás",
"d": "d atrás"
"s": "{{count}}s atrás",
"m": "{{count}}m atrás",
"h": "{{count}}h atrás",
"d": "{{count}}d atrás"
},
"updated": "Atualizado",
"cableAdvisory": {
"reported": "REPORTED",
"reported": "REPORTADO",
"impact": "IMPACTO",
"eta": "HEC"
},
@@ -1060,7 +1065,7 @@
"tiers": {
"mega": "MEGA CENTRO",
"major": "CENTRO PRINCIPAL",
"emerging": "EMERGING",
"emerging": "EMERGENTE",
"hub": "EIXO"
},
"unicorns": "UNICÓRNIOS"
@@ -1416,15 +1421,15 @@
"ago": "{{time}} atrás"
},
"header": {
"world": "WORLD",
"world": "MUNDO",
"tech": "TECH",
"viewOnGitHub": "Ver no GitHub",
"live": "LIVE",
"live": "AO VIVO",
"search": "Procurar",
"copyLink": "Copiar link",
"fullscreen": "Tela cheia",
"settings": "PANELS",
"sources": "SOURCES",
"settings": "PAINÉIS",
"sources": "FONTES",
"pinMap": "Fixar mapa no topo",
"filterSources": "Filtrar fontes...",
"sourcesEnabled": "{{enabled}}/{{total}} ativado",
+19 -14
View File
@@ -39,9 +39,9 @@
"conflictEvents": "конфликтные события"
},
"timeAgo": {
"m": "м назад",
"h": "ч назад",
"d": "д назад"
"m": "{{count}}м назад",
"h": "{{count}}ч назад",
"d": "{{count}}д назад"
},
"infra": {
"pipeline": "Трубопроводы",
@@ -55,7 +55,7 @@
"header": {
"world": "МИР",
"tech": "ТЕХНО",
"live": "LIVE",
"live": "ПРЯМОЙ ЭФИР",
"search": "Поиск",
"settings": "ПАНЕЛИ",
"sources": "ИСТОЧНИКИ",
@@ -346,9 +346,9 @@
"conflictEvents": "конфликтные события"
},
"timeAgo": {
"m": "м назад",
"h": "ч назад",
"d": "д назад"
"m": "{{count}}м назад",
"h": "{{count}}ч назад",
"d": "{{count}}д назад"
},
"infra": {
"pipeline": "Трубопроводы",
@@ -444,7 +444,7 @@
},
"playback": {
"toggleMode": "Переключить режим воспроизведения",
"live": "LIVE",
"live": "ПРЯМОЙ ЭФИР",
"historicalPlayback": "Историческое воспроизведение"
},
"pizzint": {
@@ -507,6 +507,11 @@
"base": "База",
"nuclear": "Ядерный"
},
"community": {
"joinDiscussion": "Присоединиться к обсуждению",
"openDiscussion": "Открыть обсуждение",
"dontShowAgain": "Больше не показывать"
},
"threatLabels": {
"critical": "КРИТ",
"high": "ВЫС",
@@ -1081,10 +1086,10 @@
"viewUSGS": "Смотреть на USGS",
"expired": "Истёк",
"timeAgo": {
"s": "с назад",
"m": "м назад",
"h": "ч назад",
"d": "д назад"
"s": "{{count}}с назад",
"m": "{{count}}м назад",
"h": "{{count}}ч назад",
"d": "{{count}}д назад"
},
"cableAdvisory": {
"reported": "ЗАФИКСИРОВАНО",
@@ -1197,7 +1202,7 @@
"speed": "СКОРОСТЬ",
"heading": "КУРС",
"hexCode": "HEX-КОД",
"squawk": "SQUAWK",
"squawk": "СКВОК",
"attribution": "Источник: OpenSky Network"
},
"militaryVessel": {
@@ -1480,7 +1485,7 @@
"shareStory": "Поделиться сюжетом",
"exportImage": "Экспорт изображения",
"new": "НОВОЕ",
"live": "LIVE",
"live": "ПРЯМОЙ ЭФИР",
"cached": "КЭШ",
"unavailable": "НЕДОСТУПНО"
}
+58 -53
View File
@@ -9,19 +9,19 @@
"status": "Systemstatus",
"insights": "AI-INSIKTER",
"map": "Interactive Map",
"techMap": "Global Tech",
"techMap": "Global Teknik",
"politics": "Världsnyheter",
"tech": "Teknologi",
"finance": "Finansiell",
"gov": "Regering",
"intel": "Intel Feed",
"intel": "Underrättelseflöde",
"middleeast": "Mellanöstern",
"layoffs": "Uppsägningar Tracker",
"ai": "AI/ML",
"startups": "Startups & VC",
"vcblogs": "VC Insights & Essays",
"startups": "Startups & Riskkapital",
"vcblogs": "Riskkapitalinsikter",
"regionalStartups": "Globala uppstartsnyheter",
"unicorns": "Unicorn Tracker",
"unicorns": "Enhörningsspårare",
"accelerators": "Acceleratorer och demodagar",
"funding": "Finansiering & VC",
"producthunt": "Produktjakt",
@@ -37,17 +37,17 @@
"latam": "Latinamerika",
"asia": "Asien-Stillahavsområdet",
"energy": "Energi & resurser",
"etfFlows": "BTC ETF Tracker",
"etfFlows": "BTC ETF-spårare",
"economic": "Ekonomiska indikatorer",
"macroSignals": "Marknadsradar",
"commodities": "Handelsvaror",
"monitors": "Mina monitorer",
"regulation": "AI Regulation Dashboard",
"regulation": "AI-regleringspanel",
"serviceStatus": "Servicestatus",
"stablecoins": "Stablecoins",
"events": "Tekniska evenemang",
"techHubs": "Hot Tech Hubs",
"techReadiness": "Tech Readiness Index",
"techHubs": "Teknikhubbar",
"techReadiness": "Teknikberedskapsindex",
"ucdpEvents": "UCDP-konflikthändelser",
"strategicRisk": "Strategisk risköversikt",
"gdeltIntel": "LIVE-INTELLIGENS",
@@ -116,7 +116,7 @@
"predictionLeading": "Förutsägelse ledande",
"newsLeading": "Företagsnyheter Leading",
"silentDivergence": "Tyst divergens",
"velocitySpike": "Velocity Spike",
"velocitySpike": "Hastighetspik",
"keywordSpike": "Nyckelord Spike",
"convergence": "Konvergens",
"triangulation": "Triangulering",
@@ -298,11 +298,11 @@
"addKeywords": "Lägg till nyckelord för att övervaka nyheter",
"noMatches": "Inga matchningar i {{count}} artiklar",
"showingMatches": "Visar {{count}} av {{total}} matchningar",
"match": "match",
"matches": "tändstickor"
"match": "träff",
"matches": "träffar"
},
"playback": {
"live": "Live",
"live": "LIVE",
"toggleMode": "Växla uppspelningsläge",
"historicalPlayback": "Historisk uppspelning"
},
@@ -340,7 +340,7 @@
},
"timeAll": "Alla",
"layers": {
"startupHubs": "Startup Hubs",
"startupHubs": "Startuphubbar",
"techHQs": "Tekniska huvudkontor",
"accelerators": "Acceleratorer",
"cloudRegions": "Molnregioner",
@@ -372,7 +372,7 @@
"stockExchanges": "Börser",
"financialCenters": "Finansiella centra",
"centralBanks": "centralbanker",
"commodityHubs": "Commodity Hubs",
"commodityHubs": "Råvaruhubbar",
"gulfInvestments": "GCC-investeringar"
},
"layersTitle": "Lager",
@@ -382,7 +382,7 @@
"militaryAircraft": "Militära flygplan",
"vesselCluster": "Fartygskluster",
"vessels": "fartyg",
"flightCluster": "Flight Cluster",
"flightCluster": "Flygkluster",
"aircraft": "flygplan",
"protest": "Protest",
"protestsCount": "{{count}} protester",
@@ -399,7 +399,7 @@
"advisory": "Rådgivande",
"repairShip": "Reparera skepp",
"internetOutage": "Internetavbrott",
"medium": "medium",
"medium": "medel",
"news": "Nyheter",
"undisclosed": "Ej avslöjad",
"stake": "insats"
@@ -475,12 +475,12 @@
"climate": {
"noAnomalies": "Inga betydande anomalier upptäcktes",
"zone": "Zon",
"temp": "Temp",
"temp": "Temp.",
"precip": "Nederbörd",
"severityLabel": "Stränghet",
"severity": {
"extreme": "EXTREME",
"moderate": "MODERATE",
"extreme": "EXTREM",
"moderate": "MÅTTLIG",
"normal": "NORMAL"
},
"infoTooltip": "<strong>Climate Anomaly Monitor</strong> Temperatur- och nederbördsavvikelser från 30-dagars baslinje. Data från Open-Meteo (ERA5-omanalys).<ul><li><strong>Extrem</strong>: >5°C eller >80 mm/dag avvikelse</li><li><strong>Måttlig</strong>: >3°C eller >40mm/dag avvikelse </li>__ eller störst_5__m/dag-avvikelse </li>__ eller högst </ul>__pron. zoner."
@@ -505,6 +505,11 @@
"base": "Bas",
"nuclear": "Kärnteknisk"
},
"community": {
"joinDiscussion": "Gå med i diskussionen",
"openDiscussion": "Öppna diskussion",
"dontShowAgain": "Visa inte igen"
},
"threatLabels": {
"critical": "KRIT",
"high": "HÖG",
@@ -518,12 +523,12 @@
"source": "Källa:",
"defcon": "DEFCON {{level}}",
"updated": "Uppdaterad {{timeAgo}}",
"statusClosed": "CLOSED",
"statusSpike": "SPIKE",
"statusHigh": "HIGH",
"statusElevated": "ELEVATED",
"statusNominal": "NOMINAL",
"statusQuiet": "QUIET",
"statusClosed": "STÄNGD",
"statusSpike": "TOPP",
"statusHigh": "HÖG",
"statusElevated": "FÖRHÖJD",
"statusNominal": "NORMAL",
"statusQuiet": "LUGN",
"justNow": "just nu",
"minutesAgo": "{{m}}m sedan",
"hoursAgo": "{{h}}h sedan",
@@ -557,10 +562,10 @@
"elapsed": "Förfluten: {{elapsed}} s",
"clickToView": "Klicka för att se {{name}} på kartan",
"units": {
"fighters": "Fighters",
"fighters": "Jaktplan",
"tankers": "Tankfartyg",
"awacs": "AWACS",
"recon": "Recon",
"recon": "Spaning",
"transport": "Transport",
"bombers": "Bombplan",
"drones": "Drönare",
@@ -594,13 +599,13 @@
"cables": "Kablar",
"pipelines": "Rörledningar",
"ports": "Hamnar",
"chokepoints": "Chokepoints"
"chokepoints": "Flaskhalsar"
},
"filterType": {
"cable": "kabel",
"pipeline": "rörledning",
"port": "hamn",
"chokepoint": "chokepoint",
"chokepoint": "flaskhals",
"country": "land"
},
"selectPrompt": "Välj {{type}}...",
@@ -608,7 +613,7 @@
"impactLevels": {
"critical": "kritisk",
"high": "hög",
"medium": "medium",
"medium": "medel",
"low": "låg"
},
"capacityPercent": "{{percent}}% kapacitet",
@@ -634,10 +639,10 @@
"more": "+{{count}} fler fynd",
"all": "Alla intelligensfynd ({{count}})",
"priority": {
"critical": "CRITICAL",
"high": "HIGH",
"medium": "MEDIUM",
"low": "LOW"
"critical": "KRITISK",
"high": "HÖG",
"medium": "MEDEL",
"low": "LÅG"
},
"insights": {
"criticalDestabilization": "Kritisk destabilisering - omedelbar uppmärksamhet",
@@ -661,7 +666,7 @@
"in": "i",
"indicators": "Indikatorer",
"oil": "Olja",
"gov": "Gov",
"gov": "Reg.",
"noOilMetrics": "Inga oljemått tillgängliga. Lägg till EIA_API_KEY för att aktivera.",
"noSpending": "Inga nya statliga utmärkelser",
"awards": "utmärkelser",
@@ -672,7 +677,7 @@
"region": "Område",
"fires": "Bränder",
"high": "Hög",
"total": "Total",
"total": "Totalt",
"never": "aldrig",
"time": {
"justNow": "just nu",
@@ -686,13 +691,13 @@
"refugees": "Flyktingar",
"asylumSeekers": "Asylsökande",
"idps": "internflyktingar",
"total": "Total",
"total": "Totalt",
"origins": "Ursprung",
"hosts": "Värdar",
"badges": {
"crisis": "CRISIS",
"high": "HIGH",
"elevated": "ELEVATED"
"crisis": "KRIS",
"high": "HÖG",
"elevated": "FÖRHÖJD"
},
"country": "Land",
"status": "Status",
@@ -816,7 +821,7 @@
"capacity": "Kapacitet",
"alerts": "Aktiva varningar",
"common": {
"start": "START",
"start": "BÖRJA",
"end": "SLUT",
"updated": "UPPDATERAD"
},
@@ -940,10 +945,10 @@
"reason": "ORSAK",
"threat": "HOT",
"aka": "Även känd som",
"sponsor": "SPONSOR",
"sponsor": "SPONSRING",
"origin": "URSPRUNG",
"country": "LAND",
"malware": "MALWARE",
"malware": "SKADLIG KOD",
"lastSeen": "SENAST SEDD",
"open": "ÖPPEN",
"tradingHours": "HANDELSTIDER",
@@ -989,7 +994,7 @@
"whyItMatters": "VARFÖR DET SPELAR ROLL",
"keyEntities": "NYCKELENTITETER",
"relatedHeadlines": "RELATERADE RUBRIKER",
"liveIntel": "Live Intelligence",
"liveIntel": "Liveunderrättelser",
"loadingNews": "Laddar globala nyheter...",
"noCoverage": "Ingen aktuell global bevakning",
"time": "Tid",
@@ -1011,10 +1016,10 @@
"viewUSGS": "Visa på USGS",
"expired": "Utgången",
"timeAgo": {
"s": "s sedan",
"m": "m sedan",
"h": "h sedan",
"d": "d sedan"
"s": "{{count}}s sedan",
"m": "{{count}}m sedan",
"h": "{{count}}h sedan",
"d": "{{count}}d sedan"
},
"updated": "Uppdaterad",
"cableAdvisory": {
@@ -1157,7 +1162,7 @@
"exercise": "Naval övning",
"deployment": "Naval utplacering",
"patrol": "Patrullverksamhet",
"transit": "Fleet Transit",
"transit": "Flottransit",
"unknown": "Sjöverksamhet"
},
"moreVessels": "+{{count}} fartyg till",
@@ -1416,15 +1421,15 @@
"ago": "{{time}} sedan"
},
"header": {
"world": "WORLD",
"world": "RLD",
"tech": "TECH",
"viewOnGitHub": "Visa på GitHub",
"live": "LIVE",
"search": "Söka",
"copyLink": "Kopiera länk",
"fullscreen": "Helskärm",
"settings": "PANELS",
"sources": "SOURCES",
"settings": "PANELER",
"sources": "KÄLLOR",
"pinMap": "Fäst kartan överst",
"filterSources": "Filtrera källor...",
"sourcesEnabled": "{{enabled}}/{{total}} aktiverad",
+15 -10
View File
@@ -39,9 +39,9 @@
"conflictEvents": "冲突事件"
},
"timeAgo": {
"m": "分钟前",
"h": "小时前",
"d": "天前"
"m": "{{count}}分钟前",
"h": "{{count}}小时前",
"d": "{{count}}天前"
},
"infra": {
"pipeline": "管道",
@@ -346,9 +346,9 @@
"conflictEvents": "冲突事件"
},
"timeAgo": {
"m": "分钟前",
"h": "小时前",
"d": "天前"
"m": "{{count}}分钟前",
"h": "{{count}}小时前",
"d": "{{count}}天前"
},
"infra": {
"pipeline": "管道",
@@ -507,6 +507,11 @@
"base": "基地",
"nuclear": "核设施"
},
"community": {
"joinDiscussion": "加入讨论",
"openDiscussion": "打开讨论",
"dontShowAgain": "不再显示"
},
"threatLabels": {
"critical": "危急",
"high": "高",
@@ -1081,10 +1086,10 @@
"viewUSGS": "在USGS上查看",
"expired": "已过期",
"timeAgo": {
"s": "秒前",
"m": "分钟前",
"h": "小时前",
"d": "天前"
"s": "{{count}}秒前",
"m": "{{count}}分钟前",
"h": "{{count}}小时前",
"d": "{{count}}天前"
},
"cableAdvisory": {
"reported": "报告时间",
+5 -2
View File
@@ -45,6 +45,8 @@ export async function initI18n(): Promise<void> {
.use(LanguageDetector)
.init({
resources,
supportedLngs: ['en', 'fr', 'de', 'es', 'it', 'pl', 'pt', 'nl', 'sv', 'ru', 'ar', 'zh'],
nonExplicitSupportedLngs: true,
fallbackLng: 'en',
debug: import.meta.env.DEV,
interpolation: {
@@ -70,9 +72,10 @@ export async function changeLanguage(lng: string): Promise<void> {
window.location.reload(); // Simple reload to update all components for now
}
// Helper to get current language
// Helper to get current language (normalized to short code)
export function getCurrentLanguage(): string {
return i18next.language || 'en';
const lang = i18next.language || 'en';
return lang.split('-')[0]!;
}
export function isRTL(): boolean {