"""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.",
},
}