From 7996ebc5041785fe4522238931f566c818ca0c58 Mon Sep 17 00:00:00 2001 From: Andreas Knuth Date: Wed, 24 Jun 2026 12:17:46 -0500 Subject: [PATCH] localized team names --- app/components/Fixtures.tsx | 6 ++-- app/components/Flag.tsx | 2 +- app/components/Groups.tsx | 2 +- app/components/Simulation.tsx | 4 +-- app/components/ThirdPlace.tsx | 5 ++- lib/feeds.ts | 2 ++ lib/resolve-bracket.ts | 2 +- lib/team-mappings.ts | 63 +++++++++++++++++++++++++++++++++++ lib/types.ts | 3 +- 9 files changed, 79 insertions(+), 10 deletions(-) create mode 100644 lib/team-mappings.ts diff --git a/app/components/Fixtures.tsx b/app/components/Fixtures.tsx index 2b02fdf..96f52b9 100644 --- a/app/components/Fixtures.tsx +++ b/app/components/Fixtures.tsx @@ -101,7 +101,7 @@ function GroupStandings({ {r.rank} - {team?.name ?? r.teamId} + {team?.localisedName ?? team?.name ?? r.teamId} {isLive && } {r.played} @@ -163,12 +163,12 @@ export default function Fixtures({
- {home?.name ?? "—"} + {home?.localisedName ?? home?.name ?? "—"}
- {away?.name ?? "—"} + {away?.localisedName ?? away?.name ?? "—"}
diff --git a/app/components/Flag.tsx b/app/components/Flag.tsx index b1832e2..9d92f0b 100644 --- a/app/components/Flag.tsx +++ b/app/components/Flag.tsx @@ -13,7 +13,7 @@ export default function Flag({ return ( {team.code {r.rank} - {team?.name ?? r.teamId} + {team?.localisedName ?? team?.name ?? r.teamId} {isLive && } {r.played} diff --git a/app/components/Simulation.tsx b/app/components/Simulation.tsx index 93855b0..61a9ccb 100644 --- a/app/components/Simulation.tsx +++ b/app/components/Simulation.tsx @@ -298,7 +298,7 @@ function SimRow({ - {home?.name ?? "—"} + {home?.localisedName ?? home?.name ?? "—"} - {away?.name ?? "—"} + {away?.localisedName ?? away?.name ?? "—"} diff --git a/app/components/ThirdPlace.tsx b/app/components/ThirdPlace.tsx index 7e5c82a..a0ec6c2 100644 --- a/app/components/ThirdPlace.tsx +++ b/app/components/ThirdPlace.tsx @@ -5,7 +5,10 @@ import { Team, ThirdPlaceRow } from "@/lib/types"; export default function ThirdPlace({ rows, teams, }: { rows: ThirdPlaceRow[]; teams: Team[] }) { - const name = (id: string) => teams.find((t) => t.id === id)?.name ?? id; + const name = (id: string) => { + const t = teams.find((t) => t.id === id); + return t?.localisedName ?? t?.name ?? id; + }; return (
diff --git a/lib/feeds.ts b/lib/feeds.ts index 9ebb3f8..d1a65c9 100644 --- a/lib/feeds.ts +++ b/lib/feeds.ts @@ -1,5 +1,6 @@ import { GroupId, Match, MatchStatus, Team } from "./types"; import { venueFor } from "./venues"; +import { localisedTeamName } from "./team-mappings"; // ---------------------------------------------------------------------------- // Caching: einfacher In-Memory-Cache mit TTL. Verhindert, dass jede Browser- @@ -129,6 +130,7 @@ export async function fetchMatchesAndTeams(): Promise<{ matches: Match[]; teams: teamMap.set(id, { id, name: side.name, code: side.tla ?? "", group, crest: side.crest ?? null, + localisedName: localisedTeamName(side.tla ?? "", side.name ?? ""), }); } } diff --git a/lib/resolve-bracket.ts b/lib/resolve-bracket.ts index cd4edf6..d255fbc 100644 --- a/lib/resolve-bracket.ts +++ b/lib/resolve-bracket.ts @@ -120,7 +120,7 @@ function sideFrom( const w = winnerOf(feed); return { teamId, - label: team?.name ?? fallbackLabel, + label: team?.localisedName ?? team?.name ?? fallbackLabel, code: team?.code ?? "", score, isWinner: teamId != null && w === teamId, diff --git a/lib/team-mappings.ts b/lib/team-mappings.ts new file mode 100644 index 0000000..5d8f944 --- /dev/null +++ b/lib/team-mappings.ts @@ -0,0 +1,63 @@ +// Zentrale Lokalisierungstabelle für Teamnamen (TLA → Deutsch / Englisch). +// Schlüssel = FIFA-3-Buchstaben-Code (uppercase), wie er von football-data.org +// im Feld `tla` geliefert wird. +// +// Erweiterung auf weitere Sprachen: einfach pro Sprache ein Feld ergänzen. + +export const TEAM_LOCALIZATION: Record = { + ALG: { de: "Algerien", en: "Algeria" }, + ARG: { de: "Argentinien", en: "Argentina" }, + AUS: { de: "Australien", en: "Australia" }, + AUT: { de: "Österreich", en: "Austria" }, + BEL: { de: "Belgien", en: "Belgium" }, + BIH: { de: "Bosnien-Herzegowina", en: "Bosnia-Herzegovina" }, + BRA: { de: "Brasilien", en: "Brazil" }, + CAN: { de: "Kanada", en: "Canada" }, + CHE: { de: "Schweiz", en: "Switzerland" }, + CIV: { de: "Elfenbeinküste", en: "Ivory Coast" }, + COD: { de: "DR Kongo", en: "Congo DR" }, + COL: { de: "Kolumbien", en: "Colombia" }, + CPV: { de: "Kap Verde", en: "Cape Verde" }, + CZE: { de: "Tschechien", en: "Czech Republic" }, + ECU: { de: "Ecuador", en: "Ecuador" }, + EGY: { de: "Ägypten", en: "Egypt" }, + ENG: { de: "England", en: "England" }, + ESP: { de: "Spanien", en: "Spain" }, + FRA: { de: "Frankreich", en: "France" }, + GER: { de: "Deutschland", en: "Germany" }, + GHA: { de: "Ghana", en: "Ghana" }, + HAI: { de: "Haiti", en: "Haiti" }, + HRV: { de: "Kroatien", en: "Croatia" }, + IRN: { de: "Iran", en: "Iran" }, + IRQ: { de: "Irak", en: "Iraq" }, + JOR: { de: "Jordanien", en: "Jordan" }, + JPN: { de: "Japan", en: "Japan" }, + KOR: { de: "Südkorea", en: "South Korea" }, + KSA: { de: "Saudi-Arabien", en: "Saudi Arabia" }, + MAR: { de: "Marokko", en: "Morocco" }, + MEX: { de: "Mexiko", en: "Mexico" }, + NED: { de: "Niederlande", en: "Netherlands" }, + NOR: { de: "Norwegen", en: "Norway" }, + NZL: { de: "Neuseeland", en: "New Zealand" }, + PAN: { de: "Panama", en: "Panama" }, + PAR: { de: "Paraguay", en: "Paraguay" }, + PRT: { de: "Portugal", en: "Portugal" }, + QAT: { de: "Katar", en: "Qatar" }, + RSA: { de: "Südafrika", en: "South Africa" }, + SCO: { de: "Schottland", en: "Scotland" }, + SEN: { de: "Senegal", en: "Senegal" }, + SWE: { de: "Schweden", en: "Sweden" }, + TUN: { de: "Tunesien", en: "Tunisia" }, + TUR: { de: "Türkei", en: "Turkey" }, + URU: { de: "Uruguay", en: "Uruguay" }, + USA: { de: "USA", en: "USA" }, + UZB: { de: "Usbekistan", en: "Uzbekistan" }, +}; + +// Liefert den lokalisierten Namen für ein Team in der gewünschten Sprache. +// Fallback: originalName (englischer Feed-Name), wenn kein Eintrag existiert. +export function localisedTeamName(tla: string, originalName: string, lang: "de" | "en" = "de"): string { + const entry = TEAM_LOCALIZATION[tla.toUpperCase()]; + if (entry) return entry[lang]; + return originalName; +} diff --git a/lib/types.ts b/lib/types.ts index ecdf8a9..da92ca1 100644 --- a/lib/types.ts +++ b/lib/types.ts @@ -11,10 +11,11 @@ export const GROUP_IDS: GroupId[] = [ export interface Team { id: string; // stabile ID aus dem Feed - name: string; // Anzeigename + name: string; // Originalname aus dem Feed (englisch) code: string; // 3-Buchstaben-Code, z.B. GER group: GroupId; crest?: string | null; // URL zur Flagge / zum Wappen (football-data: crest) + localisedName: string; // Lokalisierter Anzeigename (z.B. "Deutschland") } export type MatchStatus =