package main // translations — таблица переводов "ключ -> {ru, en}". Заполняется // по мере перевода каждого файла интерфейса; см. i18n.go для // функций T/Tf, которые ей пользуются. var translations = map[string]translationEntry{ // --- Экран выбора языка --- "lang.title": {"=== ВЫБОР ЯЗЫКА ===", "=== CHOOSE LANGUAGE ==="}, "lang.ru": {"Русский", "Русский (Russian)"}, "lang.en": {"English", "English"}, "lang.hint": {"[↑↓/kj] выбор [enter] подтвердить", "[↑↓/kj] select [enter] confirm"}, // --- Общее меню --- "app.subtitle": {"Коллекция консольных игр на Go", "A console collection of card and board games in Go"}, "menu.hint": {"[↑↓/kj] выбор [enter] подтвердить [q] выход", "[↑↓/kj] select [enter] confirm [q] quit"}, "menu.rules": {"Правила", "Rules"}, "menu.rules_desc": {"Прочитать правила выбранной игры", "Read the rules of a chosen game"}, "menu.language": {"Язык / Language", "Язык / Language"}, "menu.language_desc": {"Сменить язык интерфейса", "Change interface language"}, "menu.quit": {"Выход", "Quit"}, "menu.quit_desc": {"Закрыть коллекцию игр", "Close the game collection"}, // --- Реестр игр: названия и описания --- "game.tonk.name": {"Тонк (Tonk)", "Tonk"}, "game.tonk.desc": {"Карточная игра на 1 человека + 3 бота разного уровня сложности", "Card game for 1 human + 3 bots of varying skill"}, "game.durak.name": {"Дурак (Durak)", "Durak (Russian Fool)"}, "game.durak.desc": {"Классическая карточная игра на 2-6 игроков (подкидной вариант)", "Classic card game for 2-6 players (full throw-in variant)"}, "game.bj.name": {"Блэкджек (Blackjack)", "Blackjack"}, "game.bj.desc": {"Каждый играет против дилера, 1-6 игроков включая человека", "Everyone plays the dealer separately, 1-6 players including you"}, "game.101.name": {"101", "101"}, "game.101.desc": {"Избавьтесь от карт первым; штрафные очки за оставшиеся на руках, до 101 — выбывание", "Empty your hand first; penalty points for cards left in hand, reaching 101 eliminates you"}, "game.1000.name": {"1000 (Тысяча)", "1000 (Thousand)"}, "game.1000.desc": {"Взяточная игра с торгами и марьяжами, строго на троих (вы + 2 бота)", "Trick-taking game with bidding and marriages, strictly 3 players (you + 2 bots)"}, "game.klondike.name": {"Косынка (Klondike)", "Klondike Solitaire"}, "game.klondike.desc": {"Классический пасьянс на одного игрока, без ботов", "Classic single-player solitaire, no bots"}, "game.checkers.name": {"Шашки (Checkers)", "Checkers"}, "game.checkers.desc": {"Русские шашки против бота (минимакс), обязательное взятие", "Russian draughts against a minimax bot, mandatory captures"}, // --- Подменю "Правила" и сам экран правил --- "rulesmenu.title": {"=== ПРАВИЛА: ВЫБЕРИТЕ ИГРУ ===", "=== RULES: CHOOSE A GAME ==="}, "rulesmenu.hint": {"[↑↓/kj] выбор [enter] показать правила [esc/q] назад в меню", "[↑↓/kj] select [enter] show rules [esc/q] back to menu"}, "rules.title": {"=== ПРАВИЛА ===", "=== RULES ==="}, "rules.hint": {"[↑↓/kj] строка [pgup/pgdown] страница [g/G] начало/конец [esc/q] назад", "[↑↓/kj] line [pgup/pgdown] page [g/G] start/end [esc/q] back"}, "rules.scroll_info": {"(строки %d-%d из %d)", "(lines %d-%d of %d)"}, // --- Настройка ставки (Тонк) --- "stake.title": {"НАСТРОЙКА СТАВКИ", "STAKE SETUP"}, "stake.capital": {"Стартовый капитал", "Starting capital"}, "stake.ante": {"Ставка (анте) за раунд", "Ante per round"}, "stake.tonk_mult": {"Множитель банка при Тонке", "Tonk pot multiplier"}, "stake.pot_info": {"Банк на 4 игроков", "Pot for 4 players"}, "stake.tonk_win": {"Победа Тонком", "Tonk win"}, "stake.hint": {"[↑↓/kj] поле [←→/hl] изменить значение [enter] начать игру [esc/q] назад", "[↑↓/kj] field [←→/hl] change value [enter] start game [esc/q] back"}, // --- Выбор числа игроков (Дурак, 101) --- "playercount.title": {"ЧИСЛО ИГРОКОВ", "NUMBER OF PLAYERS"}, "playercount.line": {"игроков (включая вас)", "players (including you)"}, "playercount.bots": {"Вы + %d бот(ов) со случайными именами.", "You + %d bot(s) with random names."}, "playercount.hint": {"[←→/hl] изменить число игроков (2-6) [enter] начать игру [esc/q] назад", "[←→/hl] change player count (2-6) [enter] start game [esc/q] back"}, // --- Настройка Блэкджека --- "bjsettings.title": {"НАСТРОЙКА", "SETUP"}, "bjsettings.players": {"Число игроков (включая вас)", "Number of players (including you)"}, "bjsettings.capital": {"Стартовый капитал", "Starting capital"}, "bjsettings.bet": {"Ставка за раунд", "Bet per round"}, "bjsettings.multi": {"Вы + %d бот(ов) со случайными именами, каждый играет против дилера отдельно.", "You + %d bot(s) with random names, each playing the dealer separately."}, "bjsettings.solo": {"Вы играете в одиночку против дилера.", "You play solo against the dealer."}, "bjsettings.hint": {"[↑↓/kj] поле [←→/hl] изменить значение [enter] начать игру [esc/q] назад", "[↑↓/kj] field [←→/hl] change value [enter] start game [esc/q] back"}, // --- Уровень сложности (Шашки) --- "checkerslvl.title": {"УРОВЕНЬ СЛОЖНОСТИ", "DIFFICULTY LEVEL"}, "checkerslvl.hint": {"[↑↓/←→] выбор уровня [enter] начать игру [esc/q] назад", "[↑↓/←→] choose level [enter] start game [esc/q] back"}, "checkerslvl.easy": {"Простой", "Easy"}, "checkerslvl.easy_desc": {"быстрый, ощутимо слабее", "fast, noticeably weaker"}, "checkerslvl.hard": {"Сильный", "Strong"}, "checkerslvl.hard_desc": {"заметно сильнее, чуть медленнее думает", "noticeably stronger, thinks a bit slower"}, // --- Сообщения об ошибках движков (ключ — сам русский текст, // возвращаемый err.Error(); переводится в момент отображения в // TUI через T(err.Error()), сами errors.New(...) не трогаем, // чтобы не сломать сравнения ошибок по идентичности в тестах) --- "в исходной стопке нет карт": {"в исходной стопке нет карт", "no cards in the source pile"}, "вес руки превышает порог объявления Тонка": {"вес руки превышает порог объявления Тонка", "hand value exceeds the Tonk declaration threshold"}, "доступно взятие — простой ход запрещён": {"доступно взятие — простой ход запрещён", "a capture is available — a simple move is not allowed"}, "карту нельзя подложить к этой комбинации": {"карту нельзя подложить к этой комбинации", "this card can't be added to that combination"}, "карты не образуют валидную комбинацию": {"карты не образуют валидную комбинацию", "these cards don't form a valid combination"}, "карты нет на руке игрока": {"карты нет на руке игрока", "that card isn't in the player's hand"}, "колода и сброс исчерпаны — раунд закончен вничью": {"колода и сброс исчерпаны — раунд закончен вничью", "stock and discard pile are exhausted — the round ends in a draw"}, "комбинация на столе не найдена": {"комбинация на столе не найдена", "combination not found on the table"}, "на столе нет карт": {"на столе нет карт", "there are no cards on the table"}, "на столе нет карты, которую нужно отбивать": {"на столе нет карты, которую нужно отбивать", "there's no card on the table to beat"}, "на фундамент можно положить только одну карту": {"на фундамент можно положить только одну карту", "only one card can be moved to a foundation"}, "на этой клетке нет вашей шашки": {"на этой клетке нет вашей шашки", "you don't have a piece on that square"}, "недопустимое действие для текущей фазы": {"недопустимое действие для текущей фазы", "this action isn't allowed in the current phase"}, "недопустимое действие для текущей фазы хода": {"недопустимое действие для текущей фазы хода", "this action isn't allowed in the current turn phase"}, "недостаточно средств для этого действия": {"недостаточно средств для этого действия", "not enough funds for this action"}, "нечего отменять": {"нечего отменять", "nothing to undo"}, "нужно продолжать бить той же шашкой": {"нужно продолжать бить той же шашкой", "you must continue capturing with the same piece"}, "нужно сыграть карту, которая подходит — брать из колоды нельзя": {"нужно сыграть карту, которая подходит — брать из колоды нельзя", "you must play a matching card — drawing from the stock isn't allowed"}, "нужно ходить в масть или козырем, если они есть на руке": {"нужно ходить в масть или козырем, если они есть на руке", "you must follow suit or play trump if you have one"}, "партия уже завершена": {"партия уже завершена", "the match is already over"}, "первый ходящий обязан назвать ставку не менее 100 и не может пасовать": {"первый ходящий обязан назвать ставку не менее 100 и не может пасовать", "the first bidder must bid at least 100 and cannot pass"}, "сейчас не ваш ход": {"сейчас не ваш ход", "it isn't your turn right now"}, "ставка должна быть выше текущей минимум на 5": {"ставка должна быть выше текущей минимум на 5", "the bid must be at least 5 higher than the current one"}, "ставка превышает разрешённый максимум (120 плюс марьяж на руке)": {"ставка превышает разрешённый максимум (120 плюс марьяж на руке)", "the bid exceeds the allowed maximum (120 plus any marriage in hand)"}, "стопка сброса пуста": {"стопка сброса пуста", "the discard pile is empty"}, "такой ход недопустим": {"такой ход недопустим", "that move isn't allowed"}, "удвоить ставку можно только на первых двух картах": {"удвоить ставку можно только на первых двух картах", "you can only double down on your first two cards"}, "уже отдано нужное количество карт": {"уже отдано нужное количество карт", "the required number of cards has already been passed"}, "эта карта (или последовательность под ней) не может быть перемещена": {"эта карта (или последовательность под ней) не может быть перемещена", "this card (or the sequence under it) can't be moved"}, "эта карта не бьёт атакующую карту": {"эта карта не бьёт атакующую карту", "this card doesn't beat the attacking card"}, "эта карта не подходит по масти или рангу": {"эта карта не подходит по масти или рангу", "this card doesn't match by suit or rank"}, "эту карту нельзя подкинуть: не тот ранг или лимит атаки исчерпан": {"эту карту нельзя подкинуть: не тот ранг или лимит атаки исчерпан", "this card can't be thrown in: wrong rank or the attack limit is reached"}, "эту карту нельзя положить в эту колонну": {"эту карту нельзя положить в эту колонну", "this card can't be placed in that column"}, "эту карту нельзя положить на фундамент": {"эту карту нельзя положить на фундамент", "this card can't be placed on the foundation"}, // --- Общие ключи, используемые в нескольких играх --- "common.you": {"Вы", "You"}, "common.you_suffix": {" (вы)", " (you)"}, "common.goodbye": {"До встречи!\n", "See you!\n"}, "common.your_hand": {"Ваша рука:", "Your hand:"}, "common.thinking": {"%s думает...\n", "%s is thinking...\n"}, "common.no_cards": {"(нет карт)", "(no cards)"}, // --- Тонк --- "tonk.title": {"=== ТОНК ===", "=== TONK ==="}, "tonk.status_line": {"Колода: %d карт Сброс сверху: %s Банк раунда: %d (ставка: %d, Тонк ×%d)\n\n", "Deck: %d cards Top discard: %s Round pot: %d (ante: %d, Tonk ×%d)\n\n"}, "tonk.melds_label": {"Комбинации на столе:", "Combinations on the table:"}, "tonk.table_empty": {"(стол пуст)", "(table is empty)"}, "tonk.set": {"Сет", "Set"}, "tonk.sequence": {"Сиквенс", "Sequence"}, "tonk.meld_line": {" [%d] %s (%s): %s\n", " [%d] %s (%s): %s\n"}, "tonk.player_line": {"%s%-24s карт: %-2d капитал: %d", "%s%-24s cards: %-2d balance: %d"}, "tonk.hand_weight": {"Вес руки: %d\n\n", "Hand weight: %d\n\n"}, "tonk.hint.draw": {"Ваш ход. [d] взять из колоды [p] взять из сброса (%s) [k] рискнуть дропом [q] в меню", "Your turn. [d] draw from stock [p] draw discard (%s) [k] risk a drop [q] menu"}, "tonk.hint.tonk_available": {" [t] Тонк доступен!", " [t] Tonk available!"}, "tonk.hint.action1": {"[←→/hl] выбор карты [space] отметить для комбинации [m] выложить комбинацию", "[←→/hl] choose card [space] mark for combination [m] lay combination"}, "tonk.hint.action2": {"[1-9] подложить текущую карту к комбинации №N [enter] сбросить текущую карту", "[1-9] add current card to combination #N [enter] discard current card"}, "tonk.hint.gameover": {"[n] новый раунд [q] в меню", "[n] new round [q] menu"}, "tonk.msg.bot_moved": {"%s сходил(а).", "%s made a move."}, "tonk.msg.drew_deck": {"Вы взяли карту из колоды.", "You drew a card from the stock."}, "tonk.msg.drew_discard": {"Вы взяли из сброса: %s", "You took from the discard pile: %s"}, "tonk.msg.drop_caught": {"Дроп не удался — вас поймали! Банк и штраф достались %s.", "The drop failed — you got caught! The pot and penalty went to %s."}, "tonk.msg.drop_success": {"Дроп удался! Вы забрали банк.", "The drop succeeded! You took the pot."}, "tonk.msg.tonk_declared": {"Вы объявили Тонк!", "You declared Tonk!"}, "tonk.msg.discarded": {"Вы сбросили %s.", "You discarded %s."}, "tonk.msg.meld_laid": {"Комбинация выложена на стол.", "Combination laid on the table."}, "tonk.msg.card_added": {"Карта %s подложена к комбинации №%d.", "Card %s added to combination #%d."}, "выберите (пробел) минимум 3 карты для комбинации": {"выберите (пробел) минимум 3 карты для комбинации", "select (space) at least 3 cards for a combination"}, "на столе нет комбинации №%d": {"на столе нет комбинации №%d", "there's no combination #%d on the table"}, "бот %s: %w": {"бот %s: %w", "bot %s: %w"}, "tonk.bankrupt.human": {"Вы обанкротились и выбыли! Ваше место занял новый игрок: %s. Дальше играют боты — можно наблюдать или [q] выйти в меню.", "You went bankrupt and are out! Your seat was taken by a new player: %s. The bots will keep playing — you can watch or press [q] to go to the menu."}, "tonk.bankrupt.bot": {"%s обанкротился(лась) и выбыл(а). За стол сел новый игрок: %s (капитал %d).", "%s went bankrupt and is out. A new player sat down: %s (balance %d)."}, "tonk.result.dead": {"Раунд закончился вничью: колода и сброс исчерпаны. Банк (%d) возвращён игрокам.", "The round ended in a draw: stock and discard pile are exhausted. The pot (%d) was returned to the players."}, "tonk.result.tonk": {"%s объявил(а) Тонк и забрал(а) банк ×%d (%d)!", "%s declared Tonk and took the pot ×%d (%d)!"}, "tonk.result.drop_caught": {"Дроп не удался! %s оказался(лась) реально ниже всех и забрал(а) банк с штрафом!", "The drop failed! %s really had the lowest hand and took the pot plus the penalty!"}, "tonk.result.drop_success": {"%s рискнул(а) дропом и выиграл(а) — забрал(а) банк (%d)!", "%s risked a drop and won — took the pot (%d)!"}, "tonk.result.win": {"%s избавился(лась) от всех карт и забрал(а) банк (%d)!", "%s emptied their hand and took the pot (%d)!"}, "tonk.result.delta_line": {" %-24s изменение капитала: %+d (итого: %d)\n", " %-24s balance change: %+d (total: %d)\n"}, // --- Дурак --- "durak.title": {"=== ДУРАК ===", "=== DURAK ==="}, "durak.legend": {"(A — атакующий, D — защищающийся, T — сейчас подкидывает)", "(A — attacker, D — defender, T — currently throwing in)"}, "durak.status_line": {"Козырь: %s В колоде: %d карт\n\n", "Trump: %s Cards left: %d\n\n"}, "durak.table_label": {"Стол (атака/защита):", "Table (attack/defense):"}, "durak.hint.gameover": {"[n] новая партия [q] в меню", "[n] new game [q] menu"}, "durak.hint.attack": {"[←→/hl] выбор карты [enter] подкинуть карту (обязательный первый ход) [q] в меню", "[←→/hl] choose card [enter] play card (mandatory first move) [q] menu"}, "durak.hint.defend": {"[←→/hl] выбор карты [enter] отбить карту [t] забрать стол [q] в меню", "[←→/hl] choose card [enter] beat the card [t] take the table [q] menu"}, "durak.hint.throwin": {"[←→/hl] выбор карты [enter] подкинуть ещё карту [p] пасовать [q] в меню", "[←→/hl] choose card [enter] throw in another card [p] pass [q] menu"}, "durak.msg.threw_in": {"Вы подкинули %s.", "You threw in %s."}, "durak.msg.passed": {"Вы пасовали.", "You passed."}, "durak.msg.defended": {"Вы отбились картой %s.", "You beat it with %s."}, "durak.msg.took": {"Вы забрали стол себе в руку.", "You took the table into your hand."}, "durak.status_out": {" [отбился]", " [safe]"}, "durak.player_line": {"%s%-20s карт: %-2d%s", "%s%-20s cards: %-2d%s"}, "durak.result.stalemate": {"Партия зашла в тупик (карты слишком долго не выходили из игры) и объявлена ничьей.", "The game reached a stalemate (cards weren't leaving play for too long) and was declared a draw."}, "durak.result.noloser": {"Ничья! Все избавились от карт одновременно — дурака нет.", "A draw! Everyone emptied their hands at the same time — no fool this time."}, "durak.result.loser": {"%s остался(лась) с картами на руках — дурак!", "%s was left holding cards — the fool!"}, } // blackjackTranslations добавляется отдельным init(), чтобы не // раздувать один литерал карты translations — Go не позволяет // повторно объявить один и тот же map-литерал в двух местах, а // добавлять записи в уже созданную карту через init можно. func init() { for k, v := range map[string]translationEntry{ "blackjack.title": {"=== БЛЭКДЖЕК ===", "=== BLACKJACK ==="}, "blackjack.dealer_line": {"Дилер: %s\n\n", "Dealer: %s\n\n"}, "blackjack.hint.gameover": {"[n] новый раунд [q] в меню", "[n] new round [q] menu"}, "blackjack.hint.turn": {"[h] взять карту [s] остановиться [d] удвоить ставку [q] в меню", "[h] hit [s] stand [d] double down [q] menu"}, "blackjack.msg.hit": {"Вы взяли карту.", "You took a card."}, "blackjack.msg.stand": {"Вы остановились.", "You stood."}, "blackjack.msg.double": {"Вы удвоили ставку.", "You doubled down."}, "blackjack.status.stood": {"стоп", "stood"}, "blackjack.status.busted": {"перебор", "bust"}, "blackjack.status.blackjack": {"блэкджек!", "blackjack!"}, "blackjack.status.playing": {"ходит", "playing"}, "blackjack.player_line": {"%s%-20s ставка: %-4d карты: %s (%d) [%s]", "%s%-20s bet: %-4d cards: %s (%d) [%s]"}, "blackjack.dealer_result": {"Дилер: %s (%d)", "Dealer: %s (%d)"}, "blackjack.busted_suffix": {" — перебор!", " — bust!"}, "blackjack.outcome.blackjack": {"блэкджек! выигрыш 3:2", "blackjack! 3:2 win"}, "blackjack.outcome.win": {"выигрыш", "win"}, "blackjack.outcome.push": {"ничья, ставка возвращена", "push, bet returned"}, "blackjack.outcome.lose": {"проигрыш", "loss"}, "blackjack.outcome.bust": {"перебор, проигрыш", "bust, loss"}, "blackjack.result_line": {" %-20s %-24s изменение капитала: %+d (итого: %d)", " %-20s %-24s balance change: %+d (total: %d)"}, "oneohone.title": {"=== 101 ===", "=== 101 ==="}, "oneohone.status_line": {"Сброс сверху: %s В колоде: %d карт\n\n", "Top discard: %s Cards left: %d\n\n"}, "oneohone.hint.gameover_match": {"[q] в меню", "[q] menu"}, "oneohone.hint.gameover": {"[n] новый раунд [q] в меню", "[n] new round [q] menu"}, "oneohone.hint.turn": {"[←→/hl] выбор карты [enter] сыграть карту [d] взять из колоды (если нечем ходить) [q] в меню", "[←→/hl] choose card [enter] play card [d] draw from stock (if you can't play) [q] menu"}, "oneohone.msg.played": {"Вы сыграли %s.", "You played %s."}, "oneohone.msg.drew": {"Вы взяли карту.", "You drew a card."}, "oneohone.status.out": {" [выбыл]", " [out]"}, "oneohone.player_line": {"%s%-16s карт: %-2d счёт: %-4d%s", "%s%-16s cards: %-2d score: %-4d%s"}, "oneohone.result.stalemate": {"Раунд зашёл в тупик и принудительно завершён без изменения счёта.", "The round hit a stalemate and was forced to end with no score change."}, "oneohone.result.win": {"%s избавился(лась) от всех карт и выиграл(а) раунд!", "%s emptied their hand and won the round!"}, "oneohone.result.queen_bonus": {" (бонус за даму!)", " (queen bonus!)"}, "oneohone.result.delta_line": {" %-16s %+d очков за раунд (итого: %d)%s", " %-16s %+d points this round (total: %d)%s"}, "oneohone.result.eliminated": {" — выбыл(а) из партии!", " — eliminated from the match!"}, "oneohone.result.reset": {" — ровно 101, счёт обнулён!", " — exactly 101, score reset!"}, "oneohone.result.no_winner": {"Партия завершилась без победителя (все выбыли одновременно).", "The match ended with no winner (everyone was eliminated at the same time)."}, "oneohone.result.match_over": {"Партия окончена! Победитель: %s", "Match over! Winner: %s"}, "thousand.title": {"=== 1000 ===", "=== 1000 ==="}, "thousand.hint.gameover_match": {"[q] в меню", "[q] menu"}, "thousand.hint.gameover": {"[n] новая раздача [q] в меню", "[n] new hand [q] menu"}, "thousand.bidding_status": {"Текущая максимальная ставка: %d (у %s)\n\n", "Current high bid: %d (by %s)\n\n"}, "thousand.trump_unset": {"ещё не назначен", "not set yet"}, "thousand.play_status": {"Ставка: %d (у %s) Козырь: %s\n", "Bid: %d (by %s) Trump: %s\n"}, "thousand.trick_label": {"Взятка:", "Trick:"}, "thousand.your_hand": {"Ваша рука:", "Your hand:"}, "thousand.hint.bid": {"[↑→/kl] +5 [↓←/hj] -5 [enter] поставить %d [p] пас\n", "[↑→/kl] +5 [↓←/hj] -5 [enter] bid %d [p] pass\n"}, "thousand.hint.discard": {"[←→/hl] выбор карты [enter] отдать карту следующему сопернику", "[←→/hl] choose card [enter] give the card to the next opponent"}, "thousand.hint.trick": {"[←→/hl] выбор карты [enter] сыграть карту (король/дама масти = объявить марьяж)", "[←→/hl] choose card [enter] play card (King/Queen of a suit = declare a marriage)"}, "thousand.hint.menu": {"[q] в меню", "[q] menu"}, "thousand.msg.bid": {"Вы поставили %d.", "You bid %d."}, "thousand.msg.passed": {"Вы пасовали.", "You passed."}, "thousand.msg.gave_card": {"Вы отдали %s.", "You gave away %s."}, "thousand.msg.played": {"Вы сыграли %s.", "You played %s."}, "thousand.no_bidder": {"никого — торги ещё не начались", "no one — bidding hasn't started yet"}, "thousand.suit.clubs": {"трефы", "clubs"}, "thousand.suit.diamonds": {"бубны", "diamonds"}, "thousand.suit.hearts": {"червы", "hearts"}, "thousand.suit.spades": {"пики", "spades"}, "thousand.player_line": {"%s%-14s карт: %-2d очки за раздачу: %-4d счёт: %-5d%s", "%s%-14s cards: %-2d hand points: %-4d score: %-5d%s"}, "thousand.declarer_tag": {" [торг]", " [bid]"}, "thousand.trick_not_started": {"(взятка ещё не начата)", "(trick not started yet)"}, "thousand.result.made": {"%s выполнил(а) ставку %d!", "%s made the bid of %d!"}, "thousand.result.failed": {"%s не выполнил(а) ставку %d.", "%s failed to make the bid of %d."}, "thousand.result.delta_line": {" %-14s %+d очков за раздачу (итого: %d)", " %-14s %+d points this hand (total: %d)"}, "thousand.result.match_over": {"Партия окончена! Победитель: %s", "Match over! Winner: %s"}, "klondike.title": {"=== КОСЫНКА ===", "=== KLONDIKE ==="}, "klondike.msg.undone": {"Ход отменён.", "Move undone."}, "klondike.msg.drew": {"Взяли карту из колоды.", "Drew a card from the stock."}, "klondike.msg.moved": {"Ход выполнен.", "Move made."}, "klondike.msg.to_foundation": {"Карта отправлена на фундамент.", "Card sent to the foundation."}, "klondike.empty": {"(пусто)", "(empty)"}, "klondike.status_line": {"Колода: %s Отбой: %s", "Stock: %s Waste: %s"}, "klondike.foundations_line": {"Фундаменты: %s\n", "Foundations: %s\n"}, "klondike.moves_line": {"Ходов: %d\n\n", "Moves: %d\n\n"}, "klondike.won": {"Пасьянс сошёлся за %d ходов! Поздравляем!", "Solved in %d moves! Congratulations!"}, "klondike.hint.gameover": {"[n] новая партия [q] в меню", "[n] new game [q] menu"}, "klondike.hint.noselect": {"[1-7] выбрать колонну [0] выбрать отбой [d] взять из колоды", "[1-7] select column [0] select waste [d] draw from stock"}, "klondike.hint.selected": {"[1-7] переложить в колонну [f] на фундамент [esc] отменить выбор [d] взять из колоды", "[1-7] move to column [f] to foundation [esc] cancel selection [d] draw from stock"}, "klondike.hint.footer": {"[u] отменить ход [n] новая партия [q] в меню", "[u] undo move [n] new game [q] menu"}, "checkers.title": {"=== ШАШКИ ===", "=== CHECKERS ==="}, "checkers.legend": {"(o — простая шашка, O — дамка; светлые буквы — ваши белые, тёмные — чёрные бота)", "(o — man, O — king; light letters are your white pieces, dark are the bot's black pieces)"}, "chess.legend": {"(K/Q/R/B/N/P — король/ферзь/ладья/слон/конь/пешка; заглавные — ваши белые, строчные — чёрные бота)", "(K/Q/R/B/N/P — king/queen/rook/bishop/knight/pawn; uppercase are your white pieces, lowercase are the bot's black pieces)"}, "checkers.msg.bot_moved": {"Бот сходил.", "The bot made a move."}, "checkers.msg.moved": {"Ход выполнен.", "Move made."}, "checkers.result.draw": {"Ничья (слишком долго не было взятий).", "Draw (no captures for too long)."}, "checkers.result.win": {"Вы выиграли!", "You won!"}, "checkers.result.lose": {"Победил бот.", "The bot won."}, "checkers.hint.gameover": {"[n] новая партия [q] в меню", "[n] new game [q] menu"}, "checkers.turn.you": {"Ваш ход (белые)", "Your turn (white)"}, "checkers.turn.bot": {"Бот думает (чёрные)...", "The bot is thinking (black)..."}, "checkers.hint.noselect": {"[↑↓←→/hjkl] курсор [enter] выбрать шашку [q] в меню", "[↑↓←→/hjkl] cursor [enter] select a piece [q] menu"}, "checkers.hint.selected": {"[↑↓←→/hjkl] курсор [enter] переместить (или отменить выбор) [esc] отменить выбор", "[↑↓←→/hjkl] cursor [enter] move (or cancel selection) [esc] cancel selection"}, "на этой клетке нет вашей фигуры": {"на этой клетке нет вашей фигуры", "you don't have a piece on that square"}, "chess.title": {"=== ШАХМАТЫ ===", "=== CHESS ==="}, "chess.msg.bot_moved": {"Бот сходил.", "The bot made a move."}, "chess.msg.moved": {"Ход выполнен.", "Move made."}, "chess.check": {"Шах!", "Check!"}, "chess.result.win_checkmate": {"Мат! Вы выиграли!", "Checkmate! You won!"}, "chess.result.lose_checkmate": {"Мат! Победил бот.", "Checkmate! The bot won."}, "chess.result.draw": {"Ничья (%s).", "Draw (%s)."}, "chess.drawreason.stalemate": {"пат", "stalemate"}, "chess.drawreason.insufficient_material": {"недостаточно материала для мата", "insufficient material"}, "chess.drawreason.no_progress": {"слишком долго без взятий и ходов пешками", "too long without captures or pawn moves"}, "chess.hint.gameover": {"[n] новая партия [q] в меню", "[n] new game [q] menu"}, "chess.turn.you": {"Ваш ход (белые)", "Your turn (white)"}, "chess.turn.bot": {"Бот думает (чёрные)...", "The bot is thinking (black)..."}, "chess.hint.noselect": {"[↑↓←→/hjkl] курсор [enter] выбрать фигуру [q] в меню", "[↑↓←→/hjkl] cursor [enter] select a piece [q] menu"}, "chess.hint.selected": {"[↑↓←→/hjkl] курсор [enter] переместить (или отменить выбор) [esc] отменить выбор", "[↑↓←→/hjkl] cursor [enter] move (or cancel selection) [esc] cancel selection"}, "game.chess.name": {"Шахматы (Chess)", "Chess"}, "game.chess.desc": {"Классические шахматы против бота (минимакс), с рокировкой и взятием на проходе", "Classic chess against a minimax bot, with castling and en passant"}, "game.corpsestarch.name": {"Трупные батончики (Corpse-Starch Box)", "Corpse-Starch Box"}, "game.corpsestarch.desc": {"Инкрементальная игра: копите трупный крахмал, открывайте новые механики по ходу партии", "An incremental game: gather corpse starch, unlock new mechanics as you go"}, "corpsestarch.title": {"=== ТРУПНЫЕ БАТОНЧИКИ ===", "=== CORPSE-STARCH BOX ==="}, "corpsestarch.header.starch": {"Трупный крахмал: %s (всего добыто: %s)", "Corpse starch: %s (total gathered: %s)"}, "corpsestarch.header.corruption": {"Скверна: %d", "Corruption: %d"}, "corpsestarch.hint": {"[1-9] выбрать действие [N] начать заново [q] в меню (партия автосохраняется)", "[1-9] choose an action [N] start over [q] menu (game is autosaved)"}, "corpsestarch.confirm_reset": {"Вы уверены? Весь прогресс будет безвозвратно потерян.", "Are you sure? All progress will be permanently lost."}, "corpsestarch.confirm_reset.hint": {"[y] да, начать заново [n/esc] отмена", "[y] yes, start over [n/esc] cancel"}, "corpsestarch.msg.reset_done": {"Начата новая партия.", "A new game has started."}, "corpsestarch.action.requisition": {"Реквизировать трупный крахмал (+%s)", "Requisition corpse starch (+%s)"}, "corpsestarch.action.buy_servitor": {"Приобрести: %s (сейчас: %d, цена: %s)", "Acquire: %s (owned: %d, cost: %s)"}, "corpsestarch.action.upgrade_click": {"Заточить цепной меч (цена: %s)", "Sharpen chainsword (cost: %s)"}, "corpsestarch.action.dip": {"Окунуть цепной меч в отстойник", "Dip your chainsword in the sump"}, "corpsestarch.action.start_mission": {"Начать зачистку: %s (%s)", "Start purge: %s (%s)"}, "corpsestarch.action.collect_mission": {"Забрать награду за зачистку", "Collect purge reward"}, "corpsestarch.msg.requisitioned": {"Реквизиция одобрена Муниторумом.", "Requisition approved by the Munitorum."}, "corpsestarch.msg.servitor_bought": {"Новая единица введена в строй.", "A new unit has been brought online."}, "corpsestarch.msg.upgrade_bought": {"Цепной меч заточен острее.", "The chainsword is sharper now."}, "corpsestarch.msg.cannot_afford": {"Недостаточно трупного крахмала.", "Not enough corpse starch."}, "corpsestarch.msg.mission_started": {"Отряд отправлен на зачистку.", "A squad has been dispatched on the purge."}, "corpsestarch.mission.inprogress": {"Зачистка идёт: %s (осталось %s)", "Purge underway: %s (%s remaining)"}, "corpsestarch.mission.ready": {"Зачистка завершена: %s — заберите награду!", "Purge complete: %s — collect your reward!"}, "corpsestarch.log.title": {"Журнал Муниторума:", "Munitorum log:"}, "corpsestarch.log.dip_bonus": {"Отстойник выплюнул горсть трупного крахмала.", "The sump spat out a handful of corpse starch."}, "corpsestarch.log.dip_blessing": {"Дух машины благословил ваш клинок — временный прирост дохода.", "The machine spirit blessed your blade — temporary income boost."}, "corpsestarch.log.dip_nothing": {"Отстойник ответил тишиной.", "The sump answers only with silence."}, "corpsestarch.log.dip_corruption": {"Скверна коснулась вашего снаряжения.", "Taint has touched your wargear."}, "corpsestarch.log.mission_done": {"Отряд вернулся с зачистки с трофеями.", "The squad returned from the purge with spoils."}, "corpsestarch.servitor.skull": {"Сервочерп", "Servo-Skull"}, "corpsestarch.servitor.menial": {"Сервитор-подёнщик", "Menial Servitor"}, "corpsestarch.servitor.cogitator": {"Когитаторный комплекс", "Cogitator Array"}, "corpsestarch.mission.vermin": {"Зачистить улей от паразитов", "Purge the Hive Vermin"}, "corpsestarch.mission.chapel": {"Очистить часовню от еретиков", "Cleanse the Chapel of Heretics"}, "corpsestarch.mission.waaagh": {"Заглушить барабаны Вааагх!", "Silence the Ork Waaagh Drums"}, "corpsestarch.msg.welcome_back": {"С возвращением! Пока вас не было, сервиторы намолотили +%s трупного крахмала.", "Welcome back! While you were away, your servitors gathered +%s corpse starch."}, "game.go.name": {"Го (Go)", "Go"}, "game.go.desc": {"Классическая настольная игра на доске 9x9/13x13/19x19, три уровня сложности бота", "Classic board game on a 9x9/13x13/19x19 board, three bot difficulty levels"}, "gosettings.title": {"НАСТРОЙКА ПАРТИИ", "GAME SETUP"}, "gosettings.boardsize": {"Размер доски", "Board size"}, "gosettings.difficulty": {"Сложность бота", "Bot difficulty"}, "gosettings.hint": {"[↑↓/kj] поле [←→/hl] изменить значение [enter] начать игру [esc/q] назад", "[↑↓/kj] field [←→/hl] change value [enter] start game [esc/q] back"}, "gosettings.level.easy": {"Простой", "Easy"}, "gosettings.level.medium": {"Средний", "Medium"}, "gosettings.level.hard": {"Сильный", "Strong"}, "go.title": {"=== ГО ===", "=== GO ==="}, "go.header.captures": {"Взято чёрными: %d Взято белыми: %d", "Captured by black: %d Captured by white: %d"}, "go.color.black": {"Чёрные", "Black"}, "go.color.white": {"Белые", "White"}, "go.turn.you": {"Ваш ход (чёрные)", "Your turn (black)"}, "go.turn.bot": {"Бот думает (белые)...", "The bot is thinking (white)..."}, "go.hint.play": {"[↑↓←→/hjkl] курсор [enter] поставить камень [p] пасовать [q] в меню", "[↑↓←→/hjkl] cursor [enter] place a stone [p] pass [q] menu"}, "go.hint.gameover": {"[n] новая партия [q] в меню", "[n] new game [q] menu"}, "go.msg.bot_moved": {"Бот сходил.", "The bot made a move."}, "go.msg.bot_passed": {"Бот пасовал.", "The bot passed."}, "go.msg.played": {"Камень поставлен.", "Stone placed."}, "go.msg.passed": {"Вы пасовали.", "You passed."}, "go.result.line": {"Партия окончена! Победили %s (счёт: %.1f — %.1f)", "Game over! %s win (score: %.1f — %.1f)"}, "точка вне пределов доски": {"точка вне пределов доски", "that point is off the board"}, "точка уже занята": {"точка уже занята", "that point is already occupied"}, "этот ход самоубийственный — так ходить нельзя": {"этот ход самоубийственный — так ходить нельзя", "that move is suicidal — it isn't allowed"}, "этот ход запрещён правилом ко": {"этот ход запрещён правилом ко", "that move is forbidden by the ko rule"}, "game.minesweeper.name": {"Сапёр (Minesweeper)", "Minesweeper"}, "game.minesweeper.desc": {"Классический Сапёр, три пресета размера поля на выбор", "Classic Minesweeper, three field size presets to choose from"}, "mssettings.title": {"НАСТРОЙКА ПОЛЯ", "FIELD SETUP"}, "mssettings.hint": {"[↑↓/kj] выбор пресета [enter] начать игру [esc/q] назад", "[↑↓/kj] choose preset [enter] start game [esc/q] back"}, "mssettings.beginner": {"Новичок", "Beginner"}, "mssettings.intermediate": {"Любитель", "Intermediate"}, "mssettings.expert": {"Эксперт", "Expert"}, "minesweeper.title": {"=== САПЁР ===", "=== MINESWEEPER ==="}, "minesweeper.header.mines": {"Осталось мин: %d", "Mines remaining: %d"}, "minesweeper.hint.play": {"[↑↓←→/hjkl] курсор [enter] открыть/хорда [f] флаг [q] в меню", "[↑↓←→/hjkl] cursor [enter] reveal/chord [f] flag [q] menu"}, "minesweeper.hint.gameover": {"[n] новая партия [q] в меню", "[n] new game [q] menu"}, "minesweeper.msg.revealed": {"Клетка открыта.", "Cell revealed."}, "minesweeper.msg.boom": {"Бах! Это была мина.", "Boom! That was a mine."}, "minesweeper.msg.flagged": {"Флаг установлен.", "Flag placed."}, "minesweeper.msg.unflagged": {"Флаг снят.", "Flag removed."}, "minesweeper.msg.chorded": {"Соседние клетки открыты.", "Neighboring cells revealed."}, "эта клетка ещё не открыта": {"эта клетка ещё не открыта", "that cell isn't revealed yet"}, "minesweeper.result.win": {"Поздравляем! Все безопасные клетки открыты.", "Congratulations! All safe cells revealed."}, "minesweeper.result.lose": {"Вы подорвались на мине. Партия окончена.", "You hit a mine. Game over."}, "клетка вне пределов поля": {"клетка вне пределов поля", "that cell is off the field"}, "клетка уже открыта": {"клетка уже открыта", "that cell is already revealed"}, "сначала снимите флаг с этой клетки": {"сначала снимите флаг с этой клетки", "remove the flag from that cell first"}, } { translations[k] = v } }