Add Polish UI language support
This commit is contained in:
@@ -133,7 +133,7 @@ export default function OnboardingPage() {
|
||||
<div className="space-y-6">
|
||||
<p className="text-gray-700 dark:text-gray-300">{t.onboarding.language.description}</p>
|
||||
<div className="flex flex-wrap gap-3">
|
||||
{["en", "de", "fr", "it"].map((lang) => (
|
||||
{["en", "de", "fr", "it", "pl"].map((lang) => (
|
||||
<button
|
||||
key={lang}
|
||||
onClick={() => setLanguage(lang as SupportedLanguage)}
|
||||
|
||||
@@ -85,7 +85,7 @@ export default function SettingsPage() {
|
||||
{t.start.language}
|
||||
</label>
|
||||
<div className="flex gap-3">
|
||||
{(['en', 'de', 'fr', 'it'] as SupportedLanguage[]).map((lang) => (
|
||||
{(['en', 'de', 'fr', 'it', 'pl'] as SupportedLanguage[]).map((lang) => (
|
||||
<button
|
||||
key={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 {
|
||||
// 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> = {
|
||||
en,
|
||||
de,
|
||||
fr,
|
||||
it,
|
||||
pl,
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user