"""Single source of truth for every user-facing string, flag and language name. `LANGUAGES` drives the language dropdown (code + flag + native name). `TRANSLATIONS` holds every phrase, keyed by the same codes. app.py injects both into the front-end as JSON, so there is exactly one place to edit copy. """ # code -> flag emoji + native language name (order = dropdown order) LANGUAGES = [ {"code": "EN", "flag": "🇬🇧", "name": "English"}, {"code": "KZ", "flag": "🇰🇿", "name": "Қазақша"}, {"code": "RU", "flag": "🇷🇺", "name": "Русский"}, {"code": "KG", "flag": "🇰🇬", "name": "Кыргызча"}, {"code": "TR", "flag": "🇹🇷", "name": "Türkçe"}, {"code": "CS", "flag": "🇨🇿", "name": "Čeština"}, {"code": "ES", "flag": "🇨🇴", "name": "Español"}, {"code": "UZ", "flag": "🇺🇿", "name": "O‘zbekcha"}, ] # The two roles. The first player always moves first ("the one who starts"), # the second follows. Their display names are translated per language via the # "nameFirst" / "nameSecond" keys below — no White/Black wording anywhere. TRANSLATIONS = { "EN": { "nameFirst": "Beginner", "nameSecond": "Follower", "wins": "wins!", "drawLoop": "Infinite loop — draw", "loopHint": "The exact same board position repeated, so the game is a draw.", "history": "Moves", "newGame": "New Game", "setup": "Set Position", "help": "How to Play", "pgn": "Download PGN", "apply": "Start", "close": "Close", "fenHelp": "Set up any custom board using FEN format. Read from left to right:

" "1. Board: Beginner's 5 pits, a slash (/), then Follower's 5 pits.
" "2. Kazans: Beginner's kazan, then Follower's kazan.
" "3. Turn: w for Beginner, b for Follower.
" "4. Move Number: Current move count.

" "Note: All kumalaks must add up exactly to 50.

" "Example (Starting Position):
" "5,5,5,5,5/5,5,5,5,5 0,0 w 1", "helpIntro": "Bestemshe has been completely solved by computers. The glowing ring around each pit reveals " "the guaranteed outcome of that move, assuming perfect play from both sides:

" "🟢 Green: The corresponding player will win.
" "🟡 Yellow: The game will be a draw via infinite loop.
" "🔴 Red: The corresponding player will lose.

" "Click on any of your pits to make a move.", "keys": [ ["1–5", "Play pits 1 through 5"], ["0", "Play a random optimal move"], ["9", "Play a totally random move"], ["← / A", "Go back one move"], ["→ / D", "Go forward one move"], ["↑ / W", "Return to the starting position"], ["↓ / S", "Jump to the latest move"], ], "helpExtra": "Click any move in the history panel to jump back to that exact position. " "If you play a different move from there, a new timeline is created and the old moves are overwritten. " "The game ends in a draw if the exact same board position repeats.", "authors": "Bestemshe Table Base, its Strong Solution proof, and this God's Algorithm were " "created by Ansar Zeinulla & Murat Manassov.", }, "KZ": { "nameFirst": "Бастаушы", "nameSecond": "Қостаушы", "wins": "жеңеді!", "drawLoop": "Шексіз цикл — тең ойын", "loopHint": "Тақтадағы позиция қайталанды, сондықтан ойын тең аяқталды.", "history": "Жүрістер", "newGame": "Жаңа ойын", "setup": "Позиция қою", "help": "Қалай ойнайды?", "pgn": "PGN жүктеу", "apply": "Бастау", "close": "Жабу", "fenHelp": "FEN форматын пайдаланып кез келген позицияны қойыңыз. Солдан оңға қарай оқылады:

" "1. Тақта: Бастаушының 5 ұясы, қиғаш сызық (/), сосын Қостаушының 5 ұясы.
" "2. Қазандар: Бастаушының қазаны, сосын Қостаушының қазаны.
" "3. Кезек: w — Бастаушы, b — Қостаушы.
" "4. Жүріс нөмірі: Ағымдағы жүріс саны.

" "Ескертпе: Құмалақтардың жалпы саны әрқашан 50 болуы тиіс.

" "Мысал (Бастапқы позиция):
" "5,5,5,5,5/5,5,5,5,5 0,0 w 1", "helpIntro": "Бестемше ойыны компьютермен толық шешілген. Әр ұяның айналасындағы жарқыраған сақина екі жақтың мінсіз " "ойыны кезіндегі сол жүрістің кепілдендірілген нәтижесін көрсетеді:

