Add Polish UI language support
This commit is contained in:
@@ -133,7 +133,7 @@ export default function OnboardingPage() {
|
|||||||
<div className="space-y-6">
|
<div className="space-y-6">
|
||||||
<p className="text-gray-700 dark:text-gray-300">{t.onboarding.language.description}</p>
|
<p className="text-gray-700 dark:text-gray-300">{t.onboarding.language.description}</p>
|
||||||
<div className="flex flex-wrap gap-3">
|
<div className="flex flex-wrap gap-3">
|
||||||
{["en", "de", "fr", "it"].map((lang) => (
|
{["en", "de", "fr", "it", "pl"].map((lang) => (
|
||||||
<button
|
<button
|
||||||
key={lang}
|
key={lang}
|
||||||
onClick={() => setLanguage(lang as SupportedLanguage)}
|
onClick={() => setLanguage(lang as SupportedLanguage)}
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ export default function SettingsPage() {
|
|||||||
{t.start.language}
|
{t.start.language}
|
||||||
</label>
|
</label>
|
||||||
<div className="flex gap-3">
|
<div className="flex gap-3">
|
||||||
{(['en', 'de', 'fr', 'it'] as SupportedLanguage[]).map((lang) => (
|
{(['en', 'de', 'fr', 'it', 'pl'] as SupportedLanguage[]).map((lang) => (
|
||||||
<button
|
<button
|
||||||
key={lang}
|
key={lang}
|
||||||
onClick={() => setLanguage(lang)}
|
onClick={() => setLanguage(lang)}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
export type SupportedLanguage = 'en' | 'de' | 'fr' | 'it';
|
export type SupportedLanguage = 'en' | 'de' | 'fr' | 'it' | 'pl';
|
||||||
|
|
||||||
export interface Translations {
|
export interface Translations {
|
||||||
// Common
|
// Common
|
||||||
@@ -817,9 +817,171 @@ const it: Translations = {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const pl: Translations = {
|
||||||
|
common: {
|
||||||
|
close: 'Zamknij',
|
||||||
|
cancel: 'Anuluj',
|
||||||
|
confirm: 'Potwierdź',
|
||||||
|
loading: 'Ładowanie...',
|
||||||
|
error: 'Błąd',
|
||||||
|
save: 'Zapisz',
|
||||||
|
},
|
||||||
|
header: {
|
||||||
|
tagline: 'z Gemini i Stockfish',
|
||||||
|
buyMeABeer: 'Postaw mi piwo',
|
||||||
|
github: 'GitHub',
|
||||||
|
},
|
||||||
|
start: {
|
||||||
|
title: 'Chess Tutor AI',
|
||||||
|
settings: '1. Ustawienia',
|
||||||
|
language: 'Język',
|
||||||
|
apiKey: 'Klucz API Google Gemini',
|
||||||
|
apiKeyPlaceholder: 'AIzaSy...',
|
||||||
|
getApiKey: 'Zdobądź darmowy klucz',
|
||||||
|
startGame: '2. Rozpocznij grę',
|
||||||
|
resumeGame: 'Wznów poprzednią partię',
|
||||||
|
startNewGame: 'Zacznij nową partię...',
|
||||||
|
chooseCoach: 'Wybierz swojego trenera:',
|
||||||
|
importPosition: 'Importuj pozycję lub partię (FEN lub PGN)',
|
||||||
|
importPositionPlaceholder: 'Wklej tutaj pozycję FEN lub partię PGN...',
|
||||||
|
formatDetected: 'Wykryto format:',
|
||||||
|
formatFen: 'Pozycja FEN',
|
||||||
|
formatPgn: 'Partia PGN',
|
||||||
|
formatInvalid: 'Nieprawidłowy format - wklej poprawny FEN lub PGN',
|
||||||
|
apiKeyRequired: 'Podaj prawidłowy klucz API, aby kontynuować.',
|
||||||
|
colorSelection: 'Wybierz kolor:',
|
||||||
|
playAsWhite: 'Graj białymi',
|
||||||
|
playAsBlack: 'Graj czarnymi',
|
||||||
|
randomColor: 'Losowo',
|
||||||
|
analyzeGame: 'Analizuj partię',
|
||||||
|
savedGamesTitle: 'Niedokończone partie',
|
||||||
|
savedGamesEmpty: 'Brak niedokończonych partii.',
|
||||||
|
opponentLabel: 'Przeciwnik',
|
||||||
|
evaluationLabel: 'Ocena',
|
||||||
|
noEvaluation: 'Brak oceny',
|
||||||
|
deleteGame: 'Usuń partię',
|
||||||
|
analyzeThisGame: 'Analizuj tę partię',
|
||||||
|
},
|
||||||
|
game: {
|
||||||
|
playingAs: 'Grasz jako',
|
||||||
|
vs: 'przeciw',
|
||||||
|
backToMenu: '← Powrót do menu',
|
||||||
|
stockfishStrength: 'Siła Stockfish',
|
||||||
|
depth: 'Głębokość',
|
||||||
|
undoMove: 'Cofnij ruch',
|
||||||
|
gameHistory: 'Historia partii',
|
||||||
|
analyze: 'Analizuj',
|
||||||
|
noMovesYet: 'Brak ruchów.',
|
||||||
|
white: 'Białe',
|
||||||
|
black: 'Czarne',
|
||||||
|
},
|
||||||
|
tutor: {
|
||||||
|
aiCoach: 'Trener AI',
|
||||||
|
askCoach: 'Zapytaj trenera...',
|
||||||
|
hint: 'Podpowiedź',
|
||||||
|
bestMove: 'Najlepszy ruch',
|
||||||
|
},
|
||||||
|
gameOver: {
|
||||||
|
title: 'Koniec gry',
|
||||||
|
checkmate: 'Mat!',
|
||||||
|
youWon: 'Wygrana!',
|
||||||
|
youLost: 'Przegrałeś.',
|
||||||
|
draw: 'Remis!',
|
||||||
|
stalemate: 'Pat!',
|
||||||
|
mistakes: 'Twoje błędy',
|
||||||
|
aiSummary: 'Podsumowanie AI',
|
||||||
|
move: 'Ruch',
|
||||||
|
evalBefore: 'Ocena przed',
|
||||||
|
evalAfter: 'Ocena po',
|
||||||
|
bestMove: 'Najlepszy ruch',
|
||||||
|
newGame: 'Nowa partia',
|
||||||
|
},
|
||||||
|
analysis: {
|
||||||
|
title: 'Analiza pozycji',
|
||||||
|
currentPosition: 'Aktualna pozycja',
|
||||||
|
evaluation: 'Ocena',
|
||||||
|
bestMove: 'Najlepszy ruch',
|
||||||
|
aiAnalysis: 'Analiza AI',
|
||||||
|
playFromHere: 'Graj od tej pozycji',
|
||||||
|
playDescription: 'Wybierz charakter, kolor i siłę silnika, aby grać od bieżącego ruchu.',
|
||||||
|
chooseOpponent: 'Wybierz przeciwnika',
|
||||||
|
chooseSide: 'Wybierz kolor',
|
||||||
|
chooseStrength: 'Siła przeciwnika',
|
||||||
|
startPlay: 'Graj odtąd',
|
||||||
|
modeTitle: 'Analizuj istniejącą partię',
|
||||||
|
modeDescription: 'Prześlij PGN lub FEN, aby coach przeprowadził Cię przez partię z pomocą silnika.',
|
||||||
|
pasteLabel: 'Wejście PGN lub FEN',
|
||||||
|
pastePlaceholder: 'Wklej PGN lub FEN, aby przeglądać partię ruch po ruchu...',
|
||||||
|
chooseCoach: 'Wybierz osobowość trenera',
|
||||||
|
orientation: 'Orientacja szachownicy',
|
||||||
|
startButton: 'Rozpocznij analizę',
|
||||||
|
next: 'Następny ruch',
|
||||||
|
previous: 'Poprzedni ruch',
|
||||||
|
step: 'Ruch',
|
||||||
|
missedTactics: 'Przegapione taktyki',
|
||||||
|
cpLoss: 'Zmiana oceny',
|
||||||
|
none: 'Brak',
|
||||||
|
opening: 'Otwarcie',
|
||||||
|
enginePending: 'Ocena silnika w toku...',
|
||||||
|
coachPending: 'Trener przygotowuje opinię...',
|
||||||
|
importError: 'Nie udało się wczytać PGN ani FEN. Sprawdź zapis.',
|
||||||
|
loadNewGame: 'Załaduj nową partię',
|
||||||
|
openingsExplorer: 'Eksplorator otwarć',
|
||||||
|
generatingExplanation: 'Generowanie wyjaśnienia...',
|
||||||
|
noApiKey: 'Dodaj klucz API w ustawieniach.',
|
||||||
|
askFollowUp: 'Zadaj pytanie uzupełniające o to otwarcie...',
|
||||||
|
possibleOpenings: 'możliwe otwarcia',
|
||||||
|
},
|
||||||
|
apiKeyInput: {
|
||||||
|
title: 'Wymagany klucz API',
|
||||||
|
description: 'Podaj swój klucz Google Gemini, aby kontynuować.',
|
||||||
|
placeholder: 'Wprowadź klucz API...',
|
||||||
|
submit: 'Wyślij',
|
||||||
|
getKey: 'Zdobądź darmowy klucz API',
|
||||||
|
},
|
||||||
|
onboarding: {
|
||||||
|
welcome: {
|
||||||
|
title: 'Chess Tutor AI',
|
||||||
|
subtitle: 'Twój osobisty trener szachowy.',
|
||||||
|
claim: 'Graj, ucz się i analizuj z pomocą Gemini i Stockfish.',
|
||||||
|
},
|
||||||
|
language: {
|
||||||
|
title: 'Wybierz język',
|
||||||
|
description: 'Dostosujemy doświadczenie i wiadomości do wybranego języka.',
|
||||||
|
},
|
||||||
|
value: {
|
||||||
|
title: 'Twoje korzyści',
|
||||||
|
bullets: [
|
||||||
|
'Trenuj z osobowościami dopasowanymi do twojego stylu.',
|
||||||
|
'Importuj FEN lub PGN i otrzymuj wskazówki na żywo podczas analizy.',
|
||||||
|
'Połącz kreatywność Google Gemini z precyzją Stockfish.',
|
||||||
|
'Zapisuj postęp lokalnie — wróć do gry w dowolnym momencie.',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
api: {
|
||||||
|
title: 'Dodaj swój klucz API LLM',
|
||||||
|
description: 'Potrzebujemy twojego klucza Gemini, aby generować ruchy i objaśnienia.',
|
||||||
|
inputLabel: 'Klucz API Google Gemini',
|
||||||
|
placeholder: 'AIzaSy...',
|
||||||
|
storage: 'Twój klucz jest przechowywany w przeglądarce i nigdy nie jest udostępniany.',
|
||||||
|
serverUse: 'Wysyłamy go na nasz serwer tylko podczas wykonywania zapytań i nigdy go nie logujemy.',
|
||||||
|
costNote: 'Tokeny LLM są rozliczane przez Google, więc masz kontrolę nad zużyciem.',
|
||||||
|
privacy: 'Nigdy nie używamy twojego klucza do niczego poza tym trenerem.',
|
||||||
|
getKey: 'Zdobądź darmowy klucz Gemini',
|
||||||
|
},
|
||||||
|
actions: {
|
||||||
|
next: 'Dalej',
|
||||||
|
back: 'Wstecz',
|
||||||
|
finish: 'Zapisz i zacznij grać',
|
||||||
|
},
|
||||||
|
stepIndicator: (step: number, total: number) => `Krok ${step} z ${total}`,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
export const translations: Record<SupportedLanguage, Translations> = {
|
export const translations: Record<SupportedLanguage, Translations> = {
|
||||||
en,
|
en,
|
||||||
de,
|
de,
|
||||||
fr,
|
fr,
|
||||||
it,
|
it,
|
||||||
|
pl,
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user