From 25a79230a817e33b5001d4cf9af81e9f43119acd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=B6rdle=20Bot?= Date: Fri, 28 Nov 2025 18:39:52 +0100 Subject: [PATCH] =?UTF-8?q?Admin-Seite=20lokalisiert:=20=C3=9Cbersetzungen?= =?UTF-8?q?=20hinzugef=C3=BCgt=20und=20URLs=20angepasst?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Admin-Namespace zu de.json und en.json hinzugefügt - Alle UI-Texte in der Admin-Seite mit useTranslations lokalisiert - Link-Komponente von next-intl verwendet für korrekte Locale-URLs - Buttons, Labels, Formulare und Tabellen-Header übersetzt --- app/[locale]/admin/page.tsx | 190 ++++++++++++++++++++---------------- messages/de.json | 47 +++++++++ messages/en.json | 47 +++++++++ 3 files changed, 199 insertions(+), 85 deletions(-) diff --git a/app/[locale]/admin/page.tsx b/app/[locale]/admin/page.tsx index 210a4fe..58d907d 100644 --- a/app/[locale]/admin/page.tsx +++ b/app/[locale]/admin/page.tsx @@ -1,6 +1,8 @@ 'use client'; import { useState, useEffect, useRef } from 'react'; +import { useTranslations, useLocale } from 'next-intl'; +import { Link } from '@/lib/navigation'; import { getLocalizedValue } from '@/lib/i18n'; @@ -70,6 +72,8 @@ type SortField = 'id' | 'title' | 'artist' | 'createdAt' | 'releaseYear' | 'acti type SortDirection = 'asc' | 'desc'; export default function AdminPage({ params }: { params: { locale: string } }) { + const t = useTranslations('Admin'); + const locale = useLocale(); const [activeTab, setActiveTab] = useState<'de' | 'en'>('de'); const [password, setPassword] = useState(''); const [isAuthenticated, setIsAuthenticated] = useState(false); @@ -194,7 +198,7 @@ export default function AdminPage({ params }: { params: { locale: string } }) { fetchSpecials(); fetchNews(); } else { - alert('Wrong password'); + alert(t('wrongPassword')); } }; @@ -1020,16 +1024,16 @@ export default function AdminPage({ params }: { params: { locale: string } }) { if (!isAuthenticated) { return (
-

Admin Login

+

{t('login')}