" "🟢 Жасыл: Жүріс жасайтын ойыншы жеңеді.
" "🟡 Сары: Ойын шексіз циклге байланысты тең аяқталады.
" "🔴 Қызыл: Жүріс жасайтын ойыншы жеңіледі.

" "Жүріс жасау үшін кез келген ұяңызды басыңыз.", "keys": [ ["1–5", "1-ден 5-ке дейінгі ұялардан ойнау"], ["0", "Кездейсоқ оңтайлы жүріс жасау"], ["9", "Толықтай кездейсоқ жүріс жасау"], ["← / A", "Бір жүріс артқа"], ["→ / D", "Бір жүріс алға"], ["↑ / W", "Бастапқы позицияға қайту"], ["↓ / S", "Соңғы жүріске өту"], ], "helpExtra": "Тарих тақтасындағы кез келген жүрісті басып, дәл сол позицияға орала аласыз. " "Егер ол жерден басқа жүріс жасасаңыз, жаңа тармақ құрылып, ескі жүрістер қайта жазылады. " "Тақтадағы позиция қайталанса, ойын шексіз циклге түсіп, тең аяқталады.", "authors": "Бестемше кестелік базасын, оның Толық Шешім дәлелін және осы Құдай алгоритмін " "Аңсар Зейнулла мен Мұрат Манасов жасады.", }, "RU": { "nameFirst": "Начинающий", "nameSecond": "Продолжающий", "wins": "выигрывает!", "drawLoop": "Бесконечный цикл — ничья", "loopHint": "Позиция на доске повторилась, поэтому игра завершилась вничью.", "history": "Ходы", "newGame": "Новая игра", "setup": "Задать позицию", "help": "Как играть?", "pgn": "Скачать PGN", "apply": "Начать", "close": "Закрыть", "fenHelp": "Настройте любую позицию, используя формат FEN. Читается слева направо:

" "1. Доска: 5 лунок Начинающего, затем слэш (/), затем 5 лунок Продолжающего.
" "2. Казаны: казан Начинающего, затем казан Продолжающего.
" "3. Очередь хода: w — Начинающий, b — Продолжающий.
" "4. Номер хода: Текущий номер хода.

" "Примечание: Общее количество кумалаков всегда должно быть равно 50.

" "Пример (Начальная позиция):
" "5,5,5,5,5/5,5,5,5,5 0,0 w 1", "helpIntro": "Игра Бестемше полностью решена компьютерами. Светящееся кольцо вокруг каждой лунки " "показывает гарантированный исход этого хода при идеальной игре обеих сторон:

" "🟢 Зеленый: Ходящий игрок выиграет.
" "🟡 Желтый: Будет ничья благодаря бесконечному циклу.
" "🔴 Красный: Ходящий игрок проиграет.

" "Нажмите на любую из ваших лунок, чтобы сделать ход.", "keys": [ ["1–5", "Сыграть лунки с 1 по 5"], ["0", "Сделать случайный оптимальный ход"], ["9", "Сделать абсолютно случайный ход"], ["← / A", "На один ход назад"], ["→ / D", "На один ход вперед"], ["↑ / W", "Вернуться к начальной позиции"], ["↓ / S", "Перейти к последнему ходу"], ], "helpExtra": "Нажмите на любой ход в панели истории, чтобы вернуться точно к этой позиции. " "Если вы сделаете оттуда другой ход, создастся новая ветка, а старые ходы будут удалены. " "Если позиция на доске полностью повторяется, игра заканчивается вничью из-за бесконечного цикла.", "authors": "Табличную базу Бестемше, доказательство её Полного Решения и этот Алгоритм Бога " "создали Ансар Зейнулла и Мурат Манасов.", }, "KG": { "nameFirst": "Баштоочу", "nameSecond": "Коштоочу", "wins": "жеңет!", "drawLoop": "Түгөнбөс цикл — тең чыгуу", "loopHint": "Тактадагы позиция кайталанды, ошондуктан оюн тең чыгуу менен аяктады.", "history": "Жүрүштөр", "newGame": "Жаңы оюн", "setup": "Позиция коюу", "help": "Кантип ойнойт?", "pgn": "PGN жүктөө", "apply": "Баштоо", "close": "Жабуу", "fenHelp": "FEN форматын колдонуп каалаган позицияны коюңуз. Солдон оңго карай окулат:

" "1. Такта: Баштоочунун 5 уясы, кыйгач сызык (/), андан кийин Коштоочунун 5 уясы.
" "2. Казандар: Баштоочунун казаны, андан кийин Коштоочунун казаны.
" "3. Кезек: w — Баштоочу, b — Коштоочу.
" "4. Жүрүш номери: Учурдагы жүрүш саны.

" "Эскертүү: Кумалактардын жалпы саны ар дайым 50 болушу керек.

" "Мисал (Баштапкы позиция):
" "5,5,5,5,5/5,5,5,5,5 0,0 w 1", "helpIntro": "Бестемше оюну компьютерлер тарабынан толук чечилген. Ар бир уянын айланасындагы жарык шакек " "эки тараптын мыкты оюнундагы ошол жүрүштүн кепилденген натыйжасын көрсөтөт:

" "🟢 Жашыл: Жүрүш жасоочу оюнчу утат.
" "🟡 Сары: Оюн түгөнбөс циклге байланыштуу тең чыгуу менен аяктайт.
" "🔴 Кызыл: Жүрүш жасоочу утулат.

" "Жүрүш жасоо үчүн каалаган уяңызды басыңыз.", "keys": [ ["1–5", "1ден 5ке чейинки уяларды ойноо"], ["0", "Кокустан оптималдуу жүрүш жасоо"], ["9", "Толугу менен кокус жүрүш жасоо"], ["← / A", "Бир жүрүш артка"], ["→ / D", "Бир жүрүш алдыга"], ["↑ / W", "Баштапкы позицияга кайтуу"], ["↓ / S", "Акыркы жүрүшкө өтүү"], ], "helpExtra": "Тарых тактасындагы каалаган жүрүштү басып, так ошол позицияга кайта аласыз. " "Эгер ал жерден башка жүрүш жасасаңыз, жаңы бутак түзүлүп, эски жүрүштөр кайра жазылат. " "Тактадагы позиция кайталанса, оюн түгөнбөс циклге түшүп, тең чыгуу менен аяктайт.", "authors": "Бестемше таблицалык базасын, анын Толук Чечим далилин жана бул Кудай алгоритмин " "Ансар Зейнулла жана Мурат Манасов түзгөн.", }, "TR": { "nameFirst": "Başlayan", "nameSecond": "İzleyen", "wins": "kazandı!", "drawLoop": "Sonsuz döngü — Beraberlik", "loopHint": "Tahtadaki konum tamamen tekrarlandığı için oyun berabere bitti.", "history": "Hamleler", "newGame": "Yeni Oyun", "setup": "Konum Ayarla", "help": "Nasıl Oynanır?", "pgn": "PGN İndir", "apply": "Başlat", "close": "Kapat", "fenHelp": "FEN formatını kullanarak özel bir konum ayarlayın. Soldan sağa doğru okunur:

" "1. Tahta: Başlayan'ın 5 kuyusu, eğik çizgi (/), sonra İzleyen'in 5 kuyusu.
" "2. Kazanlar: Başlayan'ın kazanı, sonra İzleyen'in kazanı.
" "3. Sıra: w — Başlayan, b — İzleyen.
" "4. Hamle Numarası: Mevcut hamle sayısı.

" "Not: Toplam kumalak sayısı her zaman tam olarak 50 olmalıdır.

" "Örnek (Başlangıç Konumu):
" "5,5,5,5,5/5,5,5,5,5 0,0 w 1", "helpIntro": "Bestemshe oyunu bilgisayarlar tarafından tamamen çözülmüştür. Her kuyunun etrafındaki parlayan halka, " "her iki tarafın da kusursuz oynadığı varsayılarak o hamlenin kesin sonucunu gösterir:

" "🟢 Yeşil: Hamleyi yapan oyuncu kazanır.
" "🟡 Sarı: Oyun sonsuz döngü nedeniyle berabere biter.
" "🔴 Kırmızı: Hamleyi yapan oyuncu kaybeder.

