From 89b4849ed4606e7bf8d5f2629f2ab24a8d0996f9 Mon Sep 17 00:00:00 2001 From: Akurosia Kamo Date: Fri, 22 May 2026 10:49:49 +0200 Subject: [PATCH] aku test2 --- api/analysis.php | 12 ++++++++++++ js/app.js | 1 + js/planner.js | 49 +++++++++++++++++++++++++++++++++++++++++++++--- 3 files changed, 59 insertions(+), 3 deletions(-) diff --git a/api/analysis.php b/api/analysis.php index 3fcefbc..8217d16 100644 --- a/api/analysis.php +++ b/api/analysis.php @@ -129,6 +129,17 @@ const MITIGATION_ABILITIES = [ 'Addle' => ['dr' => 10, 'buffType' => 'debuff', 'statusId' => 1001203], ]; +function localizedMitigationName(string $key, string $language, string $fallback): string { + $names = [ + 'de' => [ + 'Reprisal' => 'Reflexion', + 'Feint' => 'Zermürben', + 'Addle' => 'Stumpfsinn', + ], + ]; + return $names[$language][$key] ?? $fallback; +} + function resolveMitigations(string $buffStr, array $mitigIdMap): array { if ($buffStr === '') return []; $result = []; @@ -208,6 +219,7 @@ foreach ($abilityNames as $gameId => $name) { foreach (MITIGATION_ABILITIES as $name => $meta) { if (isset($meta['statusId']) && !isset($mitigIdMap[$meta['statusId']])) { $displayName = $abilityNames[(int)$meta['statusId']] ?? $name; + $displayName = localizedMitigationName($name, $language, $displayName); $mitigIdMap[$meta['statusId']] = array_merge(['key' => $name, 'name' => $displayName], $meta); } } diff --git a/js/app.js b/js/app.js index 0c7b0f7..b3ed4a1 100644 --- a/js/app.js +++ b/js/app.js @@ -103,6 +103,7 @@ document.addEventListener('DOMContentLoaded', () => { window.App.language = normalizeLanguage(languageSelect.value); localStorage.setItem('ff14-mitigator-language', window.App.language); setUrlState({ language: window.App.language }); + window.dispatchEvent(new CustomEvent('ff14-language-change', { detail: { language: window.App.language } })); if (window.App.reportCode) { loadReport(window.App.reportCode, window.App.fightId); } diff --git a/js/planner.js b/js/planner.js index deca3bd..10ebc4f 100644 --- a/js/planner.js +++ b/js/planner.js @@ -89,6 +89,30 @@ function fmtNumber(n) { return Number(n).toLocaleString('de-DE'); } +function currentLanguage() { + return window.App?.language || localStorage.getItem('ff14-mitigator-language') || 'en'; +} + +const ABILITY_DISPLAY_NAMES = { + de: { + 'Addle': 'Stumpfsinn', + 'Feint': 'Zermürben', + 'Reprisal': 'Reflexion', + 'Passage of Arms': 'Waffengang', + 'Heart of Light': 'Herz des Lichts', + 'Sacred Soil': 'Geweihte Erde', + 'Tactician': 'Taktiker', + 'Shake It Off': 'Abschütteln', + 'Shield Samba': 'Schildsamba', + 'Magick Barrier': 'Magiebarriere', + }, +}; + +function localizedAbilityName(key, fallback = key) { + const lang = currentLanguage(); + return ABILITY_DISPLAY_NAMES[lang]?.[key] ?? fallback ?? key; +} + // ── Rendering: Plan List ────────────────────────────────────────────────────── function renderPlanList() { @@ -224,7 +248,8 @@ function renderMechanicList(plan) { : a.buffType === 'shield' ? 'badge-assign-shield' : a.buffType === 'buff' ? 'badge-assign-buff' : ''; - const label = a.job ? `${escHtml(a.job)} · ${escHtml(a.ability)}` : escHtml(a.ability); + const ability = localizedAbilityName(a.ability, a.abilityName ?? a.ability); + const label = a.job ? `${escHtml(a.job)} · ${escHtml(ability)}` : escHtml(ability); return `${label}`; }).join('') } @@ -366,6 +391,14 @@ function guessJob(abilityName, players) { return ''; } +function mitigationDisplayName(mitigation) { + return mitigation?.name ?? mitigation?.key ?? ''; +} + +function mitigationKey(mitigation) { + return mitigation?.key ?? mitigation?.name ?? ''; +} + // ── AoE Events → Plan Mechanics ─────────────────────────────────────────────── function aoeEventsToMechanics(aoeEvents, fightStart, phases, players, withMitigations) { @@ -387,10 +420,15 @@ function aoeEventsToMechanics(aoeEvents, fightStart, phases, players, withMitiga const seen = new Set(); for (const t of ev.targets) { for (const m of (t.mitigations ?? [])) { - const key = m.key ?? m.name; + const key = mitigationKey(m); if (!seen.has(key)) { seen.add(key); - assignments.push({ ability: key, job: guessJob(key, players), buffType: m.buffType ?? '' }); + assignments.push({ + ability: key, + abilityName: mitigationDisplayName(m), + job: guessJob(key, players), + buffType: m.buffType ?? '', + }); } } } @@ -556,3 +594,8 @@ document.addEventListener('DOMContentLoaded', () => { renderPlanList(); renderPlanDetail(null); }); + +window.addEventListener('ff14-language-change', () => { + if (!activePlanId) return; + renderPlanDetail(getPlan(activePlanId)); +});