setPassword(e.target.value)} className="form-input" style={{ marginBottom: '1rem', maxWidth: '300px' }} - placeholder="Password" + placeholder={t('password')} /> - +
); } @@ -1037,11 +1041,16 @@ export default function AdminPage({ params }: { params: { locale: string } }) { return (
-

Hördle Admin Dashboard

+

{t('title')}

@@ -1091,7 +1105,7 @@ export default function AdminPage({ params }: { params: { locale: string } }) {

- Manage Specials + {t('manageSpecials')}

{showSpecials && ( <> -
+
- - setNewSpecialName({ ...newSpecialName, [activeTab]: e.target.value })} className="form-input" required /> + + setNewSpecialName({ ...newSpecialName, [activeTab]: e.target.value })} className="form-input" required key={`special-name-${activeTab}`} />
- - setNewSpecialSubtitle({ ...newSpecialSubtitle, [activeTab]: e.target.value })} className="form-input" /> + + setNewSpecialSubtitle({ ...newSpecialSubtitle, [activeTab]: e.target.value })} className="form-input" key={`special-subtitle-${activeTab}`} />
- - setNewSpecialMaxAttempts(Number(e.target.value))} className="form-input" min={1} style={{ width: '80px' }} /> + + setNewSpecialMaxAttempts(Number(e.target.value))} className="form-input" min={1} style={{ width: '80px' }} />
- - setNewSpecialUnlockSteps(e.target.value)} className="form-input" style={{ width: '200px' }} /> + + setNewSpecialUnlockSteps(e.target.value)} className="form-input" style={{ width: '200px' }} />
- + setNewSpecialLaunchDate(e.target.value)} className="form-input" />
- + setNewSpecialEndDate(e.target.value)} className="form-input" />
- - setNewSpecialCurator(e.target.value)} className="form-input" /> + + setNewSpecialCurator(e.target.value)} className="form-input" />
- +
@@ -1155,46 +1169,46 @@ export default function AdminPage({ params }: { params: { locale: string } }) { }}> {getLocalizedValue(special.name, activeTab)} ({special._count?.songs || 0}) {special.subtitle && - {getLocalizedValue(special.subtitle, activeTab)}} - Curate - - + {t('curate')} + +
))}
{editingSpecialId !== null && (
-

Edit Special

+

{t('editSpecial')}

-
- - setEditSpecialName({ ...editSpecialName, [activeTab]: e.target.value })} className="form-input" /> +
+ + setEditSpecialName({ ...editSpecialName, [activeTab]: e.target.value })} className="form-input" key={`edit-special-name-${activeTab}`} />
- - setEditSpecialSubtitle({ ...editSpecialSubtitle, [activeTab]: e.target.value })} className="form-input" /> + + setEditSpecialSubtitle({ ...editSpecialSubtitle, [activeTab]: e.target.value })} className="form-input" key={`edit-special-subtitle-${activeTab}`} />
- + setEditSpecialMaxAttempts(Number(e.target.value))} className="form-input" min={1} style={{ width: '80px' }} />
- + setEditSpecialUnlockSteps(e.target.value)} className="form-input" style={{ width: '200px' }} />
- + setEditSpecialLaunchDate(e.target.value)} className="form-input" />
- + setEditSpecialEndDate(e.target.value)} className="form-input" />
- + setEditSpecialCurator(e.target.value)} className="form-input" />
- - + +
)} @@ -1206,7 +1220,7 @@ export default function AdminPage({ params }: { params: { locale: string } }) {

- Manage Genres + {t('manageGenres')}

{showGenres && ( @@ -1227,19 +1241,21 @@ export default function AdminPage({ params }: { params: { locale: string } }) {
setNewGenreName({ ...newGenreName, [activeTab]: e.target.value })} - placeholder="New Genre Name" + placeholder={t('newGenreName')} className="form-input" style={{ maxWidth: '200px' }} + key={`genre-name-${activeTab}`} /> setNewGenreSubtitle({ ...newGenreSubtitle, [activeTab]: e.target.value })} - placeholder="Subtitle" + placeholder={t('subtitle')} className="form-input" style={{ maxWidth: '300px' }} + key={`genre-subtitle-${activeTab}`} /> - +
{genres.map(genre => ( @@ -1265,22 +1281,22 @@ export default function AdminPage({ params }: { params: { locale: string } }) { }}> {getLocalizedValue(genre.name, activeTab)} ({genre._count?.songs || 0}) {genre.subtitle && - {getLocalizedValue(genre.subtitle, activeTab)}} - +
))}
{editingGenreId !== null && (
-

Edit Genre

+

{t('editGenre')}

- - setEditGenreName({ ...editGenreName, [activeTab]: e.target.value })} className="form-input" /> + + setEditGenreName({ ...editGenreName, [activeTab]: e.target.value })} className="form-input" key={`edit-genre-name-${activeTab}`} />
- - setEditGenreSubtitle({ ...editGenreSubtitle, [activeTab]: e.target.value })} className="form-input" style={{ width: '300px' }} /> + + setEditGenreSubtitle({ ...editGenreSubtitle, [activeTab]: e.target.value })} className="form-input" style={{ width: '300px' }} key={`edit-genre-subtitle-${activeTab}`} />
- - + +
)} @@ -1386,7 +1402,7 @@ export default function AdminPage({ params }: { params: { locale: string } }) {

- Manage News & Announcements + {t('manageNews')}

{showNews && ( @@ -1408,27 +1424,29 @@ export default function AdminPage({ params }: { params: { locale: string } }) {
setNewNewsTitle({ ...newNewsTitle, [activeTab]: e.target.value })} - placeholder="News Title" + placeholder={t('newsTitle')} className="form-input" required + key={`news-title-${activeTab}`} />