" "Hamle yapmak için kendi kuyularınızdan birine tıklayın.", "keys": [ ["1–5", "1'den 5'e kadar olan kuyulardan birini oynayın"], ["0", "Rastgele en iyi (optimum) hamleyi yapın"], ["9", "Tamamen rastgele bir hamle yapın"], ["← / A", "Bir hamle geri git"], ["→ / D", "Bir hamle ileri git"], ["↑ / W", "Başlangıç konumuna dön"], ["↓ / S", "Son hamleye atla"], ], "helpExtra": "Geçmiş panelindeki herhangi bir hamleye tıklayarak tam o konuma geri dönebilirsiniz. " "Oradan farklı bir hamle yaparsanız yeni bir varyant (dal) oluşur ve sonraki eski hamleler silinir. " "Tahtadaki bir konum tam olarak tekrarlanırsa, oyun sonsuz döngü nedeniyle berabere biter.", "authors": "Bestemshe Tablo Tabanı, Güçlü Çözüm kanıtı ve bu Tanrı Algoritması " "Ansar Zeinulla ve Murat Manassov tarafından oluşturulmuştur.", }, "CS": { "nameFirst": "Začínající", "nameSecond": "Následující", "wins": "vyhrává!", "drawLoop": "Nekonečná smyčka — remíza", "loopHint": "Pozice na desce se zopakovala, takže hra končí remízou.", "history": "Tahy", "newGame": "Nová hra", "setup": "Nastavit pozici", "help": "Jak hrát?", "pgn": "Stáhnout PGN", "apply": "Začít", "close": "Zavřít", "fenHelp": "Nastavte si libovolnou pozici pomocí formátu FEN. Čte se zleva doprava:

" "1. Deska: 5 jamek Začínajícího, lomítko (/), poté 5 jamek Následujícího.
" "2. Kazany: kazan Začínajícího, poté kazan Následujícího.
" "3. Tah: w — Začínající, b — Následující.
" "4. Číslo tahu: Aktuální počet tahů.

" "Poznámka: Celkový počet kumalaků musí být přesně 50.

" "Příklad (Výchozí pozice):
" "5,5,5,5,5/5,5,5,5,5 0,0 w 1", "helpIntro": "Hra Bestemshe byla kompletně vyřešena počítači. Zářící kruh kolem každé jamky ukazuje zaručený " "výsledek daného tahu za předpokladu dokonalé hry obou stran:

" "🟢 Zelená: Hráč na tahu vyhraje.
" "🟡 Žlutá: Hra skončí remízou kvůli nekonečné smyčce.
" "🔴 Červená: Hráč na tahu prohraje.

" "Klikněte na jakoukoli ze svých jamek a zahrajte tah.", "keys": [ ["1–5", "Zahrát jamky 1 až 5"], ["0", "Zahrát náhodný optimální tah"], ["9", "Zahrát zcela náhodný tah"], ["← / A", "O jeden tah zpět"], ["→ / D", "O jeden tah vpřed"], ["↑ / W", "Návrat do výchozí pozice"], ["↓ / S", "Skočit na poslední tah"], ], "helpExtra": "Kliknutím na jakýkoli tah v panelu historie přeskočíte přesně do dané pozice. " "Pokud odtud zahrajete jiný tah, vytvoří se nová časová osa a staré tahy budou smazány. " "Pokud se pozice na desce přesně zopakuje, hra končí remízou kvůli nekonečné smyčce.", "authors": "Databázi koncovek (Table Base) pro hru Bestemshe, její matematický důkaz a tento Boží algoritmus " "vytvořili Ansar Zeinulla a Murat Manassov.", }, "ES": { "nameFirst": "Iniciador", "nameSecond": "Seguidor", "wins": "¡gana!", "drawLoop": "Bucle infinito — Empate", "loopHint": "La posición en el tablero se repitió por completo, así que el juego termina en empate.", "history": "Jugadas", "newGame": "Juego Nuevo", "setup": "Configurar Posición", "help": "¿Cómo se juega?", "pgn": "Descargar PGN", "apply": "Empezar", "close": "Cerrar", "fenHelp": "Configura cualquier posición personalizada usando el formato FEN. Se lee de izquierda a derecha:

" "1. Tablero: 5 hoyos del Iniciador, una barra (/), luego 5 hoyos del Seguidor.
" "2. Kazanes: kazán del Iniciador, luego kazán del Seguidor.
" "3. Turno: w — Iniciador, b — Seguidor.
" "4. Número de jugada: Conteo actual de jugadas.

" "Nota: El total de kumalaks (fichas) siempre debe sumar exactamente 50.

