From 89b4849ed4606e7bf8d5f2629f2ab24a8d0996f9 Mon Sep 17 00:00:00 2001 From: Akurosia Kamo Date: Fri, 22 May 2026 10:49:49 +0200 Subject: [PATCH 1/3] 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)); +}); From 14674d2842165e9f53ed65139b1fe02221f72704 Mon Sep 17 00:00:00 2001 From: Akurosia Kamo Date: Fri, 22 May 2026 11:17:11 +0200 Subject: [PATCH 2/3] small fix --- api/analysis.php | 12 ------------ js/planner.js | 31 ++++++------------------------- 2 files changed, 6 insertions(+), 37 deletions(-) diff --git a/api/analysis.php b/api/analysis.php index 8217d16..3fcefbc 100644 --- a/api/analysis.php +++ b/api/analysis.php @@ -129,17 +129,6 @@ 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 = []; @@ -219,7 +208,6 @@ 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/planner.js b/js/planner.js index d696594..f0441b1 100644 --- a/js/planner.js +++ b/js/planner.js @@ -89,28 +89,8 @@ 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; +function assignmentAbilityName(assignment) { + return assignment?.abilityName ?? assignment?.ability ?? ''; } // ── Rendering: Plan List ────────────────────────────────────────────────────── @@ -246,7 +226,7 @@ function renderMechanicListHtml(plan) { : 'badge-assign-buff'; const isMissing = !!a.job && !activeJobSet.has(a.job); const icon = MITIG_ICONS[a.ability] ?? ''; - const ability = localizedAbilityName(a.ability, a.abilityName ?? a.ability); + const ability = assignmentAbilityName(a); const label = a.job ? `${escHtml(a.job)} · ${escHtml(ability)}` : escHtml(ability); const title = isMissing ? `${escHtml(a.job)} nicht in Jobaufstellung` : ''; return ` @@ -795,7 +775,8 @@ function renderAbilityModalContent() { const otherClass = byOtherJob ? ' ability-chip--other-job' : ''; const title = byOtherJob ? `Bereits von ${escHtml(assigned.job)} zugewiesen` : ''; const icon = MITIG_ICONS[ab.name] ?? ''; - const label = localizedAbilityName(ab.name, ab.name); + const assignedName = assigned ? assignmentAbilityName(assigned) : ''; + const label = assignedName || ab.name; return `