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.field_label": {"Сложность бота", "Bot difficulty"}, "checkerslvl.hint": {"[↑↓/←→] выбор уровня [enter] начать игру [esc/q] назад", "[↑↓/←→] choose level [enter] start game [esc/q] back"}, "color.white": {"Белые", "White"}, "color.black": {"Чёрные", "Black"}, "color.random": {"Случайно", "Random"}, "color.field_label": {"Ваш цвет", "Your color"}, "checkerslvl.easy": {"Простой", "Easy"}, "checkerslvl.easy_desc": {"быстрый, ощутимо слабее", "fast, noticeably weaker"}, "checkerslvl.hard": {"Сильный", "Strong"}, "checkerslvl.hard_desc": {"заметно сильнее, чуть медленнее думает", "noticeably stronger, thinks a bit slower"}, "tictactoelvl.title": {"УРОВЕНЬ СЛОЖНОСТИ", "DIFFICULTY LEVEL"}, "tictactoelvl.easy": {"Лёгкий", "Easy"}, "tictactoelvl.easy_desc": {"ходит совершенно случайно", "moves completely at random"}, "tictactoelvl.medium": {"Средний", "Medium"}, "tictactoelvl.medium_desc": {"не упустит свою победу и заблокирует вашу", "won't miss its own win or let you win either"}, "tictactoelvl.hard": {"Непобедимый", "Unbeatable"}, "tictactoelvl.hard_desc": {"полный перебор — выиграть у него нельзя, можно только сыграть вничью", "full search — you can't beat it, only draw at best"}, "nardysettings.title": {"НАСТРОЙКИ ПАРТИИ", "GAME SETTINGS"}, "nardysettings.variant": {"Вариант правил", "Rule variant"}, "nardysettings.difficulty": {"Сложность бота", "Bot difficulty"}, "nardysettings.variant.short": {"Короткие", "Short"}, "nardysettings.variant.long": {"Длинные", "Long"}, "nardylvl.easy": {"Лёгкий", "Easy"}, "nardylvl.easy_desc": {"случайные ходы среди легальных", "random legal moves"}, "nardylvl.medium": {"Средний", "Medium"}, "nardylvl.medium_desc": {"жадная оценка каждого отдельного хода", "greedily evaluates each single move"}, "nardylvl.hard": {"Сильный", "Strong"}, "nardylvl.hard_desc": {"перебирает весь ход целиком, оценивая итоговую позицию", "searches the whole turn, evaluating the resulting position"}, "urlvl.easy": {"Лёгкий", "Easy"}, "urlvl.easy_desc": {"случайные ходы среди легальных", "random legal moves"}, "urlvl.medium": {"Средний", "Medium"}, "urlvl.medium_desc": {"жадная оценка результата каждого хода", "greedily evaluates the outcome of each move"}, "urlvl.hard": {"Сильный", "Strong"}, "urlvl.hard_desc": {"вдобавок учитывает риск немедленного взятия соперником", "also accounts for the risk of an immediate capture by the opponent"}, "senetlvl.easy": {"Лёгкий", "Easy"}, "senetlvl.easy_desc": {"случайные ходы среди легальных", "random legal moves"}, "senetlvl.medium": {"Средний", "Medium"}, "senetlvl.medium_desc": {"жадная оценка результата каждого хода", "greedily evaluates the outcome of each move"}, "senetlvl.hard": {"Сильный", "Strong"}, "senetlvl.hard_desc": {"вдобавок учитывает риск немедленного взятия соперником", "also accounts for the risk of an immediate capture by the opponent"}, // --- Сообщения об ошибках движков (ключ — сам русский текст, // возвращаемый 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"}, "такой ход сейчас недопустим": {"такой ход сейчас недопустим", "that move isn't legal right now"}, "сначала нужно бросить кости": {"сначала нужно бросить кости", "you need to roll the dice first"}, "кости в этом ходу уже брошены": {"кости в этом ходу уже брошены", "the dice have already been rolled this turn"}, "нечего отменять": {"нечего отменять", "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"}, "клетка уже занята": {"клетка уже занята", "that cell is already taken"}, "недопустимый номер клетки": {"недопустимый номер клетки", "invalid cell number"}, "партия уже завершена": {"партия уже завершена", "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"}, "нельзя пасовать (чек) — на столе уже есть ставка, которую нужно уравнять или сбросить": {"нельзя пасовать (чек) — на столе уже есть ставка, которую нужно уравнять или сбросить", "you can't check — there's already a bet on the table that must be called or folded"}, "ставка меньше минимально допустимой": {"ставка меньше минимально допустимой", "the bet is below the minimum allowed"}, "недостаточно фишек для такой ставки": {"недостаточно фишек для такой ставки", "not enough chips for that bet"}, "ставка должна быть выше текущей минимум на 5": {"ставка должна быть выше текущей минимум на 5", "the bid must be at least 5 higher than the current one"}, "играть втёмную можно только на самом первом ходе торгов": {"играть втёмную можно только на самом первом ходе торгов", "playing blind is only possible on the very first bidding turn"}, "ставка превышает разрешённый максимум (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.thinking_generic": {"Бот думает...", "The bot is thinking..."}, "nardy.title.short": {"=== КОРОТКИЕ НАРДЫ ===", "=== SHORT NARDY (BACKGAMMON) ==="}, "nardy.title.long": {"=== ДЛИННЫЕ НАРДЫ ===", "=== LONG NARDY ==="}, "nardy.bar_off_line": {"Бар — %s:%d %s:%d Снято — %s:%d %s:%d", "Bar — %s:%d %s:%d Borne off — %s:%d %s:%d"}, "nardy.you_are": {"Вы играете за: %s", "You are playing as: %s"}, "nardy.hint.roll": {"[r/enter] бросить кости", "[r/enter] roll the dice"}, "nardy.hint.pick_source": {"Выберите, с какой точки ходить:", "Choose which point to move from:"}, "nardy.hint.pick_die": {"Выберите кость для этого хода:", "Choose which die to use:"}, "nardy.hint.cancel_source": {"[esc] назад к выбору точки", "[esc] back to point selection"}, "nardy.source_bar": {"с бара", "from the bar"}, "nardy.hint.quit": {"[q] в меню", "[q] to menu"}, "nardy.dice_line": {"Кости: %d, %d (осталось: %s)", "Dice: %d, %d (remaining: %s)"}, "nardy.move_label": {"%s → %s (кость %d)", "%s → %s (die %d)"}, "nardy.outcome.win": {"Вы выиграли!", "You won!"}, "nardy.outcome.lose": {"Бот выиграл.", "The bot won."}, "nardy.msg.bot_moved": {"Бот сходил.", "The bot made a move."}, "nardy.msg.no_legal_moves": {"У вас не нашлось ни одного хода — очки сгорели.", "You had no legal moves — the roll is forfeited."}, "nardy.msg.game_over": {"Партия завершена.", "The game is over."}, "ur.title": {"=== ИГРА УР (ROYAL GAME OF UR) ===", "=== THE ROYAL GAME OF UR ==="}, "ur.you_are": {"Вы играете за: %s", "You are playing as: %s"}, "ur.hand": {"рука", "hand"}, "ur.off": {"снятие", "off"}, "ur.hand_off_line": {"В руке — %s:%d %s:%d Снято — %s:%d %s:%d", "In hand — %s:%d %s:%d Borne off — %s:%d %s:%d"}, "ur.hint.roll": {"[r/enter] бросить кости", "[r/enter] roll the dice"}, "ur.hint.pick_move": {"Выберите ход:", "Choose a move:"}, "ur.hint.no_moves": {"Нет легальных ходов — ход переходит сопернику.", "No legal moves — turn passes to the opponent."}, "ur.hint.quit": {"[q] в меню", "[q] to menu"}, "ur.dice_line": {"Кости: %d", "Dice: %d"}, "ur.move_label": {"%s → %s", "%s → %s"}, "ur.outcome.win": {"Вы выиграли!", "You won!"}, "ur.outcome.lose": {"Бот выиграл.", "The bot won."}, "ur.msg.bot_moved": {"Бот сходил.", "The bot made a move."}, "ur.msg.no_legal_moves": {"У вас не нашлось ни одного хода.", "You had no legal moves."}, "ur.msg.game_over": {"Партия завершена.", "The game is over."}, "senet.title": {"=== СЕНЕТ (SENET) ===", "=== SENET ==="}, "senet.you_are": {"Вы играете за: %s", "You are playing as: %s"}, "senet.off": {"снятие", "off"}, "senet.backward": {"(назад)", "(backward)"}, "senet.off_line": {"Снято — %s:%d %s:%d", "Borne off — %s:%d %s:%d"}, "senet.hint.roll": {"[r/enter] бросить палочки", "[r/enter] throw the sticks"}, "senet.hint.pick_move": {"Выберите ход:", "Choose a move:"}, "senet.hint.no_moves": {"Нет легальных ходов — ход переходит сопернику.", "No legal moves — turn passes to the opponent."}, "senet.hint.quit": {"[q] в меню", "[q] to menu"}, "senet.dice_line": {"Бросок: %d", "Throw: %d"}, "senet.move_label": {"%d → %s%s", "%d → %s%s"}, "senet.outcome.win": {"Вы выиграли!", "You won!"}, "senet.outcome.lose": {"Бот выиграл.", "The bot won."}, "senet.msg.bot_moved": {"Бот сходил.", "The bot made a move."}, "senet.msg.no_legal_moves": {"У вас не нашлось ни одного хода.", "You had no legal moves."}, "senet.msg.game_over": {"Партия завершена.", "The game is over."}, "poker.title": {"=== ТЕХАССКИЙ ХОЛДЕМ ===", "=== TEXAS HOLD'EM ==="}, "poker.board_label": {"Стол:", "Board:"}, "poker.pot_line": {"Банк: %d", "Pot: %d"}, "poker.your_hand_label": {"Ваши карты:", "Your hand:"}, "poker.seat_label": {"Игрок %d", "Player %d"}, "poker.you_label": {"Вы", "You"}, "poker.player_line": {"%-12s фишки: %-6d ставка: %-6d %s", "%-12s chips: %-6d bet: %-6d %s"}, "poker.status.folded": {"[сбросил]", "[folded]"}, "poker.status.allin": {"[олл-ин]", "[all-in]"}, "poker.status.eliminated": {"[выбыл]", "[eliminated]"}, "poker.hint.your_turn": {"Ваш ход:", "Your turn:"}, "poker.hint.next_hand": {"[n/enter] следующая раздача", "[n/enter] next hand"}, "poker.hint.bet_amount": {"[←→/hl] крупный шаг [↑↓/kj] мелкий шаг [enter] подтвердить [esc] отмена", "[←→/hl] big step [↑↓/kj] small step [enter] confirm [esc] cancel"}, "poker.hint.quit": {"[q] в меню", "[q] to menu"}, "poker.bet_amount_line": {"Ставка/рейз: %d", "Bet/raise: %d"}, "poker.action.fold": {"Сбросить карты", "Fold"}, "poker.action.check": {"Чек", "Check"}, "poker.action.call": {"Уравнять", "Call"}, "poker.action.bet": {"Поставить/рейз", "Bet/raise"}, "poker.action.allin": {"Ва-банк (олл-ин)", "All-in"}, "poker.showdown.title": {"Вскрытие карт:", "Showdown:"}, "poker.showdown.fold_title": {"Все соперники сбросили карты.", "All opponents folded."}, "poker.showdown.winner_line": {" %s забирает: %d", " %s wins: %d"}, "poker.showdown.winner_line_you": {" Вы забираете: %d", " You win: %d"}, "poker.outcome.win": {"Вы выиграли турнир!", "You won the tournament!"}, "poker.outcome.lose": {"Турнир выиграл: %s", "The tournament was won by: %s"}, "poker.hand.highcard": {"старшая карта", "high card"}, "poker.hand.pair": {"пара", "pair"}, "poker.hand.twopair": {"две пары", "two pair"}, "poker.hand.trips": {"тройка", "three of a kind"}, "poker.hand.straight": {"стрит", "straight"}, "poker.hand.flush": {"флеш", "flush"}, "poker.hand.fullhouse": {"фулл-хаус", "full house"}, "poker.hand.quads": {"каре", "four of a kind"}, "poker.hand.straightflush": {"стрит-флеш", "straight flush"}, "tictactoe.title": {"=== КРЕСТИКИ-НОЛИКИ ===", "=== TIC-TAC-TOE ==="}, "tictactoe.your_mark": {"Вы играете за: %s", "You are playing as: %s"}, "tictactoe.hint.turn": {"Ваш ход.", "Your turn."}, "tictactoe.hint.play": {"[1-9] или ←↑↓→ + enter — поставить знак [q] в меню", "[1-9] or ←↑↓→ + enter — place your mark [q] to menu"}, "tictactoe.hint.over": {"[n] новая партия [q] в меню", "[n] new game [q] to menu"}, "tictactoe.outcome.win": {"Вы выиграли!", "You won!"}, "tictactoe.outcome.lose": {"Бот выиграл.", "The bot won."}, "tictactoe.outcome.draw": {"Ничья.", "It's a draw."}, "tictactoe.msg.bot_moved": {"Бот сходил.", "The bot made a move."}, "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": {"Дилер:\n%s\n\n", "Dealer:\n%s\n\n"}, "blackjack.hint.gameover": {"[n] новый раунд [q] в меню", "[n] new round [q] menu"}, "blackjack.bankrupt": {"Вы банкрот — фишек не осталось.", "You're bankrupt — you have no chips left."}, "blackjack.hint.bankrupt": {"[q] в меню", "[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_header": {"%s%-20s ставка: %-4d итог: %d [%s]", "%s%-20s bet: %-4d total: %d [%s]"}, "blackjack.msg.bet_reduced": {"Не хватает на полную ставку — играете на всё, что осталось: %d", "Not enough for the full bet — playing with everything you have left: %d"}, "blackjack.msg.no_funds": {"Денег не осталось — этот раунд играется без ставки.", "You're out of chips — this round is played with no stake."}, "blackjack.hand_with_total": {"%s (всего: %d)", "%s (total: %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.pending_eight_line": {"Нужно покрыть восьмёрку: масть %s или другая восьмёрка", "You must cover the eight: suit %s or another eight"}, "oneohone.declared_suit_line": {"Дама назвала масть: %s (действует один ход)", "Queen declared suit: %s (lasts one move)"}, "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.suit_chosen": {"Вы назвали масть: %s.", "You called the suit: %s."}, "oneohone.choose_suit_prompt": {"Вы положили даму! Назовите масть для следующего хода:\n[1] трефы [2] бубны [3] червы [4] пики", "You played a Queen! Call a suit for the next move:\n[1] clubs [2] diamonds [3] hearts [4] spades"}, "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] пас [v] играть втёмную\n", "[↑→/kl] +5 [↓←/hj] -5 [enter] bid %d [p] pass [v] play blind\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.blind_declared": {"Вы объявили игру втёмную! Заявка 120, награда и штраф удвоены.", "You declared a blind game! Bid 120, reward and penalty doubled."}, "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.barrel_tag": {"[бочка %d/%d]", "[barrel %d/%d]"}, "thousand.golden_round_tag": {"=== ЗОЛОТОЙ КОН (очки соперников удваиваются) ===", "=== GOLDEN ROUND (opponents' points are doubled) ==="}, "thousand.blind_round_tag": {"=== ИГРА ВТЁМНУЮ (заявка 120, всё удвоено) ===", "=== BLIND GAME (bid 120, everything doubled) ==="}, "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.stock_line": {"Колода: (%d)", "Stock: (%d)"}, "klondike.waste_label": {"Отбой:", "Waste:"}, "klondike.foundations_line": {"Фундаменты:\n%s\n", "Foundations:\n%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.runlen": {"[↑↓] сколько карт переносить: %d из %d", "[↑↓] how many cards to move: %d of %d"}, "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"}, "game.tictactoe.name": {"Крестики-нолики", "Tic-Tac-Toe"}, "game.tictactoe.desc": {"Классика на доске 3×3 против бота — три уровня сложности, включая непобедимый", "The 3×3 classic against a bot — three difficulty levels, including an unbeatable one"}, "game.nardy.name": {"Нарды", "Nardy (Backgammon)"}, "game.nardy.desc": {"Короткие или длинные нарды против бота — три уровня сложности", "Short or long nardy against a bot — three difficulty levels"}, "game.ur.name": {"Игра Ур (Royal Game of Ur)", "The Royal Game of Ur"}, "game.ur.desc": {"Одна из древнейших настольных игр (Месопотамия, ~2600 до н.э.) — реконструкция правил Ирвинга Финкеля, три уровня сложности бота", "One of the oldest known board games (Mesopotamia, ~2600 BCE) — Irving Finkel's rule reconstruction, three bot difficulty levels"}, "game.senet.name": {"Сенет (Senet)", "Senet"}, "game.senet.desc": {"Древнеегипетская игра (известна с ~3500 до н.э.) — консолидированная реконструкция правил, три уровня сложности бота", "An ancient Egyptian game (attested since ~3500 BCE) — a consolidated rule reconstruction, three bot difficulty levels"}, "game.poker.name": {"Техасский Холдем", "Texas Hold'em"}, "game.poker.desc": {"Полноценный турнир No-Limit с выбыванием, от 2 до 6 игроков; уровень каждого бота (лёгкий/средний/сильный) назначается случайно", "A full No-Limit elimination tournament, 2 to 6 players; each bot's difficulty (easy/medium/strong) is assigned randomly"}, "corpsestarch.title": {"=== ТРУПНЫЕ БАТОНЧИКИ ===", "=== CORPSE-STARCH BOX ==="}, "corpsestarch.header.starch": {"Трупный крахмал: %s (всего добыто: %s)", "Corpse starch: %s (total gathered: %s)"}, "corpsestarch.header.corruption": {"Скверна: %d", "Corruption: %d"}, "corpsestarch.header.starch.demonic": {"Души: %s (всего собрано: %s)", "Souls: %s (total gathered: %s)"}, "corpsestarch.header.astronomican": {"Отблеск астрономикона: %d", "Astronomican's glimmer: %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.action.defend": {"Отбиваться от культистов Хаоса (заявлено атак: %d)", "Fight off Chaos cultists (attacks logged: %d)"}, "corpsestarch.action.defend.demonic": {"Отбиваться от карателей Империума (заявлено атак: %d)", "Fight off the Imperial punisher fleet (attacks logged: %d)"}, "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.msg.defended": {"Вы отбили атаку культистов.", "You fought off a cultist attack."}, "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.incursion.active": {"ВТОРЖЕНИЕ ХАОСА! Культисты атакуют станцию — осталось: %s", "CHAOS INCURSION! Cultists are attacking the station — time left: %s"}, "corpsestarch.incursion.active.demonic": {"КАРАТЕЛЬНЫЙ ФЛОТ! Силы Империума атакуют вашу цитадель — осталось: %s", "PUNISHER FLEET! Imperial forces are attacking your citadel — time left: %s"}, "corpsestarch.log.warp_breach": {"Скверна прорвалась варп-выбросом! Половина запасов и оборудования потеряна — из пробоя хлынули культисты Хаоса.", "The taint erupts in a warp breach! Half your stockpile and equipment are lost — Chaos cultists pour through the rupture."}, "corpsestarch.log.incursion_repelled": {"Вторжение культистов отражено. Обошлось малой кровью.", "The cultist incursion has been repelled. It could have been worse."}, "corpsestarch.log.incursion_repelled_bonus": {"Вторжение отражено! За стойкость станция получила дополнительный груз трупного крахмала.", "The incursion has been repelled! For your resolve, the station received a bonus shipment of corpse starch."}, "corpsestarch.chaos.offer.title": {"=== ПРЕДЛОЖЕНИЕ ХАОСА ===", "=== THE OFFER OF CHAOS ==="}, "corpsestarch.chaos.offer.text": { "Пятый варп-выброс прогремел, и в наступившей тишине что-то заговорило — терпеливо, ласково, из самой Скверны. Оно предлагает не сдерживать её больше, а принять целиком: стать чем-то новым, чему больше не грозит распад плоти.", "The fifth warp breach has thundered through, and in the silence after it, something speaks — patient, coaxing, from within the taint itself. It offers you an end to restraint: to embrace it fully and become something new, something no longer threatened by the failure of flesh.", }, "corpsestarch.chaos.offer.accept": {"[y] Принять Дар — начать перерождение", "[y] Accept the Gift — begin the rebirth"}, "corpsestarch.chaos.offer.decline": {"[n] Отвергнуть зов", "[n] Reject the call"}, "corpsestarch.log.chaos_declined": { "Вы отвергли зов Хаоса. Метки развеялись без следа, а кто-то щедро вознаградил вашу стойкость.", "You have rejected the call of Chaos. The marks dissipate without a trace, and someone rewards your resolve generously.", }, "corpsestarch.log.rebirth_begins": { "Вы приняли Дар. Плоть тает, а душа перекраивается заново — процесс не остановить и не ускорить.", "You have accepted the Gift. Flesh dissolves as the soul is remade from scratch — the process cannot be stopped or hurried.", }, "corpsestarch.log.rebirth_complete": { "Перерождение завершено. Вы больше не тот, кем были — но голод остался прежним.", "The rebirth is complete. You are no longer who you were — but the hunger remains just the same.", }, "corpsestarch.rebirth.active": {"ПЕРЕРОЖДЕНИЕ... осталось: %s\n\nПлоть перекраивается — сейчас ничего нельзя сделать.", "REBIRTH IN PROGRESS... time left: %s\n\nYour flesh is being remade — nothing can be done right now."}, "corpsestarch.rebirth.hint": {"[q] сохранить и выйти в меню [N] начать заново", "[q] save and quit to menu [N] start over"}, "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.servitor.pinkhorror": {"Розовый ужас", "Pink Horror"}, "corpsestarch.servitor.screamer": {"Визгун", "Screamer"}, "corpsestarch.servitor.lordofchange": {"Владыка Перемен", "Lord of Change"}, "corpsestarch.mission.vermin": {"Зачистить улей от паразитов", "Purge the Hive Vermin"}, "corpsestarch.mission.chapel": {"Очистить часовню от еретиков", "Cleanse the Chapel of Heretics"}, "corpsestarch.mission.waaagh": {"Заглушить барабаны Вааагх!", "Silence the Ork Waaagh Drums"}, "corpsestarch.mission.borderworld": {"Разграбить приграничный мир", "Raid a Border World"}, "corpsestarch.mission.shrineworld": {"Обрушить кару на планету-святилище", "Bring Ruin to a Shrine World"}, "corpsestarch.mission.sector": {"Испепелить целый сектор пламенем Перемен", "Sear a Whole Sector with the Flames of Change"}, "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 } }