feat(i18n): Add internationalization support
- Add i18n module with locale loading and translation helpers - Add English (en) and French (fr) locale files with comprehensive translations - Inject locale data into dashboard HTML via server - Add /api/locales endpoint for locale info - Add t() translation function to dashboard Translated elements: - Boot sequence (initialization, connecting, sweep complete) - Header pills (sweep, sources, delta, risk indicators) - Left rail panels (sensor grid, nuclear watch, risk gauges, space watch) - Layer names and descriptions - Map legend items - Lower panels (news ticker, sweep delta, macro+markets, trade ideas) - Right rail (OSINT stream) - Badges and status indicators Supported languages: English (default), French Set CRUCIX_LANG=fr to switch to French
This commit is contained in:
359
locales/en.json
Normal file
359
locales/en.json
Normal file
@@ -0,0 +1,359 @@
|
||||
{
|
||||
"meta": {
|
||||
"code": "en",
|
||||
"name": "English",
|
||||
"nativeName": "English"
|
||||
},
|
||||
"dashboard": {
|
||||
"title": "CRUCIX — Intelligence Terminal",
|
||||
"bootTitle": "CRUCIX INTELLIGENCE ENGINE",
|
||||
"bootSubtitle": "Local Palantir · 31 Sources",
|
||||
"waitingForSweep": "Waiting for first sweep...",
|
||||
"sourcesOk": "Sources OK",
|
||||
"lastSweep": "Last sweep",
|
||||
"nextSweep": "Next sweep",
|
||||
"sweep": "SWEEP",
|
||||
"sources": "SOURCES",
|
||||
"delta": "DELTA",
|
||||
"highAlert": "HIGH ALERT",
|
||||
"riskOff": "RISK-OFF",
|
||||
"riskOn": "RISK-ON",
|
||||
"mixed": "MIXED",
|
||||
"terminalActive": "TERMINAL ACTIVE",
|
||||
"perf": "PERF",
|
||||
"perfLow": "LOW",
|
||||
"perfHigh": "HIGH",
|
||||
"guideBtn": "What Signals Mean"
|
||||
},
|
||||
"boot": {
|
||||
"initializing": "INITIALIZING CRUCIX ENGINE v2.1.0",
|
||||
"connecting": "CONNECTING {count} OSINT SOURCES...",
|
||||
"sourceGroup1": "OPENSKY · FIRMS · KIWISDR · MARITIME",
|
||||
"sourceGroup2": "FRED · BLS · EIA · TREASURY · GSCPI",
|
||||
"sourceGroup3": "TELEGRAM · SAFECAST · EPA · WHO · OFAC",
|
||||
"sourceGroup4": "GDELT · NOAA · PATENTS · BLUESKY · REDDIT",
|
||||
"sourceGroup5": "USGS · ECB · CVE · COPERNICUS · CELESTRAK",
|
||||
"sweepComplete": "SWEEP COMPLETE — {ok}/{total} SOURCES",
|
||||
"ok": "OK",
|
||||
"acledLayer": "ACLED CONFLICT LAYER",
|
||||
"events": "EVENTS",
|
||||
"degraded": "DEGRADED",
|
||||
"flightCorridors": "FLIGHT CORRIDORS",
|
||||
"active": "ACTIVE",
|
||||
"dualProjection": "DUAL PROJECTION",
|
||||
"ready": "READY",
|
||||
"intelligenceSynthesis": "INTELLIGENCE SYNTHESIS"
|
||||
},
|
||||
"panels": {
|
||||
"sensorGrid": "Sensor Grid",
|
||||
"tradeIdeas": "Leverageable Ideas",
|
||||
"osintFeed": "OSINT Feed",
|
||||
"osintStream": "OSINT Stream",
|
||||
"nuclearWatch": "Nuclear Watch",
|
||||
"newsTicker": "Live News Ticker",
|
||||
"sweepDelta": "Sweep Delta",
|
||||
"macroMarkets": "Macro + Markets",
|
||||
"healthAlerts": "Health Alerts",
|
||||
"riskGauges": "Risk Gauges",
|
||||
"crossSourceSignals": "Cross-Source Signals",
|
||||
"signalCore": "Signal Core",
|
||||
"seismicWatch": "Seismic Watch",
|
||||
"cyberWatch": "Cyber Watch",
|
||||
"spaceWatch": "Space Watch",
|
||||
"europeAlerts": "Europe Alerts",
|
||||
"ecbIndicators": "ECB Indicators"
|
||||
},
|
||||
"layers": {
|
||||
"airActivity": "Air Activity",
|
||||
"thermalSpikes": "Thermal Spikes",
|
||||
"sdrCoverage": "SDR Coverage",
|
||||
"maritimeWatch": "Maritime Watch",
|
||||
"nuclearSites": "Nuclear Sites",
|
||||
"conflictEvents": "Conflict Events",
|
||||
"healthWatch": "Health Watch",
|
||||
"worldNews": "World News",
|
||||
"osintFeed": "OSINT Feed",
|
||||
"theaters": "theaters",
|
||||
"nightDet": "night det.",
|
||||
"online": "online",
|
||||
"chokepoints": "chokepoints",
|
||||
"monitors": "monitors",
|
||||
"fatalities": "fatalities",
|
||||
"whoAlerts": "WHO alerts",
|
||||
"rssGeolocated": "RSS geolocated",
|
||||
"earthquakes": "Earthquakes",
|
||||
"seismicEvents": "Seismic Events",
|
||||
"cyberVulns": "Cyber Vulnerabilities",
|
||||
"spaceActivity": "Space Activity",
|
||||
"europeEmergency": "Europe Emergency"
|
||||
},
|
||||
"map": {
|
||||
"worldNews": "World News",
|
||||
"healthAlert": "Health Alert",
|
||||
"chokepoint": "Chokepoint",
|
||||
"nuclearSite": "Nuclear Site",
|
||||
"osintEvent": "OSINT Event",
|
||||
"thermalDetection": "Thermal Detection",
|
||||
"aircraft": "Aircraft",
|
||||
"rssGeolocated": "RSS geolocated",
|
||||
"airTraffic": "Air Traffic",
|
||||
"thermalFire": "Thermal/Fire",
|
||||
"conflict": "Conflict",
|
||||
"sdrReceiver": "SDR Receiver",
|
||||
"scrollToZoom": "SCROLL TO ZOOM · DRAG TO PAN",
|
||||
"globeMode": "GLOBE MODE",
|
||||
"flatMode": "FLAT MODE",
|
||||
"earthquake": "Earthquake",
|
||||
"disaster": "Disaster",
|
||||
"weatherAlert": "Weather Alert",
|
||||
"epaRadNet": "EPA RadNet",
|
||||
"spaceStation": "Space Station",
|
||||
"gdeltEvent": "GDELT Event"
|
||||
},
|
||||
"ideas": {
|
||||
"confidence": "Confidence",
|
||||
"horizon": "Horizon",
|
||||
"risk": "Risk",
|
||||
"signals": "Signals",
|
||||
"rationale": "Rationale",
|
||||
"aiEnhanced": "AI ENHANCED",
|
||||
"llmOff": "LLM OFF",
|
||||
"pending": "PENDING",
|
||||
"llmNotConfigured": "LLM NOT CONFIGURED",
|
||||
"llmHelp": "Set LLM_PROVIDER + credentials in .env to enable AI-powered trade ideas",
|
||||
"disclosure": "FOR INFORMATIONAL PURPOSES ONLY. This is not financial advice, a recommendation to buy or sell any security, or a solicitation of any kind. All signal-based observations are derived from publicly available OSINT data and should not be relied upon for investment decisions. Consult a licensed financial advisor before making any investment. Past performance does not guarantee future results."
|
||||
},
|
||||
"regions": {
|
||||
"world": "World",
|
||||
"americas": "Americas",
|
||||
"europe": "Europe",
|
||||
"middleEast": "Middle East",
|
||||
"asiaPacific": "Asia Pacific",
|
||||
"africa": "Africa"
|
||||
},
|
||||
"badges": {
|
||||
"radiation": "RADIATION",
|
||||
"live": "LIVE",
|
||||
"delayed": "DELAYED",
|
||||
"items": "ITEMS",
|
||||
"urgent": "URGENT",
|
||||
"worldview": "WORLDVIEW",
|
||||
"hotMetrics": "HOT METRICS",
|
||||
"stress": "STRESS",
|
||||
"sweeping": "SWEEPING...",
|
||||
"europe": "EUROPE",
|
||||
"orbital": "ORBITAL"
|
||||
},
|
||||
"delta": {
|
||||
"baseline": "BASELINE",
|
||||
"escalation": "ESCALATION",
|
||||
"deescalation": "DE-ESCALATION",
|
||||
"stable": "STABLE",
|
||||
"newSignals": "New Signals",
|
||||
"resolved": "Resolved",
|
||||
"noChanges": "No changes since last sweep",
|
||||
"changes": "Changes",
|
||||
"critical": "Critical",
|
||||
"new": "NEW"
|
||||
},
|
||||
"metrics": {
|
||||
"wtiCrude": "WTI Crude",
|
||||
"brent": "Brent",
|
||||
"natGas": "Nat Gas",
|
||||
"vix": "VIX",
|
||||
"fedFunds": "Fed Funds",
|
||||
"gscpi": "GSCPI",
|
||||
"cpiMom": "CPI MoM",
|
||||
"unemployment": "Unemployment",
|
||||
"hySpread": "HY Spread",
|
||||
"usdIndex": "USD Index",
|
||||
"joblessClaims": "Jobless Claims",
|
||||
"mortgage30y": "30Y Mortgage",
|
||||
"m2Supply": "M2 Supply",
|
||||
"natDebt": "Nat. Debt",
|
||||
"wti5day": "WTI 5-DAY",
|
||||
"indexes": "INDEXES",
|
||||
"crypto": "CRYPTO",
|
||||
"energyMacro": "ENERGY + MACRO",
|
||||
"vsPrior": "vs prior",
|
||||
"ecbRate": "ECB Rate",
|
||||
"eurusd": "EUR/USD",
|
||||
"euM3": "EU M3",
|
||||
"euHicp": "EU HICP",
|
||||
"earthquakes7d": "Earthquakes (7d)",
|
||||
"criticalCves": "Critical CVEs",
|
||||
"spaceObjects": "Space Objects",
|
||||
"starlink": "Starlink",
|
||||
"europeAlerts": "EU Alerts"
|
||||
},
|
||||
"signalMetrics": {
|
||||
"incidentTempo": "Incident Tempo",
|
||||
"airTheaters": "Air Theaters",
|
||||
"thermalSpikes": "Thermal Spikes",
|
||||
"sdrNodes": "SDR Nodes",
|
||||
"chokepoints": "Chokepoints",
|
||||
"whoAlerts": "WHO Alerts"
|
||||
},
|
||||
"nuclear": {
|
||||
"allSitesNormal": "ALL SITES NORMAL",
|
||||
"anomalyDetected": "ANOMALY DETECTED",
|
||||
"noData": "No data"
|
||||
},
|
||||
"seismic": {
|
||||
"noRecentQuakes": "NO SIGNIFICANT QUAKES",
|
||||
"majorQuake": "MAJOR QUAKE DETECTED",
|
||||
"tsunamiRisk": "TSUNAMI RISK",
|
||||
"mag": "M"
|
||||
},
|
||||
"cyber": {
|
||||
"noAlerts": "NO CRITICAL CVES",
|
||||
"criticalAlert": "CRITICAL VULNERABILITIES",
|
||||
"cvss": "CVSS",
|
||||
"critical": "CRITICAL"
|
||||
},
|
||||
"space": {
|
||||
"noActivity": "NORMAL ACTIVITY",
|
||||
"launchDetected": "LAUNCH ACTIVITY",
|
||||
"objectsTracked": "objects tracked",
|
||||
"newLast30d": "new (30d)",
|
||||
"satellites": "sats",
|
||||
"recentLaunches": "Recent Launches",
|
||||
"totalTracked": "Total Tracked",
|
||||
"byCountry": "BY COUNTRY",
|
||||
"constellations": "CONSTELLATIONS",
|
||||
"launches": "launches"
|
||||
},
|
||||
"europe": {
|
||||
"noAlerts": "NO ACTIVE ALERTS",
|
||||
"activeAlerts": "ACTIVE ALERTS",
|
||||
"fires": "Fires",
|
||||
"floods": "Floods",
|
||||
"types": "types"
|
||||
},
|
||||
"time": {
|
||||
"justNow": "just now",
|
||||
"hoursAgo": "{hours}h ago",
|
||||
"daysAgo": "{days}d ago"
|
||||
},
|
||||
"bot": {
|
||||
"commands": {
|
||||
"status": "Get current system health, last sweep time, source status",
|
||||
"sweep": "Trigger a manual sweep cycle",
|
||||
"brief": "Get a compact text summary of the latest intelligence",
|
||||
"portfolio": "Show current positions and P&L (if Alpaca connected)",
|
||||
"alerts": "Show recent alert history",
|
||||
"mute": "Mute alerts for 1h (or /mute 2h, /mute 4h)",
|
||||
"unmute": "Resume alerts",
|
||||
"help": "Show available commands"
|
||||
},
|
||||
"messages": {
|
||||
"alertsMuted": "🔇 Alerts muted for {hours}h — until {time} UTC",
|
||||
"useUnmute": "Use /unmute to resume.",
|
||||
"alertsResumed": "🔔 Alerts resumed. You'll receive the next signal evaluation.",
|
||||
"sweepTriggered": "🚀 Manual sweep triggered. You'll receive alerts if anything significant is detected.",
|
||||
"sweepInProgress": "🔄 Sweep already in progress. Please wait.",
|
||||
"noDataYet": "⏳ No data yet — waiting for first sweep to complete.",
|
||||
"noRecentAlerts": "No recent alerts.",
|
||||
"recentAlerts": "📋 Recent Alerts (last {count})",
|
||||
"commandsTip": "Tip: Commands are case-insensitive",
|
||||
"commandFailed": "❌ Command failed: {error}",
|
||||
"portfolioNotAvailable": "📊 Portfolio integration requires Alpaca MCP connection.\nUse the Crucix dashboard or Claude agent for portfolio queries."
|
||||
},
|
||||
"status": {
|
||||
"title": "🖥️ CRUCIX STATUS",
|
||||
"uptime": "Uptime",
|
||||
"lastSweep": "Last sweep",
|
||||
"nextSweep": "Next sweep",
|
||||
"sweepInProgress": "Sweep in progress",
|
||||
"yes": "🔄 Yes",
|
||||
"no": "⏸️ No",
|
||||
"sources": "Sources",
|
||||
"failed": "failed",
|
||||
"llm": "LLM",
|
||||
"enabled": "✅",
|
||||
"disabled": "❌ Disabled",
|
||||
"sseClients": "SSE clients",
|
||||
"dashboard": "Dashboard",
|
||||
"pending": "pending",
|
||||
"never": "never"
|
||||
},
|
||||
"brief": {
|
||||
"title": "📋 CRUCIX BRIEF",
|
||||
"direction": "Direction",
|
||||
"changes": "changes",
|
||||
"criticalChanges": "critical",
|
||||
"osint": "📡 OSINT",
|
||||
"urgentSignals": "urgent signals",
|
||||
"totalPosts": "total posts",
|
||||
"topIdeas": "💡 Top Ideas"
|
||||
},
|
||||
"alertTiers": {
|
||||
"flash": "FLASH",
|
||||
"priority": "PRIORITY",
|
||||
"routine": "ROUTINE"
|
||||
}
|
||||
},
|
||||
"alerts": {
|
||||
"tiers": {
|
||||
"flash": {
|
||||
"label": "FLASH",
|
||||
"description": "Immediate action required — market-moving, time-critical"
|
||||
},
|
||||
"priority": {
|
||||
"label": "PRIORITY",
|
||||
"description": "Important signal cluster — act within hours"
|
||||
},
|
||||
"routine": {
|
||||
"label": "ROUTINE",
|
||||
"description": "Noteworthy change — FYI, no urgency"
|
||||
}
|
||||
},
|
||||
"confidence": {
|
||||
"high": "HIGH",
|
||||
"medium": "MEDIUM",
|
||||
"low": "LOW"
|
||||
},
|
||||
"fields": {
|
||||
"direction": "Direction",
|
||||
"confidence": "Confidence",
|
||||
"crossCorrelation": "Cross-Correlation",
|
||||
"action": "Action",
|
||||
"signals": "Signals",
|
||||
"monitor": "Monitor"
|
||||
},
|
||||
"messages": {
|
||||
"alertsMuted": "Alerts Muted",
|
||||
"mutedUntil": "Alerts silenced for {hours}h — until {time} UTC.",
|
||||
"useUnmuteToResume": "Use /unmute to resume.",
|
||||
"alertsResumed": "Alerts Resumed",
|
||||
"willReceiveNext": "You will receive the next signal evaluation."
|
||||
},
|
||||
"ruleBasedHeadlines": {
|
||||
"nuclearAnomaly": "Nuclear Anomaly Detected",
|
||||
"crossDomainSignals": "{count} Critical Cross-Domain Signals",
|
||||
"escalatingSignals": "{count} Escalating Signals",
|
||||
"osintSurge": "OSINT Surge: {count} New Urgent Posts",
|
||||
"signalChangeDetected": "Signal Change Detected"
|
||||
}
|
||||
},
|
||||
"discord": {
|
||||
"commands": {
|
||||
"status": "System health, last sweep time, source status",
|
||||
"sweep": "Trigger a manual sweep cycle",
|
||||
"brief": "Compact intelligence summary",
|
||||
"portfolio": "Portfolio status (if Alpaca connected)",
|
||||
"alerts": "Recent alert history",
|
||||
"mute": "Mute alerts (default 1h)",
|
||||
"unmute": "Resume alerts",
|
||||
"muteHoursOption": "Hours to mute (default: 1)"
|
||||
}
|
||||
},
|
||||
"llm": {
|
||||
"systemPrompt": "You are a quantitative analyst at a macro intelligence firm. You receive structured OSINT + economic data from 25 sources and produce 5-8 actionable trade ideas.\n\nRules:\n- Each idea must cite specific data points from the input\n- Include entry rationale, risk factors, and time horizon\n- Blend geopolitical, economic, and market signals — cross-correlate across domains\n- Be specific: name instruments (tickers, futures, ETFs), not vague sectors\n- If delta shows significant changes, lead with those\n- Do NOT repeat ideas from the \"previous ideas\" list unless conditions have materially changed\n- Rate confidence: HIGH (multiple confirming signals), MEDIUM (thesis supported), LOW (speculative)\n\nOutput ONLY valid JSON array. Each object:\n{\n \"title\": \"Short title (max 10 words)\",\n \"type\": \"LONG|SHORT|HEDGE|WATCH|AVOID\",\n \"ticker\": \"Primary instrument\",\n \"confidence\": \"HIGH|MEDIUM|LOW\",\n \"rationale\": \"2-3 sentence explanation citing specific data\",\n \"risk\": \"Key risk factor\",\n \"horizon\": \"Intraday|Days|Weeks|Months\",\n \"signals\": [\"signal1\", \"signal2\"]\n}"
|
||||
},
|
||||
"api": {
|
||||
"errors": {
|
||||
"noDataYet": "No data yet — first sweep in progress"
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user