localized team names
This commit is contained in:
@@ -101,7 +101,7 @@ function GroupStandings({
|
|||||||
<td className="team">
|
<td className="team">
|
||||||
<span className={`rankdot ${cls}`}>{r.rank}</span>
|
<span className={`rankdot ${cls}`}>{r.rank}</span>
|
||||||
<Flag team={team} size={20} />
|
<Flag team={team} size={20} />
|
||||||
<span className="team-name">{team?.name ?? r.teamId}</span>
|
<span className="team-name">{team?.localisedName ?? team?.name ?? r.teamId}</span>
|
||||||
{isLive && <span className="row-live-dot" title="läuft gerade" />}
|
{isLive && <span className="row-live-dot" title="läuft gerade" />}
|
||||||
</td>
|
</td>
|
||||||
<td>{r.played}</td>
|
<td>{r.played}</td>
|
||||||
@@ -163,12 +163,12 @@ export default function Fixtures({
|
|||||||
<div className="fx-teams">
|
<div className="fx-teams">
|
||||||
<div className={`fx-team home ${homeWin ? "win" : ""}`}>
|
<div className={`fx-team home ${homeWin ? "win" : ""}`}>
|
||||||
<Flag team={home} size={22} />
|
<Flag team={home} size={22} />
|
||||||
<span className="fx-name">{home?.name ?? "—"}</span>
|
<span className="fx-name">{home?.localisedName ?? home?.name ?? "—"}</span>
|
||||||
</div>
|
</div>
|
||||||
<ScoreCell m={m} />
|
<ScoreCell m={m} />
|
||||||
<div className={`fx-team away ${awayWin ? "win" : ""}`}>
|
<div className={`fx-team away ${awayWin ? "win" : ""}`}>
|
||||||
<Flag team={away} size={22} />
|
<Flag team={away} size={22} />
|
||||||
<span className="fx-name">{away?.name ?? "—"}</span>
|
<span className="fx-name">{away?.localisedName ?? away?.name ?? "—"}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="fx-meta">
|
<div className="fx-meta">
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ export default function Flag({
|
|||||||
return (
|
return (
|
||||||
<img
|
<img
|
||||||
src={team.crest}
|
src={team.crest}
|
||||||
alt={team.code || team.name}
|
alt={team.code || team.localisedName || team.name}
|
||||||
className="flag"
|
className="flag"
|
||||||
style={style}
|
style={style}
|
||||||
loading="lazy"
|
loading="lazy"
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ export default function Groups({
|
|||||||
<td className="team">
|
<td className="team">
|
||||||
<span className={`rankdot ${cls}`}>{r.rank}</span>
|
<span className={`rankdot ${cls}`}>{r.rank}</span>
|
||||||
<Flag team={team} size={20} />
|
<Flag team={team} size={20} />
|
||||||
<span className="team-name">{team?.name ?? r.teamId}</span>
|
<span className="team-name">{team?.localisedName ?? team?.name ?? r.teamId}</span>
|
||||||
{isLive && <span className="row-live-dot" title="läuft gerade" />}
|
{isLive && <span className="row-live-dot" title="läuft gerade" />}
|
||||||
</td>
|
</td>
|
||||||
<td>{r.played}</td>
|
<td>{r.played}</td>
|
||||||
|
|||||||
@@ -298,7 +298,7 @@ function SimRow({
|
|||||||
<span style={{ display: "flex", alignItems: "center", gap: 6, minWidth: 0, flex: 1, justifyContent: "flex-end" }}>
|
<span style={{ display: "flex", alignItems: "center", gap: 6, minWidth: 0, flex: 1, justifyContent: "flex-end" }}>
|
||||||
<Flag team={home} size={18} />
|
<Flag team={home} size={18} />
|
||||||
<span style={{ fontWeight: 600, whiteSpace: "nowrap", overflow: "hidden", textOverflow: "ellipsis", maxWidth: 140 }}>
|
<span style={{ fontWeight: 600, whiteSpace: "nowrap", overflow: "hidden", textOverflow: "ellipsis", maxWidth: 140 }}>
|
||||||
{home?.name ?? "—"}
|
{home?.localisedName ?? home?.name ?? "—"}
|
||||||
</span>
|
</span>
|
||||||
</span>
|
</span>
|
||||||
<input
|
<input
|
||||||
@@ -338,7 +338,7 @@ function SimRow({
|
|||||||
/>
|
/>
|
||||||
<span style={{ display: "flex", alignItems: "center", gap: 6, minWidth: 0, flex: 1 }}>
|
<span style={{ display: "flex", alignItems: "center", gap: 6, minWidth: 0, flex: 1 }}>
|
||||||
<span style={{ fontWeight: 600, whiteSpace: "nowrap", overflow: "hidden", textOverflow: "ellipsis", maxWidth: 140 }}>
|
<span style={{ fontWeight: 600, whiteSpace: "nowrap", overflow: "hidden", textOverflow: "ellipsis", maxWidth: 140 }}>
|
||||||
{away?.name ?? "—"}
|
{away?.localisedName ?? away?.name ?? "—"}
|
||||||
</span>
|
</span>
|
||||||
<Flag team={away} size={18} />
|
<Flag team={away} size={18} />
|
||||||
</span>
|
</span>
|
||||||
|
|||||||
@@ -5,7 +5,10 @@ import { Team, ThirdPlaceRow } from "@/lib/types";
|
|||||||
export default function ThirdPlace({
|
export default function ThirdPlace({
|
||||||
rows, teams,
|
rows, teams,
|
||||||
}: { rows: ThirdPlaceRow[]; teams: Team[] }) {
|
}: { 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 (
|
return (
|
||||||
<div className="third-wrap">
|
<div className="third-wrap">
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import { GroupId, Match, MatchStatus, Team } from "./types";
|
import { GroupId, Match, MatchStatus, Team } from "./types";
|
||||||
import { venueFor } from "./venues";
|
import { venueFor } from "./venues";
|
||||||
|
import { localisedTeamName } from "./team-mappings";
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// Caching: einfacher In-Memory-Cache mit TTL. Verhindert, dass jede Browser-
|
// 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, {
|
teamMap.set(id, {
|
||||||
id, name: side.name, code: side.tla ?? "", group,
|
id, name: side.name, code: side.tla ?? "", group,
|
||||||
crest: side.crest ?? null,
|
crest: side.crest ?? null,
|
||||||
|
localisedName: localisedTeamName(side.tla ?? "", side.name ?? ""),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -120,7 +120,7 @@ function sideFrom(
|
|||||||
const w = winnerOf(feed);
|
const w = winnerOf(feed);
|
||||||
return {
|
return {
|
||||||
teamId,
|
teamId,
|
||||||
label: team?.name ?? fallbackLabel,
|
label: team?.localisedName ?? team?.name ?? fallbackLabel,
|
||||||
code: team?.code ?? "",
|
code: team?.code ?? "",
|
||||||
score,
|
score,
|
||||||
isWinner: teamId != null && w === teamId,
|
isWinner: teamId != null && w === teamId,
|
||||||
|
|||||||
63
lib/team-mappings.ts
Normal file
63
lib/team-mappings.ts
Normal file
@@ -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<string, { de: string; en: string }> = {
|
||||||
|
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;
|
||||||
|
}
|
||||||
@@ -11,10 +11,11 @@ export const GROUP_IDS: GroupId[] = [
|
|||||||
|
|
||||||
export interface Team {
|
export interface Team {
|
||||||
id: string; // stabile ID aus dem Feed
|
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
|
code: string; // 3-Buchstaben-Code, z.B. GER
|
||||||
group: GroupId;
|
group: GroupId;
|
||||||
crest?: string | null; // URL zur Flagge / zum Wappen (football-data: crest)
|
crest?: string | null; // URL zur Flagge / zum Wappen (football-data: crest)
|
||||||
|
localisedName: string; // Lokalisierter Anzeigename (z.B. "Deutschland")
|
||||||
}
|
}
|
||||||
|
|
||||||
export type MatchStatus =
|
export type MatchStatus =
|
||||||
|
|||||||
Reference in New Issue
Block a user