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({
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 (
{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 =