" "Ejemplo (Posición inicial):
" "5,5,5,5,5/5,5,5,5,5 0,0 w 1", "helpIntro": "El Bestemshe ha sido completamente resuelto por computadoras. El anillo brillante alrededor de cada hoyo " "muestra el resultado garantizado de esa jugada, asumiendo que ambos juegan a la perfección:

" "🟢 Verde: El jugador que mueve ganará.
" "🟡 Amarillo: El juego será un empate por bucle infinito.
" "🔴 Rojo: El jugador que mueve perderá.

" "Haz clic en cualquiera de tus hoyos para hacer una jugada.", "keys": [ ["1–5", "Jugar los hoyos del 1 al 5"], ["0", "Hacer una jugada óptima al azar"], ["9", "Hacer una jugada totalmente al azar"], ["← / A", "Retroceder una jugada"], ["→ / D", "Avanzar una jugada"], ["↑ / W", "Volver a la posición inicial"], ["↓ / S", "Saltar a la última jugada"], ], "helpExtra": "Haz clic en cualquier jugada en el panel de historial para volver a esa posición exacta. " "Si haces una jugada diferente desde ahí, se crea una nueva variante y las jugadas anteriores se borran. " "Si la misma posición en el tablero se repite, el juego termina en empate por bucle infinito.", "authors": "La base de datos de tablas (Table Base) de Bestemshe, su demostración de Solución Fuerte y este Algoritmo " "de Dios fueron creados por Ansar Zeinulla y Murat Manassov.", }, "UZ": { "nameFirst": "Boshlovchi", "nameSecond": "Ergashuvchi", "wins": "yutadi!", "drawLoop": "Cheksiz sikl — durang", "loopHint": "Taxtadagi holat to'liq takrorlandi, shuning uchun o'yin durang bilan tugadi.", "history": "Yurishlar", "newGame": "Yangi o‘yin", "setup": "Holatni o‘rnatish", "help": "Qanday o‘ynaladi?", "pgn": "PGN yuklab olish", "apply": "Boshlash", "close": "Yopish", "fenHelp": "FEN formati yordamida istalgan holatni o'rnating. Chapdan o'ngga o'qiladi:

" "1. Taxta: Boshlovchining 5 ta uyasi, qiya chiziq (/), so'ngra Ergashuvchining 5 ta uyasi.
" "2. Qozonlar: Boshlovchining qozoni, keyin Ergashuvchining qozoni.
" "3. Navbat: w — Boshlovchi, b — Ergashuvchi.
" "4. Yurish raqami: Joriy yurish soni.

" "Eslatma: Qumaloqlar (toshlar) ning umumiy soni doim 50 ta bo'lishi kerak.

" "Misol (Boshlang'ich holat):
" "5,5,5,5,5/5,5,5,5,5 0,0 w 1", "helpIntro": "Bestemshe o'yini kompyuterlar tomonidan to'liq yechilgan. Har bir uya atrofidagi porlayotgan halqa " "ikkala tomonning mukammal o'yinini hisobga olgan holda, shu yurishning kafolatlangan natijasini ko'rsatadi:

" "🟢 Yashil: Yurish qilayotgan o'yinchi yutadi.
" "🟡 Sariq: O'yin cheksiz sikl tufayli durang bilan tugaydi.
" "🔴 Qizil: Yurish qilayotgan o'yinchi yutqazadi.

" "Yurish qilish uchun o'z uyalaringizdan birini bosing.", "keys": [ ["1–5", "1 dan 5 gacha bo'lgan uyalarni o'ynash"], ["0", "Tasodifiy eng yaxshi yurishni qilish"], ["9", "To'liq tasodifiy yurish qilish"], ["← / A", "Bir yurish orqaga"], ["→ / D", "Bir yurish oldinga"], ["↑ / W", "Boshlang'ich holatga qaytish"], ["↓ / S", "Oxirgi yurishga o'tish"], ], "helpExtra": "Tarix panelidagi istalgan yurishni bosib, aynan shu holatga qaytishingiz mumkin. " "Agar u yerdan boshqa yurish qilsangiz, yangi tarmoq yaratiladi va eski yurishlar o'chiriladi. " "Taxtadagi holat to'liq takrorlansa, o'yin cheksiz sikl sababli durang bilan tugaydi.", "authors": "Bestemshe jadval bazasi, uning To'liq Yechim isboti va ushbu Xudo Algoritmi " "Ansar Zeinulla va Murat Manassov tomonidan yaratilgan.", }, }