diff --git a/Makefile b/Makefile index 7713424e75..baae7118cf 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,8 @@ PYSOLLIB_FILES=pysollib/tk/*.py pysollib/*.py \ pysollib/games/*.py pysollib/games/special/*.py \ - pysollib/games/contrib/*.py pysollib/games/ultra/*.py + pysollib/games/contrib/*.py pysollib/games/ultra/*.py \ + pysollib/games/mahjongg/*.py .PHONY : install dist all_games_html rules pot mo diff --git a/po/games.pot b/po/games.pot index f71d5e8f67..cf68fcf9c7 100644 --- a/po/games.pot +++ b/po/games.pot @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: PySol 0.0.1\n" -"POT-Creation-Date: Fri May 26 20:25:43 2006\n" +"POT-Creation-Date: Tue Jun 6 02:20:52 2006\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -63,9 +63,6 @@ msgstr "" msgid "Acme" msgstr "" -msgid "Adelaide" -msgstr "" - msgid "Agnes Bernauer" msgstr "" @@ -2322,6 +2319,9 @@ msgstr "" msgid "Raw Prawn" msgstr "" +msgid "Realm" +msgstr "" + msgid "Rectangle" msgstr "" diff --git a/po/pysol.pot b/po/pysol.pot index d4b883af26..e1d7e6e9a5 100644 --- a/po/pysol.pot +++ b/po/pysol.pot @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"POT-Creation-Date: Fri May 26 20:25:31 2006\n" +"POT-Creation-Date: Tue Jun 6 02:20:47 2006\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -15,199 +15,196 @@ msgstr "" "Generated-By: pygettext.py 1.5\n" -#: pysollib/actions.py:345 pysollib/game.py:1205 pysollib/game.py:1220 -#: pysollib/game.py:1226 pysollib/game.py:1231 pysollib/tk/toolbar.py:183 +#: pysollib/actions.py:344 pysollib/tk/toolbar.py:183 msgid "New game" msgstr "" -#: pysollib/actions.py:358 pysollib/tk/menubar.py:668 -#: pysollib/tk/menubar.py:682 +#: pysollib/actions.py:357 pysollib/tk/menubar.py:667 +#: pysollib/tk/menubar.py:681 msgid "Select game" msgstr "" -#: pysollib/actions.py:381 +#: pysollib/actions.py:380 msgid "Invalid game number" msgstr "" -#: pysollib/actions.py:382 +#: pysollib/actions.py:381 msgid "" "Invalid game number\n" msgstr "" -#: pysollib/actions.py:399 +#: pysollib/actions.py:398 msgid "Select next game number" msgstr "" -#: pysollib/actions.py:408 pysollib/actions.py:418 +#: pysollib/actions.py:407 pysollib/actions.py:417 msgid "Select new game number" msgstr "" -#: pysollib/actions.py:409 +#: pysollib/actions.py:408 msgid "" "\n" "\n" "Enter new game number" msgstr "" -#: pysollib/actions.py:410 -msgid "Next number" +#: pysollib/actions.py:409 +msgid "&Next number" msgstr "" -#: pysollib/actions.py:410 pysollib/app.py:1085 pysollib/app.py:1097 -#: pysollib/game.py:828 pysollib/game.py:1641 pysollib/main.py:399 -#: pysollib/main.py:404 pysollib/tk/colorsdialog.py:131 -#: pysollib/tk/demooptionsdialog.py:87 pysollib/tk/edittextdialog.py:82 -#: pysollib/tk/edittextdialog.py:94 pysollib/tk/fontsdialog.py:140 +#: pysollib/actions.py:409 pysollib/app.py:1090 pysollib/app.py:1102 +#: pysollib/game.py:828 pysollib/game.py:1642 pysollib/main.py:413 +#: pysollib/main.py:421 pysollib/tk/colorsdialog.py:131 +#: pysollib/tk/edittextdialog.py:82 pysollib/tk/fontsdialog.py:140 #: pysollib/tk/fontsdialog.py:204 pysollib/tk/gameinfodialog.py:133 #: pysollib/tk/playeroptionsdialog.py:86 #: pysollib/tk/playeroptionsdialog.py:161 pysollib/tk/selectcardset.py:240 #: pysollib/tk/selectcardset.py:396 pysollib/tk/selecttile.py:158 #: pysollib/tk/soundoptionsdialog.py:106 pysollib/tk/soundoptionsdialog.py:158 -#: pysollib/tk/timeoutsdialog.py:92 pysollib/tk/tkhtml.py:506 -#: pysollib/tk/tkstats.py:288 pysollib/tk/tkstats.py:573 -#: pysollib/tk/tkstats.py:647 pysollib/tk/tkstats.py:663 -#: pysollib/tk/tkstats.py:705 pysollib/tk/tkstats.py:776 -#: pysollib/tk/tkstats.py:860 pysollib/tk/tkwidget.py:158 -#: pysollib/tk/tkwidget.py:297 -msgid "OK" +#: pysollib/tk/timeoutsdialog.py:92 pysollib/tk/tkhtml.py:459 +#: pysollib/tk/tkstats.py:288 pysollib/tk/tkstats.py:571 +#: pysollib/tk/tkstats.py:645 pysollib/tk/tkstats.py:661 +#: pysollib/tk/tkstats.py:703 pysollib/tk/tkstats.py:775 +#: pysollib/tk/tkstats.py:859 pysollib/tk/tkwidget.py:159 +#: pysollib/tk/tkwidget.py:312 +msgid "&OK" msgstr "" -#: pysollib/actions.py:410 pysollib/app.py:1097 pysollib/game.py:828 +#: pysollib/actions.py:409 pysollib/app.py:1102 pysollib/game.py:828 #: pysollib/game.py:1205 pysollib/game.py:1220 pysollib/game.py:1226 #: pysollib/game.py:1231 pysollib/tk/colorsdialog.py:131 -#: pysollib/tk/demooptionsdialog.py:87 pysollib/tk/edittextdialog.py:94 -#: pysollib/tk/fontsdialog.py:140 pysollib/tk/fontsdialog.py:204 -#: pysollib/tk/menubar.py:855 pysollib/tk/menubar.py:857 -#: pysollib/tk/playeroptionsdialog.py:86 +#: pysollib/tk/edittextdialog.py:82 pysollib/tk/fontsdialog.py:140 +#: pysollib/tk/fontsdialog.py:204 pysollib/tk/menubar.py:854 +#: pysollib/tk/menubar.py:856 pysollib/tk/playeroptionsdialog.py:86 #: pysollib/tk/playeroptionsdialog.py:161 pysollib/tk/selectcardset.py:240 #: pysollib/tk/selectgame.py:268 pysollib/tk/selectgame.py:409 #: pysollib/tk/selecttile.py:158 pysollib/tk/soundoptionsdialog.py:106 -#: pysollib/tk/timeoutsdialog.py:92 pysollib/tk/tkwidget.py:297 -msgid "Cancel" +#: pysollib/tk/timeoutsdialog.py:92 pysollib/tk/tkwidget.py:312 +msgid "&Cancel" msgstr "" -#: pysollib/actions.py:426 +#: pysollib/actions.py:425 msgid "Select random game" msgstr "" -#: pysollib/actions.py:462 +#: pysollib/actions.py:461 msgid "Select next game" msgstr "" -#: pysollib/actions.py:495 pysollib/tk/toolbar.py:197 +#: pysollib/actions.py:494 pysollib/tk/toolbar.py:197 msgid "Quit " msgstr "" -#: pysollib/actions.py:545 +#: pysollib/actions.py:544 msgid "Clear bookmarks" msgstr "" -#: pysollib/actions.py:546 +#: pysollib/actions.py:545 msgid "Clear all bookmarks ?" msgstr "" -#: pysollib/actions.py:556 +#: pysollib/actions.py:555 msgid "Restart game" msgstr "" -#: pysollib/actions.py:557 +#: pysollib/actions.py:556 msgid "Restart this game ?" msgstr "" -#: pysollib/actions.py:594 +#: pysollib/actions.py:593 msgid "" "Comments for %s:\n" "\n" msgstr "" -#: pysollib/actions.py:596 +#: pysollib/actions.py:595 msgid "Comments for " msgstr "" -#: pysollib/actions.py:614 pysollib/actions.py:650 +#: pysollib/actions.py:613 pysollib/actions.py:649 msgid "Error while writing to file" msgstr "" -#: pysollib/actions.py:617 pysollib/actions.py:653 pysollib/actions.py:956 +#: pysollib/actions.py:616 pysollib/actions.py:652 pysollib/actions.py:941 msgid " Info" msgstr "" -#: pysollib/actions.py:618 +#: pysollib/actions.py:617 msgid "" "Comments were appended to\n" "\n" msgstr "" -#: pysollib/actions.py:635 +#: pysollib/actions.py:634 msgid "Demo statistics" msgstr "" -#: pysollib/actions.py:638 +#: pysollib/actions.py:637 msgid "Your statistics" msgstr "" -#: pysollib/actions.py:654 +#: pysollib/actions.py:653 msgid "" " were appended to\n" "\n" msgstr "" -#: pysollib/actions.py:668 +#: pysollib/actions.py:667 msgid " Demo" msgstr "" -#: pysollib/actions.py:668 +#: pysollib/actions.py:667 msgid " Demo " msgstr "" -#: pysollib/actions.py:671 pysollib/actions.py:689 +#: pysollib/actions.py:670 pysollib/actions.py:688 msgid " for " msgstr "" -#: pysollib/actions.py:677 pysollib/actions.py:696 +#: pysollib/actions.py:676 pysollib/actions.py:695 msgid "Statistics for " msgstr "" -#: pysollib/actions.py:680 pysollib/tk/selectgame.py:352 +#: pysollib/actions.py:679 pysollib/tk/selectgame.py:352 #: pysollib/tk/toolbar.py:194 msgid "Statistics" msgstr "" -#: pysollib/actions.py:683 +#: pysollib/actions.py:682 msgid "Full log" msgstr "" -#: pysollib/actions.py:686 +#: pysollib/actions.py:685 msgid "Session log" msgstr "" -#: pysollib/actions.py:692 +#: pysollib/actions.py:691 msgid "Game Info" msgstr "" -#: pysollib/actions.py:701 +#: pysollib/actions.py:700 msgid "Full log for " msgstr "" -#: pysollib/actions.py:706 +#: pysollib/actions.py:705 msgid "Session log for " msgstr "" -#: pysollib/actions.py:711 +#: pysollib/actions.py:710 msgid "Reset all statistics" msgstr "" -#: pysollib/actions.py:712 +#: pysollib/actions.py:711 msgid "" "Reset ALL statistics and logs for player\n" "%s ?" msgstr "" -#: pysollib/actions.py:718 +#: pysollib/actions.py:717 msgid "Reset game statistics" msgstr "" -#: pysollib/actions.py:719 +#: pysollib/actions.py:718 msgid "" "Reset statistics and logs for player\n" "%s\n" @@ -215,65 +212,61 @@ msgid "" "%s ?" msgstr "" -#: pysollib/actions.py:775 +#: pysollib/actions.py:774 msgid "Play demo" msgstr "" -#: pysollib/actions.py:786 +#: pysollib/actions.py:785 msgid "Set player options" msgstr "" -#: pysollib/actions.py:875 +#: pysollib/actions.py:874 msgid "Sound settings" msgstr "" -#: pysollib/actions.py:896 -msgid "Set demo options" -msgstr "" - -#: pysollib/actions.py:910 +#: pysollib/actions.py:895 msgid "Set colors" msgstr "" -#: pysollib/actions.py:929 +#: pysollib/actions.py:914 msgid "Set fonts" msgstr "" -#: pysollib/actions.py:938 +#: pysollib/actions.py:923 msgid "Set timeouts" msgstr "" -#: pysollib/actions.py:953 +#: pysollib/actions.py:938 msgid "Error while saving options" msgstr "" -#: pysollib/actions.py:957 +#: pysollib/actions.py:942 msgid "" "Options were saved to\n" "\n" msgstr "" -#: pysollib/app.py:85 +#: pysollib/app.py:86 msgid "Unknown" msgstr "" -#: pysollib/app.py:947 +#: pysollib/app.py:952 msgid "Loading %s %s..." msgstr "" -#: pysollib/app.py:982 +#: pysollib/app.py:987 msgid " load error" msgstr "" -#: pysollib/app.py:983 +#: pysollib/app.py:988 msgid "Error while loading " msgstr "" -#: pysollib/app.py:1077 +#: pysollib/app.py:1082 msgid "Incompatible " msgstr "" -#: pysollib/app.py:1079 +#: pysollib/app.py:1084 msgid "" "The currently selected %s %s\n" "is not compatible with the game\n" @@ -282,7 +275,7 @@ msgid "" "Please select a %s type %s.\n" msgstr "" -#: pysollib/app.py:1095 +#: pysollib/app.py:1100 msgid "Please select a %s type %s" msgstr "" @@ -343,6 +336,11 @@ msgid "" "%s\n" msgstr "" +#: pysollib/game.py:1205 pysollib/game.py:1220 pysollib/game.py:1226 +#: pysollib/game.py:1231 pysollib/tk/menubar.py:250 +msgid "&New game" +msgstr "" + #: pysollib/game.py:1213 msgid "" "\n" @@ -357,7 +355,7 @@ msgstr "" msgid "Game finished" msgstr "" -#: pysollib/game.py:1225 pysollib/game.py:1642 +#: pysollib/game.py:1225 pysollib/game.py:1643 msgid "" "\n" "Game finished\n" @@ -369,8 +367,8 @@ msgid "" "Game finished, but not without my help...\n" msgstr "" -#: pysollib/game.py:1231 pysollib/tk/toolbar.py:184 -msgid "Restart" +#: pysollib/game.py:1231 +msgid "&Restart" msgstr "" #: pysollib/game.py:1535 @@ -378,22 +376,22 @@ msgid "Score %6d" msgstr "" #: pysollib/game.py:1634 -msgid "Cool" +msgid "&Cool" msgstr "" #: pysollib/game.py:1634 -msgid "Great" +msgid "&Great" msgstr "" #: pysollib/game.py:1634 -msgid "Wow" +msgid "&Wow" msgstr "" #: pysollib/game.py:1634 -msgid "Yeah" +msgid "&Yeah" msgstr "" -#: pysollib/game.py:1635 pysollib/game.py:1645 pysollib/game.py:1657 +#: pysollib/game.py:1635 pysollib/game.py:1646 pysollib/game.py:1658 msgid " Autopilot" msgstr "" @@ -403,49 +401,49 @@ msgid "" "Game solved in %d moves.\n" msgstr "" -#: pysollib/game.py:1656 -msgid "Hmm" +#: pysollib/game.py:1657 +msgid "&Hmm" msgstr "" -#: pysollib/game.py:1656 -msgid "Oh well" +#: pysollib/game.py:1657 +msgid "&Oh well" msgstr "" -#: pysollib/game.py:1656 -msgid "That's life" +#: pysollib/game.py:1657 +msgid "&That's life" msgstr "" -#: pysollib/game.py:1658 +#: pysollib/game.py:1659 msgid "" "\n" "This won't come out...\n" msgstr "" -#: pysollib/game.py:2062 +#: pysollib/game.py:2063 msgid "Set bookmark" msgstr "" -#: pysollib/game.py:2063 +#: pysollib/game.py:2064 msgid "Replace existing bookmark %d ?" msgstr "" -#: pysollib/game.py:2085 +#: pysollib/game.py:2086 msgid "Goto bookmark" msgstr "" -#: pysollib/game.py:2086 +#: pysollib/game.py:2087 msgid "Goto bookmark %d ?" msgstr "" -#: pysollib/game.py:2117 +#: pysollib/game.py:2118 msgid "Open game" msgstr "" -#: pysollib/game.py:2128 pysollib/game.py:2137 pysollib/game.py:2142 +#: pysollib/game.py:2129 pysollib/game.py:2138 pysollib/game.py:2143 msgid "Load game error" msgstr "" -#: pysollib/game.py:2129 +#: pysollib/game.py:2130 msgid "" "Error while loading game.\n" "\n" @@ -453,22 +451,22 @@ msgid "" "but this could also be a bug you might want to report." msgstr "" -#: pysollib/game.py:2138 +#: pysollib/game.py:2139 msgid "Error while loading game" msgstr "" -#: pysollib/game.py:2143 +#: pysollib/game.py:2144 msgid "" "Internal error while loading game.\n" "\n" "Please report this bug." msgstr "" -#: pysollib/game.py:2168 +#: pysollib/game.py:2169 msgid "Save game error" msgstr "" -#: pysollib/game.py:2169 +#: pysollib/game.py:2170 msgid "Error while saving game" msgstr "" @@ -724,7 +722,7 @@ msgid "Row. Build down in any suit but the same." msgstr "" #: pysollib/games/golf.py:114 pysollib/games/golf.py:413 -#: pysollib/stack.py:1740 +#: pysollib/stack.py:1742 msgid "Row. No building." msgstr "" @@ -732,7 +730,7 @@ msgstr "" msgid "Balance $%4d" msgstr "" -#: pysollib/games/golf.py:497 pysollib/stack.py:1673 +#: pysollib/games/golf.py:497 pysollib/stack.py:1675 msgid "Foundation. Build up regardless of suit." msgstr "" @@ -740,10 +738,47 @@ msgstr "" msgid "Balance $%d" msgstr "" -#: pysollib/games/klondike.py:387 +#: pysollib/games/klondike.py:391 msgid "Reserve. Only Kings are acceptable." msgstr "" +#: pysollib/games/mahjongg/mahjongg.py:294 +msgid "" +"No Free\n" +"Matching\n" +"Pairs" +msgstr "" + +#: pysollib/games/mahjongg/mahjongg.py:295 +msgid "" +"1 Free\n" +"Matching\n" +"Pair" +msgstr "" + +#: pysollib/games/mahjongg/mahjongg.py:296 +msgid "" +" Free\n" +"Matching\n" +"Pairs" +msgstr "" + +#: pysollib/games/mahjongg/mahjongg.py:297 +msgid "" +"\n" +"Tiles\n" +"Removed\n" +"\n" +msgstr "" + +#: pysollib/games/mahjongg/mahjongg.py:298 +msgid "" +"\n" +"Tiles\n" +"Remaining\n" +"\n" +msgstr "" + #: pysollib/games/matriarchy.py:125 msgid "Round %d/%d" msgstr "" @@ -806,7 +841,7 @@ msgstr "" #: pysollib/games/special/tarock.py:223 #: pysollib/games/ultra/dashavatara.py:351 #: pysollib/games/ultra/hexadeck.py:273 pysollib/games/ultra/mughal.py:254 -#: pysollib/stack.py:1190 pysollib/util.py:80 +#: pysollib/stack.py:1192 pysollib/util.py:80 msgid "Ace" msgstr "" @@ -818,12 +853,12 @@ msgstr "" msgid "Valet" msgstr "" -#: pysollib/games/special/tarock.py:224 pysollib/stack.py:1188 +#: pysollib/games/special/tarock.py:224 pysollib/stack.py:1190 #: pysollib/util.py:81 msgid "Queen" msgstr "" -#: pysollib/games/special/tarock.py:224 pysollib/stack.py:1189 +#: pysollib/games/special/tarock.py:224 pysollib/stack.py:1191 #: pysollib/util.py:81 msgid "King" msgstr "" @@ -1038,7 +1073,7 @@ msgstr "" msgid "Willow" msgstr "" -#: pysollib/games/ultra/larasgame.py:157 pysollib/stack.py:1368 +#: pysollib/games/ultra/larasgame.py:157 pysollib/stack.py:1370 msgid "Round %d" msgstr "" @@ -1117,15 +1152,15 @@ msgid "" msgstr "" #: pysollib/help.py:67 -msgid "Credits..." +msgid "&Credits..." msgstr "" #: pysollib/help.py:67 -msgid "Nice" +msgid "&Nice" msgstr "" #: pysollib/help.py:69 -msgid "Enjoy" +msgid "&Enjoy" msgstr "" #: pysollib/help.py:71 @@ -1187,7 +1222,7 @@ msgstr "" msgid " Help" msgstr "" -#: pysollib/main.py:68 pysollib/main.py:310 +#: pysollib/main.py:68 pysollib/main.py:321 msgid " installation error" msgstr "" @@ -1201,8 +1236,8 @@ msgid "" "Please check your %s installation.\n" msgstr "" -#: pysollib/main.py:76 pysollib/main.py:319 pysollib/tk/toolbar.py:197 -msgid "Quit" +#: pysollib/main.py:76 pysollib/main.py:330 pysollib/tk/menubar.py:269 +msgid "&Quit" msgstr "" #: pysollib/main.py:95 @@ -1236,7 +1271,7 @@ msgid "" "try %s --help for more information" msgstr "" -#: pysollib/main.py:311 +#: pysollib/main.py:322 msgid "" "\n" "No games were found !!!\n" @@ -1247,198 +1282,462 @@ msgid "" "Please check your %s installation.\n" msgstr "" -#: pysollib/main.py:397 pysollib/main.py:402 +#: pysollib/main.py:408 pysollib/main.py:416 msgid " installation problem" msgstr "" -#: pysollib/main.py:398 +#: pysollib/main.py:409 msgid "" "Your Python installation is compiled without thread support.\n" "\n" "Sounds and background music will be disabled." msgstr "" -#: pysollib/main.py:403 +#: pysollib/main.py:417 msgid "" "The pysolsoundserver module was not found.\n" "\n" "Sounds and background music will be disabled." msgstr "" -#: pysollib/main.py:407 +#: pysollib/main.py:424 msgid "Welcome to " msgstr "" +#: pysollib/resource.py:242 +msgid "French type (52 cards)" +msgstr "" + +#: pysollib/resource.py:243 +msgid "Hanafuda type (48 cards)" +msgstr "" + +#: pysollib/resource.py:244 +msgid "Tarock type (78 cards)" +msgstr "" + +#: pysollib/resource.py:245 +msgid "Mahjongg type (42 tiles)" +msgstr "" + +#: pysollib/resource.py:246 +msgid "Hex A Deck type (68 cards)" +msgstr "" + +#: pysollib/resource.py:247 +msgid "Mughal Ganjifa type (96 cards)" +msgstr "" + +#: pysollib/resource.py:248 +msgid "Navagraha Ganjifa type (108 cards)" +msgstr "" + +#: pysollib/resource.py:249 +msgid "Dashavatara Ganjifa type (120 cards)" +msgstr "" + +#: pysollib/resource.py:250 +msgid "Trumps only type (variable cards)" +msgstr "" + +#: pysollib/resource.py:254 +msgid "French" +msgstr "" + +#: pysollib/resource.py:255 pysollib/resource.py:279 +msgid "Hanafuda" +msgstr "" + +#: pysollib/resource.py:256 pysollib/resource.py:295 +msgid "Tarock" +msgstr "" + +#: pysollib/resource.py:257 pysollib/resource.py:282 +msgid "Mahjongg" +msgstr "" + +#: pysollib/resource.py:258 pysollib/resource.py:280 +msgid "Hex A Deck" +msgstr "" + +#: pysollib/resource.py:259 +msgid "Mughal Ganjifa" +msgstr "" + +#: pysollib/resource.py:260 +msgid "Navagraha Ganjifa" +msgstr "" + +#: pysollib/resource.py:261 +msgid "Dashavatara Ganjifa" +msgstr "" + +#: pysollib/resource.py:262 +msgid "Trumps only" +msgstr "" + +#: pysollib/resource.py:267 +msgid "Adult" +msgstr "" + +#: pysollib/resource.py:268 +msgid "Animals" +msgstr "" + +#: pysollib/resource.py:269 +msgid "Anime" +msgstr "" + +#: pysollib/resource.py:270 +msgid "Art" +msgstr "" + +#: pysollib/resource.py:271 +msgid "Cartoons" +msgstr "" + +#: pysollib/resource.py:272 +msgid "Children" +msgstr "" + +#: pysollib/resource.py:273 +msgid "Classic look" +msgstr "" + +#: pysollib/resource.py:274 +msgid "Collectors" +msgstr "" + +#: pysollib/resource.py:275 +msgid "Computers" +msgstr "" + +#: pysollib/resource.py:276 +msgid "Engines" +msgstr "" + +#: pysollib/resource.py:277 +msgid "Fantasy" +msgstr "" + +#: pysollib/resource.py:278 +msgid "Ganjifa" +msgstr "" + +#: pysollib/resource.py:281 +msgid "Holiday" +msgstr "" + +#: pysollib/resource.py:283 +msgid "Movies" +msgstr "" + +#: pysollib/resource.py:284 +msgid "Matrix" +msgstr "" + +#: pysollib/resource.py:285 +msgid "Music" +msgstr "" + +#: pysollib/resource.py:286 +msgid "Nature" +msgstr "" + +#: pysollib/resource.py:287 +msgid "Operating Systems" +msgstr "" + +#: pysollib/resource.py:288 +msgid "People" +msgstr "" + +#: pysollib/resource.py:289 +msgid "Places" +msgstr "" + +#: pysollib/resource.py:290 +msgid "Plain" +msgstr "" + +#: pysollib/resource.py:291 +msgid "Products" +msgstr "" + +#: pysollib/resource.py:292 +msgid "Round cardsets" +msgstr "" + +#: pysollib/resource.py:293 +msgid "Science Fiction" +msgstr "" + +#: pysollib/resource.py:294 +msgid "Sports" +msgstr "" + +#: pysollib/resource.py:296 +msgid "Vehicels" +msgstr "" + +#: pysollib/resource.py:297 +msgid "Video Games" +msgstr "" + +#: pysollib/resource.py:302 +msgid "Australia" +msgstr "" + +#: pysollib/resource.py:303 +msgid "Austria" +msgstr "" + +#: pysollib/resource.py:304 +msgid "Belgium" +msgstr "" + +#: pysollib/resource.py:305 +msgid "Canada" +msgstr "" + +#: pysollib/resource.py:306 +msgid "China" +msgstr "" + +#: pysollib/resource.py:307 +msgid "Czech Republic" +msgstr "" + +#: pysollib/resource.py:308 +msgid "Denmark" +msgstr "" + +#: pysollib/resource.py:309 +msgid "England" +msgstr "" + +#: pysollib/resource.py:310 +msgid "France" +msgstr "" + +#: pysollib/resource.py:311 +msgid "Germany" +msgstr "" + +#: pysollib/resource.py:312 +msgid "Great Britain" +msgstr "" + +#: pysollib/resource.py:313 +msgid "Hungary" +msgstr "" + +#: pysollib/resource.py:314 +msgid "India" +msgstr "" + +#: pysollib/resource.py:315 +msgid "Italy" +msgstr "" + +#: pysollib/resource.py:316 +msgid "Japan" +msgstr "" + +#: pysollib/resource.py:317 +msgid "Netherlands" +msgstr "" + +#: pysollib/resource.py:318 +msgid "Russia" +msgstr "" + +#: pysollib/resource.py:319 +msgid "Spain" +msgstr "" + +#: pysollib/resource.py:320 +msgid "Sweden" +msgstr "" + +#: pysollib/resource.py:321 +msgid "Switzerland" +msgstr "" + +#: pysollib/resource.py:322 +msgid "USA" +msgstr "" + #: pysollib/settings.py:58 msgid "Top 10" msgstr "" -#: pysollib/stack.py:1184 +#: pysollib/stack.py:1186 msgid "Base card - %s." msgstr "" -#: pysollib/stack.py:1185 +#: pysollib/stack.py:1187 msgid "Empty row cannot be filled." msgstr "" -#: pysollib/stack.py:1186 +#: pysollib/stack.py:1188 msgid "any card" msgstr "" -#: pysollib/stack.py:1187 pysollib/util.py:81 +#: pysollib/stack.py:1189 pysollib/util.py:81 msgid "Jack" msgstr "" -#: pysollib/stack.py:1196 +#: pysollib/stack.py:1198 msgid "No cards" msgstr "" -#: pysollib/stack.py:1197 +#: pysollib/stack.py:1199 msgid "1 card" msgstr "" -#: pysollib/stack.py:1198 +#: pysollib/stack.py:1200 msgid " cards" msgstr "" -#: pysollib/stack.py:1377 pysollib/stack.py:1379 pysollib/stack.py:1410 +#: pysollib/stack.py:1379 pysollib/stack.py:1381 pysollib/stack.py:1412 msgid "Redeal" msgstr "" -#: pysollib/stack.py:1379 +#: pysollib/stack.py:1381 msgid "Stop" msgstr "" -#: pysollib/stack.py:1430 +#: pysollib/stack.py:1432 msgid "Variable redeals." msgstr "" -#: pysollib/stack.py:1431 +#: pysollib/stack.py:1433 msgid "Unlimited redeals." msgstr "" -#: pysollib/stack.py:1432 +#: pysollib/stack.py:1434 msgid "No redeals." msgstr "" -#: pysollib/stack.py:1433 +#: pysollib/stack.py:1435 msgid "One redeal." msgstr "" -#: pysollib/stack.py:1434 +#: pysollib/stack.py:1436 msgid " redeals." msgstr "" -#: pysollib/stack.py:1436 +#: pysollib/stack.py:1438 msgid "Talon." msgstr "" -#: pysollib/stack.py:1611 pysollib/stack.py:2035 +#: pysollib/stack.py:1613 pysollib/stack.py:2037 msgid "Reserve. No building." msgstr "" -#: pysollib/stack.py:1657 +#: pysollib/stack.py:1659 msgid "Foundation. Build up by suit." msgstr "" -#: pysollib/stack.py:1658 +#: pysollib/stack.py:1660 msgid "Foundation. Build down by suit." msgstr "" -#: pysollib/stack.py:1659 pysollib/stack.py:1675 pysollib/stack.py:1697 +#: pysollib/stack.py:1661 pysollib/stack.py:1677 pysollib/stack.py:1699 msgid "Foundation. Build by same rank." msgstr "" -#: pysollib/stack.py:1674 +#: pysollib/stack.py:1676 msgid "Foundation. Build down regardless of suit." msgstr "" -#: pysollib/stack.py:1695 +#: pysollib/stack.py:1697 msgid "Foundation. Build up by alternate color." msgstr "" -#: pysollib/stack.py:1696 +#: pysollib/stack.py:1698 msgid "Foundation. Build down by alternate color." msgstr "" -#: pysollib/stack.py:1770 +#: pysollib/stack.py:1772 msgid "Row. Build up by alternate color." msgstr "" -#: pysollib/stack.py:1771 +#: pysollib/stack.py:1773 msgid "Row. Build down by alternate color." msgstr "" -#: pysollib/stack.py:1772 pysollib/stack.py:1782 pysollib/stack.py:1791 -#: pysollib/stack.py:1800 pysollib/stack.py:1828 +#: pysollib/stack.py:1774 pysollib/stack.py:1784 pysollib/stack.py:1793 +#: pysollib/stack.py:1802 pysollib/stack.py:1830 msgid "Row. Build by same rank." msgstr "" -#: pysollib/stack.py:1780 +#: pysollib/stack.py:1782 msgid "Row. Build up by color." msgstr "" -#: pysollib/stack.py:1781 +#: pysollib/stack.py:1783 msgid "Row. Build down by color." msgstr "" -#: pysollib/stack.py:1789 +#: pysollib/stack.py:1791 msgid "Row. Build up by suit." msgstr "" -#: pysollib/stack.py:1790 +#: pysollib/stack.py:1792 msgid "Row. Build down by suit." msgstr "" -#: pysollib/stack.py:1798 pysollib/stack.py:1826 +#: pysollib/stack.py:1800 pysollib/stack.py:1828 msgid "Row. Build up regardless of suit." msgstr "" -#: pysollib/stack.py:1799 pysollib/stack.py:1827 +#: pysollib/stack.py:1801 pysollib/stack.py:1829 msgid "Row. Build down regardless of suit." msgstr "" -#: pysollib/stack.py:1849 +#: pysollib/stack.py:1851 msgid "Row. Build up by alternate color, can move any face-up cards regardless of sequence." msgstr "" -#: pysollib/stack.py:1850 +#: pysollib/stack.py:1852 msgid "Row. Build down by alternate color, can move any face-up cards regardless of sequence." msgstr "" -#: pysollib/stack.py:1851 pysollib/stack.py:1862 +#: pysollib/stack.py:1853 pysollib/stack.py:1864 msgid "Row. Build by same rank, can move any face-up cards regardless of sequence." msgstr "" -#: pysollib/stack.py:1860 +#: pysollib/stack.py:1862 msgid "Row. Build up by suit, can move any face-up cards regardless of sequence." msgstr "" -#: pysollib/stack.py:1861 +#: pysollib/stack.py:1863 msgid "Row. Build down by suit, can move any face-up cards regardless of sequence." msgstr "" -#: pysollib/stack.py:1894 +#: pysollib/stack.py:1896 msgid "Row. Build up or down by color." msgstr "" -#: pysollib/stack.py:1905 +#: pysollib/stack.py:1907 msgid "Row. Build up or down by alternate color." msgstr "" -#: pysollib/stack.py:1916 +#: pysollib/stack.py:1918 msgid "Row. Build up or down by suit." msgstr "" -#: pysollib/stack.py:1927 +#: pysollib/stack.py:1929 msgid "Row. Build up or down regardless of suit." msgstr "" -#: pysollib/stack.py:1938 +#: pysollib/stack.py:1940 msgid "Waste." msgstr "" -#: pysollib/stack.py:2036 +#: pysollib/stack.py:2038 msgid "Free cell." msgstr "" @@ -1458,7 +1757,7 @@ msgstr "" msgid "Lost" msgstr "" -#: pysollib/stats.py:124 pysollib/tk/statusbar.py:134 +#: pysollib/stats.py:124 pysollib/tk/statusbar.py:137 msgid "Playing time" msgstr "" @@ -1478,19 +1777,19 @@ msgstr "" msgid "Game" msgstr "" -#: pysollib/stats.py:164 -msgid "Started at " -msgstr "" - #: pysollib/stats.py:164 msgid "Status" msgstr "" -#: pysollib/stats.py:164 pysollib/tk/statusbar.py:136 -#: pysollib/tk/tkstats.py:734 +#: pysollib/stats.py:164 pysollib/tk/statusbar.py:139 +#: pysollib/tk/tkstats.py:733 msgid "Game number" msgstr "" +#: pysollib/stats.py:164 pysollib/tk/tkstats.py:736 +msgid "Started at" +msgstr "" + #: pysollib/stats.py:187 msgid "** UNKNOWN %d **" msgstr "" @@ -1552,18 +1851,6 @@ msgstr "" msgid "Select color" msgstr "" -#: pysollib/tk/demooptionsdialog.py:66 -msgid "Display floating Demo logo" -msgstr "" - -#: pysollib/tk/demooptionsdialog.py:69 -msgid "Show score in statusbar" -msgstr "" - -#: pysollib/tk/demooptionsdialog.py:73 -msgid "Set demo delay in seconds" -msgstr "" - #: pysollib/tk/fontsdialog.py:85 msgid "abcdefghABCDEFGH" msgstr "" @@ -1632,421 +1919,412 @@ msgstr "" msgid "Customize toolbar" msgstr "" -#: pysollib/tk/menubar.py:248 -msgid "&File" -msgstr "" - #: pysollib/tk/menubar.py:249 -msgid "&New game" +msgid "&File" msgstr "" -#: pysollib/tk/menubar.py:250 +#: pysollib/tk/menubar.py:251 msgid "R&ecent games" msgstr "" -#: pysollib/tk/menubar.py:252 +#: pysollib/tk/menubar.py:253 msgid "Select &random game" msgstr "" -#: pysollib/tk/menubar.py:253 +#: pysollib/tk/menubar.py:254 msgid "&All games" msgstr "" -#: pysollib/tk/menubar.py:254 +#: pysollib/tk/menubar.py:255 msgid "Games played and &won" msgstr "" -#: pysollib/tk/menubar.py:255 +#: pysollib/tk/menubar.py:256 msgid "Games played and ¬ won" msgstr "" -#: pysollib/tk/menubar.py:256 +#: pysollib/tk/menubar.py:257 msgid "Games not &played" msgstr "" -#: pysollib/tk/menubar.py:257 +#: pysollib/tk/menubar.py:258 msgid "Select game by nu&mber..." msgstr "" -#: pysollib/tk/menubar.py:259 +#: pysollib/tk/menubar.py:260 msgid "Fa&vorite games" msgstr "" -#: pysollib/tk/menubar.py:260 +#: pysollib/tk/menubar.py:261 msgid "A&dd to favorites" msgstr "" -#: pysollib/tk/menubar.py:261 +#: pysollib/tk/menubar.py:262 msgid "R&emove from favorites" msgstr "" -#: pysollib/tk/menubar.py:263 +#: pysollib/tk/menubar.py:264 msgid "&Open..." msgstr "" -#: pysollib/tk/menubar.py:264 +#: pysollib/tk/menubar.py:265 msgid "&Save" msgstr "" -#: pysollib/tk/menubar.py:265 +#: pysollib/tk/menubar.py:266 msgid "Save &as..." msgstr "" -#: pysollib/tk/menubar.py:267 -msgid "&Hold and quit" -msgstr "" - #: pysollib/tk/menubar.py:268 -msgid "&Quit" +msgid "&Hold and quit" msgstr "" -#: pysollib/tk/menubar.py:270 +#: pysollib/tk/menubar.py:271 pysollib/tk/selectgame.py:409 msgid "&Select" msgstr "" -#: pysollib/tk/menubar.py:273 +#: pysollib/tk/menubar.py:274 msgid "&Edit" msgstr "" -#: pysollib/tk/menubar.py:274 +#: pysollib/tk/menubar.py:275 msgid "&Undo" msgstr "" -#: pysollib/tk/menubar.py:275 +#: pysollib/tk/menubar.py:276 msgid "&Redo" msgstr "" -#: pysollib/tk/menubar.py:276 +#: pysollib/tk/menubar.py:277 msgid "Redo &all" msgstr "" -#: pysollib/tk/menubar.py:279 +#: pysollib/tk/menubar.py:280 msgid "&Set bookmark" msgstr "" -#: pysollib/tk/menubar.py:281 pysollib/tk/menubar.py:285 +#: pysollib/tk/menubar.py:282 pysollib/tk/menubar.py:286 msgid "Bookmark %d" msgstr "" -#: pysollib/tk/menubar.py:283 +#: pysollib/tk/menubar.py:284 msgid "Go&to bookmark" msgstr "" -#: pysollib/tk/menubar.py:288 +#: pysollib/tk/menubar.py:289 msgid "&Clear bookmarks" msgstr "" -#: pysollib/tk/menubar.py:291 +#: pysollib/tk/menubar.py:292 msgid "Restart &game" msgstr "" -#: pysollib/tk/menubar.py:293 +#: pysollib/tk/menubar.py:294 msgid "&Game" msgstr "" -#: pysollib/tk/menubar.py:294 +#: pysollib/tk/menubar.py:295 msgid "&Deal cards" msgstr "" -#: pysollib/tk/menubar.py:295 pysollib/tk/menubar.py:324 +#: pysollib/tk/menubar.py:296 pysollib/tk/menubar.py:325 msgid "&Auto drop" msgstr "" -#: pysollib/tk/menubar.py:296 +#: pysollib/tk/menubar.py:297 msgid "&Pause" msgstr "" -#: pysollib/tk/menubar.py:299 +#: pysollib/tk/menubar.py:300 msgid "S&tatus..." msgstr "" -#: pysollib/tk/menubar.py:300 +#: pysollib/tk/menubar.py:301 msgid "&Comments..." msgstr "" -#: pysollib/tk/menubar.py:302 +#: pysollib/tk/menubar.py:303 msgid "&Statistics" msgstr "" -#: pysollib/tk/menubar.py:303 pysollib/tk/menubar.py:311 +#: pysollib/tk/menubar.py:304 pysollib/tk/menubar.py:312 msgid "Current game..." msgstr "" -#: pysollib/tk/menubar.py:304 pysollib/tk/menubar.py:312 -#: pysollib/tk/tkstats.py:289 +#: pysollib/tk/menubar.py:305 pysollib/tk/menubar.py:313 msgid "All games..." msgstr "" -#: pysollib/tk/menubar.py:306 pysollib/tk/tkstats.py:647 +#: pysollib/tk/menubar.py:307 msgid "Session log..." msgstr "" -#: pysollib/tk/menubar.py:307 pysollib/tk/tkstats.py:663 +#: pysollib/tk/menubar.py:308 msgid "Full log..." msgstr "" -#: pysollib/tk/menubar.py:310 +#: pysollib/tk/menubar.py:311 msgid "D&emo statistics" msgstr "" -#: pysollib/tk/menubar.py:314 +#: pysollib/tk/menubar.py:315 msgid "&Assist" msgstr "" -#: pysollib/tk/menubar.py:315 +#: pysollib/tk/menubar.py:316 msgid "&Hint" msgstr "" -#: pysollib/tk/menubar.py:316 +#: pysollib/tk/menubar.py:317 msgid "Highlight p&iles" msgstr "" -#: pysollib/tk/menubar.py:318 +#: pysollib/tk/menubar.py:319 msgid "&Demo" msgstr "" -#: pysollib/tk/menubar.py:319 +#: pysollib/tk/menubar.py:320 msgid "Demo (&all games)" msgstr "" -#: pysollib/tk/menubar.py:320 +#: pysollib/tk/menubar.py:321 msgid "&Options" msgstr "" -#: pysollib/tk/menubar.py:321 +#: pysollib/tk/menubar.py:322 msgid "&Player options..." msgstr "" -#: pysollib/tk/menubar.py:322 +#: pysollib/tk/menubar.py:323 msgid "&Automatic play" msgstr "" -#: pysollib/tk/menubar.py:323 +#: pysollib/tk/menubar.py:324 msgid "Auto &face up" msgstr "" -#: pysollib/tk/menubar.py:325 +#: pysollib/tk/menubar.py:326 msgid "Auto &deal" msgstr "" -#: pysollib/tk/menubar.py:327 +#: pysollib/tk/menubar.py:328 msgid "&Quick play" msgstr "" -#: pysollib/tk/menubar.py:328 +#: pysollib/tk/menubar.py:329 msgid "Assist &level" msgstr "" -#: pysollib/tk/menubar.py:329 +#: pysollib/tk/menubar.py:330 msgid "Enable &undo" msgstr "" -#: pysollib/tk/menubar.py:330 +#: pysollib/tk/menubar.py:331 msgid "Enable &bookmarks" msgstr "" -#: pysollib/tk/menubar.py:331 +#: pysollib/tk/menubar.py:332 msgid "Enable &hint" msgstr "" -#: pysollib/tk/menubar.py:332 +#: pysollib/tk/menubar.py:333 msgid "Enable highlight p&iles" msgstr "" -#: pysollib/tk/menubar.py:333 +#: pysollib/tk/menubar.py:334 msgid "Enable highlight &cards" msgstr "" -#: pysollib/tk/menubar.py:334 +#: pysollib/tk/menubar.py:335 msgid "Enable highlight same &rank" msgstr "" -#: pysollib/tk/menubar.py:335 +#: pysollib/tk/menubar.py:336 msgid "Highlight &no matching" msgstr "" -#: pysollib/tk/menubar.py:337 +#: pysollib/tk/menubar.py:338 msgid "Show removed tiles (in Mahjongg games)" msgstr "" -#: pysollib/tk/menubar.py:338 +#: pysollib/tk/menubar.py:339 msgid "Show hint arrow (in Shisen-Sho games)" msgstr "" -#: pysollib/tk/menubar.py:340 +#: pysollib/tk/menubar.py:341 msgid "&Sound" msgstr "" -#: pysollib/tk/menubar.py:350 +#: pysollib/tk/menubar.py:351 msgid "Cards&et..." msgstr "" -#: pysollib/tk/menubar.py:351 +#: pysollib/tk/menubar.py:352 msgid "Table t&ile..." msgstr "" -#: pysollib/tk/menubar.py:353 +#: pysollib/tk/menubar.py:354 msgid "Card &background" msgstr "" -#: pysollib/tk/menubar.py:354 +#: pysollib/tk/menubar.py:355 msgid "Card &view" msgstr "" -#: pysollib/tk/menubar.py:355 +#: pysollib/tk/menubar.py:356 msgid "Card shado&w" msgstr "" -#: pysollib/tk/menubar.py:356 +#: pysollib/tk/menubar.py:357 msgid "Shade &legal moves" msgstr "" -#: pysollib/tk/menubar.py:357 +#: pysollib/tk/menubar.py:358 msgid "&Negative card bottom" msgstr "" -#: pysollib/tk/menubar.py:358 +#: pysollib/tk/menubar.py:359 msgid "A&nimations" msgstr "" -#: pysollib/tk/menubar.py:359 +#: pysollib/tk/menubar.py:360 msgid "&None" msgstr "" -#: pysollib/tk/menubar.py:360 +#: pysollib/tk/menubar.py:361 msgid "&Timer based" msgstr "" -#: pysollib/tk/menubar.py:361 +#: pysollib/tk/menubar.py:362 msgid "&Fast" msgstr "" -#: pysollib/tk/menubar.py:362 +#: pysollib/tk/menubar.py:363 msgid "&Slow" msgstr "" -#: pysollib/tk/menubar.py:363 +#: pysollib/tk/menubar.py:364 msgid "&Very slow" msgstr "" -#: pysollib/tk/menubar.py:364 +#: pysollib/tk/menubar.py:365 msgid "Stick&y mouse" msgstr "" -#: pysollib/tk/menubar.py:368 +#: pysollib/tk/menubar.py:367 msgid "&Fonts..." msgstr "" -#: pysollib/tk/menubar.py:369 +#: pysollib/tk/menubar.py:368 msgid "&Colors..." msgstr "" -#: pysollib/tk/menubar.py:370 +#: pysollib/tk/menubar.py:369 msgid "Time&outs..." msgstr "" -#: pysollib/tk/menubar.py:372 +#: pysollib/tk/menubar.py:371 msgid "&Toolbar" msgstr "" -#: pysollib/tk/menubar.py:374 +#: pysollib/tk/menubar.py:373 msgid "Stat&usbar" msgstr "" -#: pysollib/tk/menubar.py:375 +#: pysollib/tk/menubar.py:374 msgid "Show &statusbar" msgstr "" -#: pysollib/tk/menubar.py:376 +#: pysollib/tk/menubar.py:375 msgid "Show &number of cards" msgstr "" -#: pysollib/tk/menubar.py:377 +#: pysollib/tk/menubar.py:376 msgid "Show &help bar" msgstr "" -#: pysollib/tk/menubar.py:378 +#: pysollib/tk/menubar.py:377 msgid "&Demo logo" msgstr "" -#: pysollib/tk/menubar.py:379 +#: pysollib/tk/menubar.py:378 msgid "Startup splash sc&reen" msgstr "" -#: pysollib/tk/menubar.py:383 +#: pysollib/tk/menubar.py:382 msgid "&Help" msgstr "" -#: pysollib/tk/menubar.py:384 +#: pysollib/tk/menubar.py:383 msgid "&Contents" msgstr "" -#: pysollib/tk/menubar.py:385 +#: pysollib/tk/menubar.py:384 msgid "&How to play" msgstr "" -#: pysollib/tk/menubar.py:386 +#: pysollib/tk/menubar.py:385 msgid "&Rules for this game" msgstr "" -#: pysollib/tk/menubar.py:387 +#: pysollib/tk/menubar.py:386 msgid "&License terms" msgstr "" -#: pysollib/tk/menubar.py:390 +#: pysollib/tk/menubar.py:389 msgid "&About " msgstr "" -#: pysollib/tk/menubar.py:498 +#: pysollib/tk/menubar.py:497 msgid "All &games..." msgstr "" -#: pysollib/tk/menubar.py:499 +#: pysollib/tk/menubar.py:498 msgid "Playable pre&view..." msgstr "" -#: pysollib/tk/menubar.py:501 +#: pysollib/tk/menubar.py:500 msgid "&Popular games" msgstr "" -#: pysollib/tk/menubar.py:504 +#: pysollib/tk/menubar.py:503 msgid "&French games" msgstr "" -#: pysollib/tk/menubar.py:507 +#: pysollib/tk/menubar.py:506 msgid "&Mahjongg games" msgstr "" -#: pysollib/tk/menubar.py:510 +#: pysollib/tk/menubar.py:509 msgid "&Oriental games" msgstr "" -#: pysollib/tk/menubar.py:514 +#: pysollib/tk/menubar.py:513 msgid "&Special games" msgstr "" -#: pysollib/tk/menubar.py:518 +#: pysollib/tk/menubar.py:517 msgid "All games by name" msgstr "" -#: pysollib/tk/menubar.py:855 pysollib/tk/menubar.py:857 +#: pysollib/tk/menubar.py:854 pysollib/tk/menubar.py:856 #: pysollib/tk/selectcardset.py:240 -msgid "Load" +msgid "&Load" msgstr "" -#: pysollib/tk/menubar.py:857 -msgid "Info..." +#: pysollib/tk/menubar.py:856 +msgid "&Info..." msgstr "" -#: pysollib/tk/menubar.py:860 +#: pysollib/tk/menubar.py:859 msgid "Select " msgstr "" -#: pysollib/tk/menubar.py:920 +#: pysollib/tk/menubar.py:919 msgid "Select table background" msgstr "" -#: pysollib/tk/menubar.py:932 pysollib/tk/selecttile.py:176 +#: pysollib/tk/menubar.py:931 pysollib/tk/selecttile.py:177 msgid "Select table color" msgstr "" @@ -2174,7 +2452,7 @@ msgid "by Compatibility" msgstr "" #: pysollib/tk/selectgame.py:159 -msgid "New games in v" +msgid "New games in v." msgstr "" #: pysollib/tk/selectgame.py:162 @@ -2347,11 +2625,11 @@ msgstr "" msgid "Lost:" msgstr "" -#: pysollib/tk/selectgame.py:374 pysollib/tk/tkstats.py:804 +#: pysollib/tk/selectgame.py:374 pysollib/tk/tkstats.py:803 msgid "Playing time:" msgstr "" -#: pysollib/tk/selectgame.py:375 pysollib/tk/tkstats.py:811 +#: pysollib/tk/selectgame.py:375 pysollib/tk/tkstats.py:810 msgid "Moves:" msgstr "" @@ -2360,22 +2638,18 @@ msgid "% won:" msgstr "" #: pysollib/tk/selectgame.py:409 -msgid "Select" -msgstr "" - -#: pysollib/tk/selectgame.py:409 pysollib/tk/toolbar.py:195 -msgid "Rules" +msgid "&Rules" msgstr "" -#: pysollib/tk/selectgame.py:490 +#: pysollib/tk/selectgame.py:489 msgid "Playable Preview - " msgstr "" -#: pysollib/tk/selectgame.py:538 +#: pysollib/tk/selectgame.py:537 msgid "variable" msgstr "" -#: pysollib/tk/selectgame.py:539 +#: pysollib/tk/selectgame.py:538 msgid "unlimited" msgstr "" @@ -2404,7 +2678,7 @@ msgid "All Backgrounds" msgstr "" #: pysollib/tk/selecttile.py:158 -msgid "Solid color..." +msgid "&Solid color..." msgstr "" #: pysollib/tk/soundoptionsdialog.py:76 @@ -2424,11 +2698,11 @@ msgid "Music volume" msgstr "" #: pysollib/tk/soundoptionsdialog.py:106 -msgid "Apply" +msgid "&Apply" msgstr "" #: pysollib/tk/soundoptionsdialog.py:106 pysollib/tk/soundoptionsdialog.py:108 -msgid "Mixer..." +msgid "&Mixer..." msgstr "" #: pysollib/tk/soundoptionsdialog.py:155 @@ -2441,11 +2715,11 @@ msgid "" "the next time you restart " msgstr "" -#: pysollib/tk/statusbar.py:135 +#: pysollib/tk/statusbar.py:138 msgid "Moves/Total moves" msgstr "" -#: pysollib/tk/statusbar.py:137 +#: pysollib/tk/statusbar.py:140 msgid "Games played: won/lost" msgstr "" @@ -2485,23 +2759,23 @@ msgstr "" msgid "Text only" msgstr "" -#: pysollib/tk/tkhtml.py:280 +#: pysollib/tk/tkhtml.py:229 msgid "Index" msgstr "" -#: pysollib/tk/tkhtml.py:284 +#: pysollib/tk/tkhtml.py:233 msgid "Back" msgstr "" -#: pysollib/tk/tkhtml.py:288 +#: pysollib/tk/tkhtml.py:237 msgid "Forward" msgstr "" -#: pysollib/tk/tkhtml.py:292 +#: pysollib/tk/tkhtml.py:241 msgid "Close" msgstr "" -#: pysollib/tk/tkhtml.py:394 +#: pysollib/tk/tkhtml.py:347 msgid "" " HTML limitation:\n" "The %s protocol is not supported yet.\n" @@ -2511,7 +2785,7 @@ msgid "" "%s\n" msgstr "" -#: pysollib/tk/tkhtml.py:419 pysollib/tk/tkhtml.py:423 +#: pysollib/tk/tkhtml.py:372 pysollib/tk/tkhtml.py:376 msgid "" "Unable to service request:\n" msgstr "" @@ -2532,142 +2806,150 @@ msgstr "" msgid "No games" msgstr "" +#: pysollib/tk/tkstats.py:289 +msgid "&All games..." +msgstr "" + #: pysollib/tk/tkstats.py:291 -msgid "Reset..." +msgid "&Reset..." msgstr "" -#: pysollib/tk/tkstats.py:574 pysollib/tk/tkstats.py:647 -#: pysollib/tk/tkstats.py:663 -msgid "Save to file" +#: pysollib/tk/tkstats.py:572 pysollib/tk/tkstats.py:645 +#: pysollib/tk/tkstats.py:661 +msgid "&Save to file" msgstr "" -#: pysollib/tk/tkstats.py:575 -msgid "Reset all..." +#: pysollib/tk/tkstats.py:573 +msgid "&Reset all..." msgstr "" -#: pysollib/tk/tkstats.py:625 +#: pysollib/tk/tkstats.py:623 msgid "No entries for player " msgstr "" -#: pysollib/tk/tkstats.py:642 +#: pysollib/tk/tkstats.py:640 msgid "" "No log entries for %s\n" msgstr "" -#: pysollib/tk/tkstats.py:658 +#: pysollib/tk/tkstats.py:645 +msgid "Session &log..." +msgstr "" + +#: pysollib/tk/tkstats.py:656 msgid "" "No current session log entries for %s\n" msgstr "" -#: pysollib/tk/tkstats.py:678 +#: pysollib/tk/tkstats.py:661 +msgid "&Full log..." +msgstr "" + +#: pysollib/tk/tkstats.py:676 msgid "Highlight piles: " msgstr "" -#: pysollib/tk/tkstats.py:679 +#: pysollib/tk/tkstats.py:677 msgid "Highlight cards: " msgstr "" -#: pysollib/tk/tkstats.py:680 +#: pysollib/tk/tkstats.py:678 msgid "Highlight same rank: " msgstr "" -#: pysollib/tk/tkstats.py:683 +#: pysollib/tk/tkstats.py:681 msgid "" "\n" "Redeals: " msgstr "" -#: pysollib/tk/tkstats.py:684 +#: pysollib/tk/tkstats.py:682 msgid "" "\n" "Cards in Talon: " msgstr "" -#: pysollib/tk/tkstats.py:686 +#: pysollib/tk/tkstats.py:684 msgid "" "\n" "Cards in Waste: " msgstr "" -#: pysollib/tk/tkstats.py:688 +#: pysollib/tk/tkstats.py:686 msgid "" "\n" "Cards in Foundations: " msgstr "" -#: pysollib/tk/tkstats.py:691 +#: pysollib/tk/tkstats.py:689 msgid "Game status" msgstr "" -#: pysollib/tk/tkstats.py:694 +#: pysollib/tk/tkstats.py:692 msgid "Playing time: " msgstr "" -#: pysollib/tk/tkstats.py:695 +#: pysollib/tk/tkstats.py:693 msgid "Started at: " msgstr "" -#: pysollib/tk/tkstats.py:696 +#: pysollib/tk/tkstats.py:694 msgid "Moves: " msgstr "" -#: pysollib/tk/tkstats.py:697 +#: pysollib/tk/tkstats.py:695 msgid "Undo moves: " msgstr "" -#: pysollib/tk/tkstats.py:698 +#: pysollib/tk/tkstats.py:696 msgid "Bookmark moves: " msgstr "" -#: pysollib/tk/tkstats.py:699 +#: pysollib/tk/tkstats.py:697 msgid "Demo moves: " msgstr "" -#: pysollib/tk/tkstats.py:700 +#: pysollib/tk/tkstats.py:698 msgid "Total player moves: " msgstr "" -#: pysollib/tk/tkstats.py:701 +#: pysollib/tk/tkstats.py:699 msgid "Total moves in this game: " msgstr "" -#: pysollib/tk/tkstats.py:702 +#: pysollib/tk/tkstats.py:700 msgid "Hints: " msgstr "" -#: pysollib/tk/tkstats.py:706 -msgid "Statistics..." +#: pysollib/tk/tkstats.py:704 +msgid "&Statistics..." msgstr "" -#: pysollib/tk/tkstats.py:731 +#: pysollib/tk/tkstats.py:730 msgid "N" msgstr "" -#: pysollib/tk/tkstats.py:737 -msgid "Started at" -msgstr "" - -#: pysollib/tk/tkstats.py:740 +#: pysollib/tk/tkstats.py:739 msgid "Result" msgstr "" -#: pysollib/tk/tkstats.py:796 +#: pysollib/tk/tkstats.py:795 msgid "Minimum" msgstr "" -#: pysollib/tk/tkstats.py:797 +#: pysollib/tk/tkstats.py:796 msgid "Maximum" msgstr "" -#: pysollib/tk/tkstats.py:798 +#: pysollib/tk/tkstats.py:797 msgid "Average" msgstr "" -#: pysollib/tk/tkstats.py:818 +#: pysollib/tk/tkstats.py:817 msgid "Total moves:" msgstr "" -#: pysollib/tk/tkstats.py:849 +#: pysollib/tk/tkstats.py:848 msgid "No TOP for this game" msgstr "" @@ -2675,6 +2957,10 @@ msgstr "" msgid "New" msgstr "" +#: pysollib/tk/toolbar.py:184 +msgid "Restart" +msgstr "" + #: pysollib/tk/toolbar.py:184 msgid "" "Restart the\n" @@ -2735,10 +3021,18 @@ msgstr "" msgid "View statistics" msgstr "" +#: pysollib/tk/toolbar.py:195 +msgid "Rules" +msgstr "" + #: pysollib/tk/toolbar.py:195 msgid "Rules for this game" msgstr "" +#: pysollib/tk/toolbar.py:197 +msgid "Quit" +msgstr "" + #: pysollib/tk/toolbar.py:209 msgid "Player" msgstr "" @@ -2747,7 +3041,7 @@ msgstr "" msgid "Player options" msgstr "" -#: pysollib/tk/toolbar.py:428 +#: pysollib/tk/toolbar.py:429 msgid "Toolbar" msgstr "" diff --git a/po/ru_games.po b/po/ru_games.po index e6f2588239..0a209d3bf9 100644 --- a/po/ru_games.po +++ b/po/ru_games.po @@ -5,8 +5,8 @@ msgid "" msgstr "" "Project-Id-Version: PySol 0.0.1\n" -"POT-Creation-Date: Fri May 26 20:25:43 2006\n" -"PO-Revision-Date: 2006-05-13 17:41+0400\n" +"POT-Creation-Date: Tue Jun 6 02:20:52 2006\n" +"PO-Revision-Date: 2006-06-03 03:28+0400\n" "Last-Translator: Скоморох \n" "Language-Team: Russian \n" "MIME-Version: 1.0\n" @@ -63,10 +63,6 @@ msgstr "" msgid "Acme" msgstr "" -#, fuzzy -msgid "Adelaide" -msgstr "Поляна" - msgid "Agnes Bernauer" msgstr "Агнесса Берно" @@ -2417,6 +2413,10 @@ msgstr "Крыса" msgid "Raw Prawn" msgstr "" +#, fuzzy +msgid "Realm" +msgstr "Овен" + msgid "Rectangle" msgstr "Прямоугольник" @@ -3186,3 +3186,7 @@ msgstr "Церлин (3 колоды)" msgid "Zeus" msgstr "Зевс" + +#, fuzzy +#~ msgid "Adelaide" +#~ msgstr "Аделаида" diff --git a/po/ru_pysol.po b/po/ru_pysol.po index 6cbde4ce41..c51e0a2727 100644 --- a/po/ru_pysol.po +++ b/po/ru_pysol.po @@ -5,8 +5,8 @@ msgid "" msgstr "" "Project-Id-Version: PySol 0.0.1\n" -"POT-Creation-Date: Fri May 26 20:25:31 2006\n" -"PO-Revision-Date: 2006-05-13 00:53+0400\n" +"POT-Creation-Date: Tue Jun 6 02:20:47 2006\n" +"PO-Revision-Date: 2006-06-06 09:08+0400\n" "Last-Translator: Скоморох \n" "Language-Team: Russian \n" "MIME-Version: 1.0\n" @@ -14,33 +14,32 @@ msgstr "" "Content-Transfer-Encoding: utf-8\n" "Generated-By: pygettext.py 1.5\n" -#: pysollib/actions.py:345 pysollib/game.py:1205 pysollib/game.py:1220 -#: pysollib/game.py:1226 pysollib/game.py:1231 pysollib/tk/toolbar.py:183 +#: pysollib/actions.py:344 pysollib/tk/toolbar.py:183 msgid "New game" msgstr "Новая игра" -#: pysollib/actions.py:358 pysollib/tk/menubar.py:668 -#: pysollib/tk/menubar.py:682 +#: pysollib/actions.py:357 pysollib/tk/menubar.py:667 +#: pysollib/tk/menubar.py:681 msgid "Select game" msgstr "Выбрать игру" -#: pysollib/actions.py:381 +#: pysollib/actions.py:380 msgid "Invalid game number" msgstr "Неправильный номер игры" -#: pysollib/actions.py:382 +#: pysollib/actions.py:381 msgid "Invalid game number\n" msgstr "Неправильный номер игры\n" -#: pysollib/actions.py:399 +#: pysollib/actions.py:398 msgid "Select next game number" msgstr "Выберите номер следующей игры" -#: pysollib/actions.py:408 pysollib/actions.py:418 +#: pysollib/actions.py:407 pysollib/actions.py:417 msgid "Select new game number" msgstr "Выберите номер новой игры" -#: pysollib/actions.py:409 +#: pysollib/actions.py:408 msgid "" "\n" "\n" @@ -50,72 +49,70 @@ msgstr "" "\n" "Введите номер новой игры" -#: pysollib/actions.py:410 -msgid "Next number" -msgstr "Следующий номер" +#: pysollib/actions.py:409 +msgid "&Next number" +msgstr "&Следующий номер" -#: pysollib/actions.py:410 pysollib/app.py:1085 pysollib/app.py:1097 -#: pysollib/game.py:828 pysollib/game.py:1641 pysollib/main.py:399 -#: pysollib/main.py:404 pysollib/tk/colorsdialog.py:131 -#: pysollib/tk/demooptionsdialog.py:87 pysollib/tk/edittextdialog.py:82 -#: pysollib/tk/edittextdialog.py:94 pysollib/tk/fontsdialog.py:140 +#: pysollib/actions.py:409 pysollib/app.py:1090 pysollib/app.py:1102 +#: pysollib/game.py:828 pysollib/game.py:1642 pysollib/main.py:413 +#: pysollib/main.py:421 pysollib/tk/colorsdialog.py:131 +#: pysollib/tk/edittextdialog.py:82 pysollib/tk/fontsdialog.py:140 #: pysollib/tk/fontsdialog.py:204 pysollib/tk/gameinfodialog.py:133 #: pysollib/tk/playeroptionsdialog.py:86 #: pysollib/tk/playeroptionsdialog.py:161 pysollib/tk/selectcardset.py:240 #: pysollib/tk/selectcardset.py:396 pysollib/tk/selecttile.py:158 #: pysollib/tk/soundoptionsdialog.py:106 pysollib/tk/soundoptionsdialog.py:158 -#: pysollib/tk/timeoutsdialog.py:92 pysollib/tk/tkhtml.py:506 -#: pysollib/tk/tkstats.py:288 pysollib/tk/tkstats.py:573 -#: pysollib/tk/tkstats.py:647 pysollib/tk/tkstats.py:663 -#: pysollib/tk/tkstats.py:705 pysollib/tk/tkstats.py:776 -#: pysollib/tk/tkstats.py:860 pysollib/tk/tkwidget.py:158 -#: pysollib/tk/tkwidget.py:297 -msgid "OK" -msgstr "ОК" - -#: pysollib/actions.py:410 pysollib/app.py:1097 pysollib/game.py:828 +#: pysollib/tk/timeoutsdialog.py:92 pysollib/tk/tkhtml.py:459 +#: pysollib/tk/tkstats.py:288 pysollib/tk/tkstats.py:571 +#: pysollib/tk/tkstats.py:645 pysollib/tk/tkstats.py:661 +#: pysollib/tk/tkstats.py:703 pysollib/tk/tkstats.py:775 +#: pysollib/tk/tkstats.py:859 pysollib/tk/tkwidget.py:159 +#: pysollib/tk/tkwidget.py:312 +msgid "&OK" +msgstr "&ОК" + +#: pysollib/actions.py:409 pysollib/app.py:1102 pysollib/game.py:828 #: pysollib/game.py:1205 pysollib/game.py:1220 pysollib/game.py:1226 #: pysollib/game.py:1231 pysollib/tk/colorsdialog.py:131 -#: pysollib/tk/demooptionsdialog.py:87 pysollib/tk/edittextdialog.py:94 -#: pysollib/tk/fontsdialog.py:140 pysollib/tk/fontsdialog.py:204 -#: pysollib/tk/menubar.py:855 pysollib/tk/menubar.py:857 -#: pysollib/tk/playeroptionsdialog.py:86 +#: pysollib/tk/edittextdialog.py:82 pysollib/tk/fontsdialog.py:140 +#: pysollib/tk/fontsdialog.py:204 pysollib/tk/menubar.py:854 +#: pysollib/tk/menubar.py:856 pysollib/tk/playeroptionsdialog.py:86 #: pysollib/tk/playeroptionsdialog.py:161 pysollib/tk/selectcardset.py:240 #: pysollib/tk/selectgame.py:268 pysollib/tk/selectgame.py:409 #: pysollib/tk/selecttile.py:158 pysollib/tk/soundoptionsdialog.py:106 -#: pysollib/tk/timeoutsdialog.py:92 pysollib/tk/tkwidget.py:297 -msgid "Cancel" -msgstr "Отмена" +#: pysollib/tk/timeoutsdialog.py:92 pysollib/tk/tkwidget.py:312 +msgid "&Cancel" +msgstr "От&мена" -#: pysollib/actions.py:426 +#: pysollib/actions.py:425 msgid "Select random game" msgstr "Выбор случайной игры" -#: pysollib/actions.py:462 +#: pysollib/actions.py:461 msgid "Select next game" msgstr "Выбрать следующую игру" -#: pysollib/actions.py:495 pysollib/tk/toolbar.py:197 +#: pysollib/actions.py:494 pysollib/tk/toolbar.py:197 msgid "Quit " msgstr "Выйти из " -#: pysollib/actions.py:545 +#: pysollib/actions.py:544 msgid "Clear bookmarks" msgstr "Удалить закладки" -#: pysollib/actions.py:546 +#: pysollib/actions.py:545 msgid "Clear all bookmarks ?" msgstr "Удалить все закладки?" -#: pysollib/actions.py:556 +#: pysollib/actions.py:555 msgid "Restart game" msgstr "Начать игру с начала" -#: pysollib/actions.py:557 +#: pysollib/actions.py:556 msgid "Restart this game ?" msgstr "Начать игру с начала?" -#: pysollib/actions.py:594 +#: pysollib/actions.py:593 msgid "" "Comments for %s:\n" "\n" @@ -123,19 +120,19 @@ msgstr "" "Комментарий для %s:\n" "\n" -#: pysollib/actions.py:596 +#: pysollib/actions.py:595 msgid "Comments for " msgstr "Комментарий для " -#: pysollib/actions.py:614 pysollib/actions.py:650 +#: pysollib/actions.py:613 pysollib/actions.py:649 msgid "Error while writing to file" msgstr "Ошибка при записи в файл" -#: pysollib/actions.py:617 pysollib/actions.py:653 pysollib/actions.py:956 +#: pysollib/actions.py:616 pysollib/actions.py:652 pysollib/actions.py:941 msgid " Info" msgstr " Информация" -#: pysollib/actions.py:618 +#: pysollib/actions.py:617 msgid "" "Comments were appended to\n" "\n" @@ -143,15 +140,15 @@ msgstr "" "Комментарий добавлен в файл\n" "\n" -#: pysollib/actions.py:635 +#: pysollib/actions.py:634 msgid "Demo statistics" msgstr "Статистика демо" -#: pysollib/actions.py:638 +#: pysollib/actions.py:637 msgid "Your statistics" msgstr "Ваша статистика" -#: pysollib/actions.py:654 +#: pysollib/actions.py:653 msgid "" " were appended to\n" "\n" @@ -159,52 +156,52 @@ msgstr "" " добавлена в файл\n" "\n" -#: pysollib/actions.py:668 +#: pysollib/actions.py:667 msgid " Demo" msgstr " Демо" -#: pysollib/actions.py:668 +#: pysollib/actions.py:667 msgid " Demo " msgstr " Демо " -#: pysollib/actions.py:671 pysollib/actions.py:689 +#: pysollib/actions.py:670 pysollib/actions.py:688 msgid " for " msgstr " для " -#: pysollib/actions.py:677 pysollib/actions.py:696 +#: pysollib/actions.py:676 pysollib/actions.py:695 msgid "Statistics for " msgstr "Статистика игры " -#: pysollib/actions.py:680 pysollib/tk/selectgame.py:352 +#: pysollib/actions.py:679 pysollib/tk/selectgame.py:352 #: pysollib/tk/toolbar.py:194 msgid "Statistics" msgstr "Статистика" -#: pysollib/actions.py:683 +#: pysollib/actions.py:682 msgid "Full log" msgstr "Полный лог" -#: pysollib/actions.py:686 +#: pysollib/actions.py:685 msgid "Session log" msgstr "Лог сессии" -#: pysollib/actions.py:692 +#: pysollib/actions.py:691 msgid "Game Info" msgstr "Информация об игре" -#: pysollib/actions.py:701 +#: pysollib/actions.py:700 msgid "Full log for " msgstr "Полный лог для " -#: pysollib/actions.py:706 +#: pysollib/actions.py:705 msgid "Session log for " msgstr "Лог сессии для " -#: pysollib/actions.py:711 +#: pysollib/actions.py:710 msgid "Reset all statistics" msgstr "Очистить всю статистику" -#: pysollib/actions.py:712 +#: pysollib/actions.py:711 msgid "" "Reset ALL statistics and logs for player\n" "%s ?" @@ -212,11 +209,11 @@ msgstr "" "Очистить всю статистику и лог для игрока\n" "%s?" -#: pysollib/actions.py:718 +#: pysollib/actions.py:717 msgid "Reset game statistics" msgstr "Очистить статистику игры" -#: pysollib/actions.py:719 +#: pysollib/actions.py:718 msgid "" "Reset statistics and logs for player\n" "%s\n" @@ -228,39 +225,35 @@ msgstr "" "и игры\n" "%s?" -#: pysollib/actions.py:775 +#: pysollib/actions.py:774 msgid "Play demo" msgstr "Показать демо" -#: pysollib/actions.py:786 +#: pysollib/actions.py:785 msgid "Set player options" msgstr "Установить настройки игрока" -#: pysollib/actions.py:875 +#: pysollib/actions.py:874 msgid "Sound settings" msgstr "Настройка звука" -#: pysollib/actions.py:896 -msgid "Set demo options" -msgstr "Настройка демо" - -#: pysollib/actions.py:910 +#: pysollib/actions.py:895 msgid "Set colors" msgstr "Настроить цвета" -#: pysollib/actions.py:929 +#: pysollib/actions.py:914 msgid "Set fonts" msgstr "Настроить шрифт" -#: pysollib/actions.py:938 +#: pysollib/actions.py:923 msgid "Set timeouts" msgstr "Настроить таймауты" -#: pysollib/actions.py:953 +#: pysollib/actions.py:938 msgid "Error while saving options" msgstr "Ошибка при сохранении настроек" -#: pysollib/actions.py:957 +#: pysollib/actions.py:942 msgid "" "Options were saved to\n" "\n" @@ -268,27 +261,27 @@ msgstr "" "Опции сохранены в\n" "\n" -#: pysollib/app.py:85 +#: pysollib/app.py:86 msgid "Unknown" msgstr "Неизвестный" -#: pysollib/app.py:947 +#: pysollib/app.py:952 msgid "Loading %s %s..." msgstr "Загружается %s %s..." -#: pysollib/app.py:982 +#: pysollib/app.py:987 msgid " load error" msgstr " ошибка при загрузке" -#: pysollib/app.py:983 +#: pysollib/app.py:988 msgid "Error while loading " msgstr "Ошибка при загрузке" -#: pysollib/app.py:1077 +#: pysollib/app.py:1082 msgid "Incompatible " msgstr "Несовместимый " -#: pysollib/app.py:1079 +#: pysollib/app.py:1084 msgid "" "The currently selected %s %s\n" "is not compatible with the game\n" @@ -302,7 +295,7 @@ msgstr "" "\n" "Необходимо выбрать %s типа %s.\n" -#: pysollib/app.py:1095 +#: pysollib/app.py:1100 msgid "Please select a %s type %s" msgstr "Выберите %s типа %s" @@ -383,6 +376,11 @@ msgstr "" "Количество ходов: %s\n" "%s\n" +#: pysollib/game.py:1205 pysollib/game.py:1220 pysollib/game.py:1226 +#: pysollib/game.py:1231 pysollib/tk/menubar.py:250 +msgid "&New game" +msgstr "&Новая игра" + #: pysollib/game.py:1213 msgid "" "\n" @@ -404,7 +402,7 @@ msgstr "" msgid "Game finished" msgstr "Игра закончена" -#: pysollib/game.py:1225 pysollib/game.py:1642 +#: pysollib/game.py:1225 pysollib/game.py:1643 msgid "" "\n" "Game finished\n" @@ -420,31 +418,31 @@ msgstr "" "\n" "Игра закончена, но не без моей помощи...\n" -#: pysollib/game.py:1231 pysollib/tk/toolbar.py:184 -msgid "Restart" -msgstr "Начало" +#: pysollib/game.py:1231 +msgid "&Restart" +msgstr "&Начало" #: pysollib/game.py:1535 msgid "Score %6d" msgstr "Счет %6d" #: pysollib/game.py:1634 -msgid "Cool" -msgstr "Отлично" +msgid "&Cool" +msgstr "&Отлично" #: pysollib/game.py:1634 -msgid "Great" -msgstr "Эдорово" +msgid "&Great" +msgstr "&Эдорово" #: pysollib/game.py:1634 -msgid "Wow" -msgstr "Ура" +msgid "&Wow" +msgstr "&Ура" #: pysollib/game.py:1634 -msgid "Yeah" -msgstr "Ага" +msgid "&Yeah" +msgstr "&Ага" -#: pysollib/game.py:1635 pysollib/game.py:1645 pysollib/game.py:1657 +#: pysollib/game.py:1635 pysollib/game.py:1646 pysollib/game.py:1658 msgid " Autopilot" msgstr " Автопилот" @@ -456,19 +454,19 @@ msgstr "" "\n" "Игра решена за %d ходов\n" -#: pysollib/game.py:1656 -msgid "Hmm" -msgstr "Хмм" +#: pysollib/game.py:1657 +msgid "&Hmm" +msgstr "&Хмм" -#: pysollib/game.py:1656 -msgid "Oh well" -msgstr "Ох" +#: pysollib/game.py:1657 +msgid "&Oh well" +msgstr "&Ох" -#: pysollib/game.py:1656 -msgid "That's life" -msgstr "Такова жизнь" +#: pysollib/game.py:1657 +msgid "&That's life" +msgstr "&Такова жизнь" -#: pysollib/game.py:1658 +#: pysollib/game.py:1659 msgid "" "\n" "This won't come out...\n" @@ -476,31 +474,31 @@ msgstr "" "\n" "Не удалось...\n" -#: pysollib/game.py:2062 +#: pysollib/game.py:2063 msgid "Set bookmark" msgstr "Установить закладку" -#: pysollib/game.py:2063 +#: pysollib/game.py:2064 msgid "Replace existing bookmark %d ?" msgstr "Заменить существующую закладку %d ?" -#: pysollib/game.py:2085 +#: pysollib/game.py:2086 msgid "Goto bookmark" msgstr "Перейти к закладке" -#: pysollib/game.py:2086 +#: pysollib/game.py:2087 msgid "Goto bookmark %d ?" msgstr "Перейти к закладке %d ?" -#: pysollib/game.py:2117 +#: pysollib/game.py:2118 msgid "Open game" msgstr "Открыть игру" -#: pysollib/game.py:2128 pysollib/game.py:2137 pysollib/game.py:2142 +#: pysollib/game.py:2129 pysollib/game.py:2138 pysollib/game.py:2143 msgid "Load game error" msgstr "Ошибка при загрузке игры" -#: pysollib/game.py:2129 +#: pysollib/game.py:2130 msgid "" "Error while loading game.\n" "\n" @@ -508,11 +506,11 @@ msgid "" "but this could also be a bug you might want to report." msgstr "" -#: pysollib/game.py:2138 +#: pysollib/game.py:2139 msgid "Error while loading game" msgstr "Ошибка при загрузке игры" -#: pysollib/game.py:2143 +#: pysollib/game.py:2144 msgid "" "Internal error while loading game.\n" "\n" @@ -522,11 +520,11 @@ msgstr "" "\n" "Пожалуйста сообщите об этой ошибке." -#: pysollib/game.py:2168 +#: pysollib/game.py:2169 msgid "Save game error" msgstr "Ошибка при сохранении игры" -#: pysollib/game.py:2169 +#: pysollib/game.py:2170 msgid "Error while saving game" msgstr "Ошибка при сохранении игры" @@ -692,11 +690,11 @@ msgstr "Классические" #: pysollib/gamedb.py:189 pysollib/gamedb.py:197 pysollib/gamedb.py:206 msgid "Ganjifa type" -msgstr "Игры типа Ганджифа (Ganjifa)" +msgstr "Игры типа Ганджифа" #: pysollib/gamedb.py:190 pysollib/gamedb.py:198 pysollib/gamedb.py:207 msgid "Hanafuda type" -msgstr "Игры типа Ханафуда (Hanafuda)" +msgstr "Игры типа Ханафуда" #: pysollib/gamedb.py:191 pysollib/gamedb.py:199 pysollib/gamedb.py:214 msgid "Hex A Deck type" @@ -708,19 +706,19 @@ msgstr "Таро" #: pysollib/gamedb.py:205 msgid "Dashavatara Ganjifa type" -msgstr "Игры типа Дашаватара Ганджифа (Dashavatara Ganjifa)" +msgstr "Игры типа Дашаватара Ганджифа" #: pysollib/gamedb.py:208 msgid "Mughal Ganjifa type" -msgstr "Игры типа Мугал Ганджифа (Mughal Ganjifa)" +msgstr "Игры типа Мугал Ганджифа" #: pysollib/gamedb.py:209 msgid "Navagraha Ganjifa type" -msgstr "Игры типа Наваграха Ганджифа (Navagraha Ganjifa)" +msgstr "Игры типа Наваграха Ганджифа" #: pysollib/gamedb.py:213 msgid "Shisen-Sho" -msgstr "" +msgstr "Шисен-Сё" #: pysollib/gamedb.py:215 msgid "Matrix type" @@ -786,7 +784,7 @@ msgid "Row. Build down in any suit but the same." msgstr "" #: pysollib/games/golf.py:114 pysollib/games/golf.py:413 -#: pysollib/stack.py:1740 +#: pysollib/stack.py:1742 msgid "Row. No building." msgstr "" @@ -794,7 +792,7 @@ msgstr "" msgid "Balance $%4d" msgstr "Баланс $%4d" -#: pysollib/games/golf.py:497 pysollib/stack.py:1673 +#: pysollib/games/golf.py:497 pysollib/stack.py:1675 msgid "Foundation. Build up regardless of suit." msgstr "" @@ -802,10 +800,62 @@ msgstr "" msgid "Balance $%d" msgstr "Баланс $%d" -#: pysollib/games/klondike.py:387 +#: pysollib/games/klondike.py:391 msgid "Reserve. Only Kings are acceptable." msgstr "" +#: pysollib/games/mahjongg/mahjongg.py:294 +msgid "" +"No Free\n" +"Matching\n" +"Pairs" +msgstr "" +"Нет\n" +"свободных\n" +"пар" + +#: pysollib/games/mahjongg/mahjongg.py:295 +msgid "" +"1 Free\n" +"Matching\n" +"Pair" +msgstr "" +"1\n" +"свободная\n" +"пара" + +#: pysollib/games/mahjongg/mahjongg.py:296 +msgid "" +" Free\n" +"Matching\n" +"Pairs" +msgstr "" +" \n" +"свободных\n" +"пар" + +#: pysollib/games/mahjongg/mahjongg.py:297 +msgid "" +"\n" +"Tiles\n" +"Removed\n" +"\n" +msgstr "" +"\n" +"удалено\n" +"\n" + +#: pysollib/games/mahjongg/mahjongg.py:298 +msgid "" +"\n" +"Tiles\n" +"Remaining\n" +"\n" +msgstr "" +"\n" +"осталось\n" +"\n" + #: pysollib/games/matriarchy.py:125 msgid "Round %d/%d" msgstr "Раунд %d/%d" @@ -879,7 +929,7 @@ msgstr "Жезлы" #: pysollib/games/special/tarock.py:223 #: pysollib/games/ultra/dashavatara.py:351 #: pysollib/games/ultra/hexadeck.py:273 pysollib/games/ultra/mughal.py:254 -#: pysollib/stack.py:1190 pysollib/util.py:80 +#: pysollib/stack.py:1192 pysollib/util.py:80 msgid "Ace" msgstr "Туз" @@ -891,12 +941,12 @@ msgstr "Паж" msgid "Valet" msgstr "Валет" -#: pysollib/games/special/tarock.py:224 pysollib/stack.py:1188 +#: pysollib/games/special/tarock.py:224 pysollib/stack.py:1190 #: pysollib/util.py:81 msgid "Queen" msgstr "Королева" -#: pysollib/games/special/tarock.py:224 pysollib/stack.py:1189 +#: pysollib/games/special/tarock.py:224 pysollib/stack.py:1191 #: pysollib/util.py:81 msgid "King" msgstr "Король" @@ -1111,7 +1161,7 @@ msgstr "" msgid "Willow" msgstr "Ива" -#: pysollib/games/ultra/larasgame.py:157 pysollib/stack.py:1368 +#: pysollib/games/ultra/larasgame.py:157 pysollib/stack.py:1370 msgid "Round %d" msgstr "Раунд %d" @@ -1201,16 +1251,16 @@ msgid "A World Domination Project\n" msgstr "Всемирный непревзойденный проект\n" #: pysollib/help.py:67 -msgid "Credits..." -msgstr "Благодарности..." +msgid "&Credits..." +msgstr "&Благодарности..." #: pysollib/help.py:67 -msgid "Nice" -msgstr "Отлично" +msgid "&Nice" +msgstr "&Отлично" #: pysollib/help.py:69 -msgid "Enjoy" -msgstr "Наслаждайтесь" +msgid "&Enjoy" +msgstr "&Наслаждайтесь" #: pysollib/help.py:71 msgid "" @@ -1286,7 +1336,7 @@ msgstr "Не найден файл помощи\n" msgid " Help" msgstr " Помощь" -#: pysollib/main.py:68 pysollib/main.py:310 +#: pysollib/main.py:68 pysollib/main.py:321 msgid " installation error" msgstr " проблема с установкой" @@ -1300,9 +1350,9 @@ msgid "" "Please check your %s installation.\n" msgstr "" -#: pysollib/main.py:76 pysollib/main.py:319 pysollib/tk/toolbar.py:197 -msgid "Quit" -msgstr "Выйти" +#: pysollib/main.py:76 pysollib/main.py:330 pysollib/tk/menubar.py:269 +msgid "&Quit" +msgstr "В&ыход" #: pysollib/main.py:95 msgid "" @@ -1350,7 +1400,7 @@ msgstr "" "%s: неправильное имя файла\n" "попробуйте %s --help для получения более подробной информаци" -#: pysollib/main.py:311 +#: pysollib/main.py:322 msgid "" "\n" "No games were found !!!\n" @@ -1361,18 +1411,18 @@ msgid "" "Please check your %s installation.\n" msgstr "" -#: pysollib/main.py:397 pysollib/main.py:402 +#: pysollib/main.py:408 pysollib/main.py:416 msgid " installation problem" msgstr "" -#: pysollib/main.py:398 +#: pysollib/main.py:409 msgid "" "Your Python installation is compiled without thread support.\n" "\n" "Sounds and background music will be disabled." msgstr "" -#: pysollib/main.py:403 +#: pysollib/main.py:417 msgid "" "The pysolsoundserver module was not found.\n" "\n" @@ -1382,187 +1432,452 @@ msgstr "" "\n" "Звук и фоновая музыка будут недоступны" -#: pysollib/main.py:407 +#: pysollib/main.py:424 msgid "Welcome to " msgstr "Добро пожаловать в " +#: pysollib/resource.py:242 +msgid "French type (52 cards)" +msgstr "Классические (52 карты)" + +#: pysollib/resource.py:243 +msgid "Hanafuda type (48 cards)" +msgstr "Ханафуда (48 карт)" + +#: pysollib/resource.py:244 +msgid "Tarock type (78 cards)" +msgstr "Таро (78 карт)" + +#: pysollib/resource.py:245 +msgid "Mahjongg type (42 tiles)" +msgstr "Маджонг (42 фишки)" + +#: pysollib/resource.py:246 +msgid "Hex A Deck type (68 cards)" +msgstr "Hex A Deck (68 карт)" + +#: pysollib/resource.py:247 +msgid "Mughal Ganjifa type (96 cards)" +msgstr "Мугал Ганджифа (96 карт)" + +#: pysollib/resource.py:248 +msgid "Navagraha Ganjifa type (108 cards)" +msgstr "Наваграха Ганджифа (108 карт)" + +#: pysollib/resource.py:249 +msgid "Dashavatara Ganjifa type (120 cards)" +msgstr "Дашаватара Ганджифа (120 карт)" + +#: pysollib/resource.py:250 +msgid "Trumps only type (variable cards)" +msgstr "" + +#: pysollib/resource.py:254 +msgid "French" +msgstr "Классические" + +#: pysollib/resource.py:255 pysollib/resource.py:279 +msgid "Hanafuda" +msgstr "Ханафуда" + +#: pysollib/resource.py:256 pysollib/resource.py:295 +msgid "Tarock" +msgstr "Таро" + +#: pysollib/resource.py:257 pysollib/resource.py:282 +msgid "Mahjongg" +msgstr "Маджонг" + +#: pysollib/resource.py:258 pysollib/resource.py:280 +msgid "Hex A Deck" +msgstr "Hex A Deck" + +#: pysollib/resource.py:259 +msgid "Mughal Ganjifa" +msgstr "Мугал Ганджифа" + +#: pysollib/resource.py:260 +msgid "Navagraha Ganjifa" +msgstr "Наваграха Ганджифа" + +#: pysollib/resource.py:261 +msgid "Dashavatara Ganjifa" +msgstr "Дашаватара Ганджифа" + +#: pysollib/resource.py:262 +#, fuzzy +msgid "Trumps only" +msgstr "Козырь" + +#: pysollib/resource.py:267 +msgid "Adult" +msgstr "Для взрослых" + +#: pysollib/resource.py:268 +msgid "Animals" +msgstr "Животные" + +#: pysollib/resource.py:269 +msgid "Anime" +msgstr "Мультфильмы" + +#: pysollib/resource.py:270 +msgid "Art" +msgstr "Искусство" + +#: pysollib/resource.py:271 +msgid "Cartoons" +msgstr "Комиксы" + +#: pysollib/resource.py:272 +msgid "Children" +msgstr "Дети" + +#: pysollib/resource.py:273 +msgid "Classic look" +msgstr "Классический вид" + +#: pysollib/resource.py:274 +msgid "Collectors" +msgstr "Коллекционные" + +#: pysollib/resource.py:275 +msgid "Computers" +msgstr "Компьютеры" + +#: pysollib/resource.py:276 +msgid "Engines" +msgstr "Машины" + +#: pysollib/resource.py:277 +msgid "Fantasy" +msgstr "Фентези" + +#: pysollib/resource.py:278 +msgid "Ganjifa" +msgstr "Ганджифа" + +#: pysollib/resource.py:281 +msgid "Holiday" +msgstr "Праздники" + +#: pysollib/resource.py:283 +msgid "Movies" +msgstr "Фильмы" + +#: pysollib/resource.py:284 +msgid "Matrix" +msgstr "Мозаика" + +#: pysollib/resource.py:285 +msgid "Music" +msgstr "Музыка" + +#: pysollib/resource.py:286 +msgid "Nature" +msgstr "Природа" + +#: pysollib/resource.py:287 +msgid "Operating Systems" +msgstr "Операционные системы" + +#: pysollib/resource.py:288 +msgid "People" +msgstr "Люди" + +#: pysollib/resource.py:289 +msgid "Places" +msgstr "Дома" + +#: pysollib/resource.py:290 +msgid "Plain" +msgstr "Простые" + +#: pysollib/resource.py:291 +msgid "Products" +msgstr "Продукты" + +#: pysollib/resource.py:292 +msgid "Round cardsets" +msgstr "Закруглённые" + +#: pysollib/resource.py:293 +msgid "Science Fiction" +msgstr "Научная фантастика" + +#: pysollib/resource.py:294 +msgid "Sports" +msgstr "Спорт" + +#: pysollib/resource.py:296 +msgid "Vehicels" +msgstr "Транспортные средства" + +#: pysollib/resource.py:297 +msgid "Video Games" +msgstr "Видеоигры" + +#: pysollib/resource.py:302 +msgid "Australia" +msgstr "Австралия" + +#: pysollib/resource.py:303 +msgid "Austria" +msgstr "Австрия" + +#: pysollib/resource.py:304 +msgid "Belgium" +msgstr "Бельгия" + +#: pysollib/resource.py:305 +msgid "Canada" +msgstr "Канада" + +#: pysollib/resource.py:306 +msgid "China" +msgstr "Китай" + +#: pysollib/resource.py:307 +msgid "Czech Republic" +msgstr "Чехия" + +#: pysollib/resource.py:308 +msgid "Denmark" +msgstr "Дания" + +#: pysollib/resource.py:309 +msgid "England" +msgstr "Англия" + +#: pysollib/resource.py:310 +msgid "France" +msgstr "Франция" + +#: pysollib/resource.py:311 +msgid "Germany" +msgstr "Германия" + +#: pysollib/resource.py:312 +msgid "Great Britain" +msgstr "Великобритания" + +#: pysollib/resource.py:313 +msgid "Hungary" +msgstr "Венгрия" + +#: pysollib/resource.py:314 +msgid "India" +msgstr "Индия" + +#: pysollib/resource.py:315 +msgid "Italy" +msgstr "Италия" + +#: pysollib/resource.py:316 +msgid "Japan" +msgstr "Япония" + +#: pysollib/resource.py:317 +msgid "Netherlands" +msgstr "Голландия" + +#: pysollib/resource.py:318 +msgid "Russia" +msgstr "Россия" + +#: pysollib/resource.py:319 +msgid "Spain" +msgstr "Испания" + +#: pysollib/resource.py:320 +msgid "Sweden" +msgstr "Швеция" + +#: pysollib/resource.py:321 +msgid "Switzerland" +msgstr "Швейцария" + +#: pysollib/resource.py:322 +msgid "USA" +msgstr "США" + #: pysollib/settings.py:58 msgid "Top 10" msgstr "Top 10" -#: pysollib/stack.py:1184 +#: pysollib/stack.py:1186 msgid "Base card - %s." msgstr "" -#: pysollib/stack.py:1185 +#: pysollib/stack.py:1187 msgid "Empty row cannot be filled." msgstr "" -#: pysollib/stack.py:1186 +#: pysollib/stack.py:1188 msgid "any card" msgstr "" -#: pysollib/stack.py:1187 pysollib/util.py:81 +#: pysollib/stack.py:1189 pysollib/util.py:81 msgid "Jack" msgstr "Валет" -#: pysollib/stack.py:1196 +#: pysollib/stack.py:1198 msgid "No cards" msgstr "Нет карт" -#: pysollib/stack.py:1197 +#: pysollib/stack.py:1199 msgid "1 card" msgstr "1 карта" -#: pysollib/stack.py:1198 +#: pysollib/stack.py:1200 msgid " cards" msgstr " карт" -#: pysollib/stack.py:1377 pysollib/stack.py:1379 pysollib/stack.py:1410 +#: pysollib/stack.py:1379 pysollib/stack.py:1381 pysollib/stack.py:1412 msgid "Redeal" msgstr "Сдать" -#: pysollib/stack.py:1379 +#: pysollib/stack.py:1381 msgid "Stop" msgstr "Стоп" -#: pysollib/stack.py:1430 +#: pysollib/stack.py:1432 msgid "Variable redeals." msgstr "Переменное количество пересдач." -#: pysollib/stack.py:1431 +#: pysollib/stack.py:1433 msgid "Unlimited redeals." msgstr "Неограниченное количество пересдач." -#: pysollib/stack.py:1432 +#: pysollib/stack.py:1434 msgid "No redeals." msgstr "Без пересдачи." -#: pysollib/stack.py:1433 +#: pysollib/stack.py:1435 msgid "One redeal." msgstr "1 пересдача." -#: pysollib/stack.py:1434 +#: pysollib/stack.py:1436 msgid " redeals." msgstr " пересдачи." -#: pysollib/stack.py:1436 +#: pysollib/stack.py:1438 msgid "Talon." msgstr "" -#: pysollib/stack.py:1611 pysollib/stack.py:2035 +#: pysollib/stack.py:1613 pysollib/stack.py:2037 msgid "Reserve. No building." msgstr "" -#: pysollib/stack.py:1657 +#: pysollib/stack.py:1659 msgid "Foundation. Build up by suit." msgstr "" -#: pysollib/stack.py:1658 +#: pysollib/stack.py:1660 msgid "Foundation. Build down by suit." msgstr "" -#: pysollib/stack.py:1659 pysollib/stack.py:1675 pysollib/stack.py:1697 +#: pysollib/stack.py:1661 pysollib/stack.py:1677 pysollib/stack.py:1699 msgid "Foundation. Build by same rank." msgstr "" -#: pysollib/stack.py:1674 +#: pysollib/stack.py:1676 msgid "Foundation. Build down regardless of suit." msgstr "" -#: pysollib/stack.py:1695 +#: pysollib/stack.py:1697 msgid "Foundation. Build up by alternate color." msgstr "" -#: pysollib/stack.py:1696 +#: pysollib/stack.py:1698 msgid "Foundation. Build down by alternate color." msgstr "" -#: pysollib/stack.py:1770 +#: pysollib/stack.py:1772 msgid "Row. Build up by alternate color." msgstr "" -#: pysollib/stack.py:1771 +#: pysollib/stack.py:1773 msgid "Row. Build down by alternate color." msgstr "" -#: pysollib/stack.py:1772 pysollib/stack.py:1782 pysollib/stack.py:1791 -#: pysollib/stack.py:1800 pysollib/stack.py:1828 +#: pysollib/stack.py:1774 pysollib/stack.py:1784 pysollib/stack.py:1793 +#: pysollib/stack.py:1802 pysollib/stack.py:1830 msgid "Row. Build by same rank." msgstr "" -#: pysollib/stack.py:1780 +#: pysollib/stack.py:1782 msgid "Row. Build up by color." msgstr "" -#: pysollib/stack.py:1781 +#: pysollib/stack.py:1783 msgid "Row. Build down by color." msgstr "" -#: pysollib/stack.py:1789 +#: pysollib/stack.py:1791 msgid "Row. Build up by suit." msgstr "" -#: pysollib/stack.py:1790 +#: pysollib/stack.py:1792 msgid "Row. Build down by suit." msgstr "" -#: pysollib/stack.py:1798 pysollib/stack.py:1826 +#: pysollib/stack.py:1800 pysollib/stack.py:1828 msgid "Row. Build up regardless of suit." msgstr "" -#: pysollib/stack.py:1799 pysollib/stack.py:1827 +#: pysollib/stack.py:1801 pysollib/stack.py:1829 msgid "Row. Build down regardless of suit." msgstr "" -#: pysollib/stack.py:1849 +#: pysollib/stack.py:1851 msgid "" "Row. Build up by alternate color, can move any face-up cards regardless of " "sequence." msgstr "" -#: pysollib/stack.py:1850 +#: pysollib/stack.py:1852 msgid "" "Row. Build down by alternate color, can move any face-up cards regardless of " "sequence." msgstr "" -#: pysollib/stack.py:1851 pysollib/stack.py:1862 +#: pysollib/stack.py:1853 pysollib/stack.py:1864 msgid "" "Row. Build by same rank, can move any face-up cards regardless of sequence." msgstr "" -#: pysollib/stack.py:1860 +#: pysollib/stack.py:1862 msgid "" "Row. Build up by suit, can move any face-up cards regardless of sequence." msgstr "" -#: pysollib/stack.py:1861 +#: pysollib/stack.py:1863 msgid "" "Row. Build down by suit, can move any face-up cards regardless of sequence." msgstr "" -#: pysollib/stack.py:1894 +#: pysollib/stack.py:1896 msgid "Row. Build up or down by color." msgstr "" -#: pysollib/stack.py:1905 +#: pysollib/stack.py:1907 msgid "Row. Build up or down by alternate color." msgstr "" -#: pysollib/stack.py:1916 +#: pysollib/stack.py:1918 msgid "Row. Build up or down by suit." msgstr "" -#: pysollib/stack.py:1927 +#: pysollib/stack.py:1929 msgid "Row. Build up or down regardless of suit." msgstr "" -#: pysollib/stack.py:1938 +#: pysollib/stack.py:1940 msgid "Waste." msgstr "" -#: pysollib/stack.py:2036 +#: pysollib/stack.py:2038 msgid "Free cell." msgstr "Свободная ячейка." @@ -1582,7 +1897,7 @@ msgstr "Выиграл" msgid "Lost" msgstr "Проиграл" -#: pysollib/stats.py:124 pysollib/tk/statusbar.py:134 +#: pysollib/stats.py:124 pysollib/tk/statusbar.py:137 msgid "Playing time" msgstr "Время игры" @@ -1602,19 +1917,19 @@ msgstr "Всего (%d из %d игр)" msgid "Game" msgstr "Игра" -#: pysollib/stats.py:164 -msgid "Started at " -msgstr "Игра начата " - #: pysollib/stats.py:164 msgid "Status" msgstr "Статус" -#: pysollib/stats.py:164 pysollib/tk/statusbar.py:136 -#: pysollib/tk/tkstats.py:734 +#: pysollib/stats.py:164 pysollib/tk/statusbar.py:139 +#: pysollib/tk/tkstats.py:733 msgid "Game number" msgstr "Номер игры" +#: pysollib/stats.py:164 pysollib/tk/tkstats.py:736 +msgid "Started at" +msgstr "Игра начата" + #: pysollib/stats.py:187 msgid "** UNKNOWN %d **" msgstr "" @@ -1676,18 +1991,6 @@ msgstr "Подсветка отсутствия совпадения:" msgid "Select color" msgstr "Выбрать цвет" -#: pysollib/tk/demooptionsdialog.py:66 -msgid "Display floating Demo logo" -msgstr "Показывать демо лого" - -#: pysollib/tk/demooptionsdialog.py:69 -msgid "Show score in statusbar" -msgstr "Показывать счет в строке состояния" - -#: pysollib/tk/demooptionsdialog.py:73 -msgid "Set demo delay in seconds" -msgstr "Установить задуржку демо в секундах" - #: pysollib/tk/fontsdialog.py:85 msgid "abcdefghABCDEFGH" msgstr "abcdeABCDE абвгдАБВГД" @@ -1756,421 +2059,412 @@ msgstr "Большие пиктограммы" msgid "Customize toolbar" msgstr "Настроить панель инструментов" -#: pysollib/tk/menubar.py:248 +#: pysollib/tk/menubar.py:249 msgid "&File" msgstr "&Файл" -#: pysollib/tk/menubar.py:249 -msgid "&New game" -msgstr "&Новая игра" - -#: pysollib/tk/menubar.py:250 +#: pysollib/tk/menubar.py:251 msgid "R&ecent games" msgstr "Выбрать н&едавнюю игру" -#: pysollib/tk/menubar.py:252 +#: pysollib/tk/menubar.py:253 msgid "Select &random game" msgstr "С&лучайная игра" -#: pysollib/tk/menubar.py:253 +#: pysollib/tk/menubar.py:254 msgid "&All games" msgstr "&Все игры" -#: pysollib/tk/menubar.py:254 +#: pysollib/tk/menubar.py:255 msgid "Games played and &won" msgstr "&Выигранные игры" -#: pysollib/tk/menubar.py:255 +#: pysollib/tk/menubar.py:256 msgid "Games played and ¬ won" msgstr "&Невыигранные игры" -#: pysollib/tk/menubar.py:256 +#: pysollib/tk/menubar.py:257 msgid "Games not &played" msgstr "Не&сыгранные игры" -#: pysollib/tk/menubar.py:257 +#: pysollib/tk/menubar.py:258 msgid "Select game by nu&mber..." msgstr "Выбрать игру по &номеру..." -#: pysollib/tk/menubar.py:259 +#: pysollib/tk/menubar.py:260 msgid "Fa&vorite games" msgstr "&Избранные игры" -#: pysollib/tk/menubar.py:260 +#: pysollib/tk/menubar.py:261 msgid "A&dd to favorites" msgstr "&Добавить в избранное" -#: pysollib/tk/menubar.py:261 +#: pysollib/tk/menubar.py:262 msgid "R&emove from favorites" msgstr "&Удалить из избранных" -#: pysollib/tk/menubar.py:263 +#: pysollib/tk/menubar.py:264 msgid "&Open..." msgstr "&Открыть..." -#: pysollib/tk/menubar.py:264 +#: pysollib/tk/menubar.py:265 msgid "&Save" msgstr "&Сохранить" -#: pysollib/tk/menubar.py:265 +#: pysollib/tk/menubar.py:266 msgid "Save &as..." msgstr "Сохранить &как..." -#: pysollib/tk/menubar.py:267 +#: pysollib/tk/menubar.py:268 msgid "&Hold and quit" msgstr "Со&храниться и выйти" -#: pysollib/tk/menubar.py:268 -msgid "&Quit" -msgstr "В&ыход" - -#: pysollib/tk/menubar.py:270 +#: pysollib/tk/menubar.py:271 pysollib/tk/selectgame.py:409 msgid "&Select" msgstr "&Выбрать" -#: pysollib/tk/menubar.py:273 +#: pysollib/tk/menubar.py:274 msgid "&Edit" msgstr "Р&едактировать" -#: pysollib/tk/menubar.py:274 +#: pysollib/tk/menubar.py:275 msgid "&Undo" msgstr "&Отмена" -#: pysollib/tk/menubar.py:275 +#: pysollib/tk/menubar.py:276 msgid "&Redo" msgstr "&Повтор" -#: pysollib/tk/menubar.py:276 +#: pysollib/tk/menubar.py:277 msgid "Redo &all" msgstr "Вернуть все" -#: pysollib/tk/menubar.py:279 +#: pysollib/tk/menubar.py:280 msgid "&Set bookmark" msgstr "Установить &закладку" -#: pysollib/tk/menubar.py:281 pysollib/tk/menubar.py:285 +#: pysollib/tk/menubar.py:282 pysollib/tk/menubar.py:286 msgid "Bookmark %d" msgstr "Закладка %d" -#: pysollib/tk/menubar.py:283 +#: pysollib/tk/menubar.py:284 msgid "Go&to bookmark" msgstr "&Перейти к закладке" -#: pysollib/tk/menubar.py:288 +#: pysollib/tk/menubar.py:289 msgid "&Clear bookmarks" msgstr "О&чистить закладки" -#: pysollib/tk/menubar.py:291 +#: pysollib/tk/menubar.py:292 msgid "Restart &game" msgstr "&Начать с начала" -#: pysollib/tk/menubar.py:293 +#: pysollib/tk/menubar.py:294 msgid "&Game" msgstr "&Игра" -#: pysollib/tk/menubar.py:294 +#: pysollib/tk/menubar.py:295 msgid "&Deal cards" msgstr "&Сдать карты" -#: pysollib/tk/menubar.py:295 pysollib/tk/menubar.py:324 +#: pysollib/tk/menubar.py:296 pysollib/tk/menubar.py:325 msgid "&Auto drop" msgstr "С&бросить карты" -#: pysollib/tk/menubar.py:296 +#: pysollib/tk/menubar.py:297 msgid "&Pause" msgstr "&Пауза" -#: pysollib/tk/menubar.py:299 +#: pysollib/tk/menubar.py:300 msgid "S&tatus..." msgstr "С&татус" -#: pysollib/tk/menubar.py:300 +#: pysollib/tk/menubar.py:301 msgid "&Comments..." msgstr "&Комментарии..." -#: pysollib/tk/menubar.py:302 +#: pysollib/tk/menubar.py:303 msgid "&Statistics" msgstr "Ст&атистика" -#: pysollib/tk/menubar.py:303 pysollib/tk/menubar.py:311 +#: pysollib/tk/menubar.py:304 pysollib/tk/menubar.py:312 msgid "Current game..." msgstr "Текущая игра..." -#: pysollib/tk/menubar.py:304 pysollib/tk/menubar.py:312 -#: pysollib/tk/tkstats.py:289 +#: pysollib/tk/menubar.py:305 pysollib/tk/menubar.py:313 msgid "All games..." msgstr "Все игры..." -#: pysollib/tk/menubar.py:306 pysollib/tk/tkstats.py:647 +#: pysollib/tk/menubar.py:307 msgid "Session log..." msgstr "Лог сессии..." -#: pysollib/tk/menubar.py:307 pysollib/tk/tkstats.py:663 +#: pysollib/tk/menubar.py:308 msgid "Full log..." msgstr "Полный лог..." -#: pysollib/tk/menubar.py:310 +#: pysollib/tk/menubar.py:311 msgid "D&emo statistics" msgstr "Статистика демо" -#: pysollib/tk/menubar.py:314 +#: pysollib/tk/menubar.py:315 msgid "&Assist" msgstr "&Подсказка" -#: pysollib/tk/menubar.py:315 +#: pysollib/tk/menubar.py:316 msgid "&Hint" msgstr "Подсказать &ход" -#: pysollib/tk/menubar.py:316 +#: pysollib/tk/menubar.py:317 msgid "Highlight p&iles" msgstr "П&оказать группы" -#: pysollib/tk/menubar.py:318 +#: pysollib/tk/menubar.py:319 msgid "&Demo" msgstr "&Демо" -#: pysollib/tk/menubar.py:319 +#: pysollib/tk/menubar.py:320 msgid "Demo (&all games)" msgstr "Демо (&все игры)" -#: pysollib/tk/menubar.py:320 +#: pysollib/tk/menubar.py:321 msgid "&Options" msgstr "&Настройка" -#: pysollib/tk/menubar.py:321 +#: pysollib/tk/menubar.py:322 msgid "&Player options..." msgstr "Настройки &игрока..." -#: pysollib/tk/menubar.py:322 +#: pysollib/tk/menubar.py:323 msgid "&Automatic play" msgstr "Настройки &автоматической игры" -#: pysollib/tk/menubar.py:323 +#: pysollib/tk/menubar.py:324 msgid "Auto &face up" msgstr "Автоматически переворачивать" -#: pysollib/tk/menubar.py:325 +#: pysollib/tk/menubar.py:326 msgid "Auto &deal" msgstr "Автоматически &сдавать карты" -#: pysollib/tk/menubar.py:327 +#: pysollib/tk/menubar.py:328 msgid "&Quick play" msgstr "&Быстрая игра" -#: pysollib/tk/menubar.py:328 +#: pysollib/tk/menubar.py:329 msgid "Assist &level" msgstr "&Уровень подсказки" -#: pysollib/tk/menubar.py:329 +#: pysollib/tk/menubar.py:330 msgid "Enable &undo" msgstr "Разрешить &возврат хода" -#: pysollib/tk/menubar.py:330 +#: pysollib/tk/menubar.py:331 msgid "Enable &bookmarks" msgstr "Разрешить &закладки" -#: pysollib/tk/menubar.py:331 +#: pysollib/tk/menubar.py:332 msgid "Enable &hint" msgstr "Разрешить &подсказки" -#: pysollib/tk/menubar.py:332 +#: pysollib/tk/menubar.py:333 msgid "Enable highlight p&iles" msgstr "Разрешить показывать к&учи" -#: pysollib/tk/menubar.py:333 +#: pysollib/tk/menubar.py:334 msgid "Enable highlight &cards" msgstr "Разрешить показывать &карты" -#: pysollib/tk/menubar.py:334 +#: pysollib/tk/menubar.py:335 msgid "Enable highlight same &rank" msgstr "Разрешить показывать карты &одного достоинства" -#: pysollib/tk/menubar.py:335 +#: pysollib/tk/menubar.py:336 msgid "Highlight &no matching" msgstr "Подсветка отсутствия &совпадения:" -#: pysollib/tk/menubar.py:337 +#: pysollib/tk/menubar.py:338 msgid "Show removed tiles (in Mahjongg games)" -msgstr "Показывать удаленные (в Маджонгг)" +msgstr "Показывать удаленные (в Маджонг)" -#: pysollib/tk/menubar.py:338 +#: pysollib/tk/menubar.py:339 msgid "Show hint arrow (in Shisen-Sho games)" -msgstr "Показывать стрелку (в Shisen-Sho)" +msgstr "Показывать стрелку (в Шисен-Сё)" -#: pysollib/tk/menubar.py:340 +#: pysollib/tk/menubar.py:341 msgid "&Sound" msgstr "&Звук" -#: pysollib/tk/menubar.py:350 +#: pysollib/tk/menubar.py:351 msgid "Cards&et..." msgstr "Коло&да..." -#: pysollib/tk/menubar.py:351 +#: pysollib/tk/menubar.py:352 msgid "Table t&ile..." msgstr "&Игровой стол..." -#: pysollib/tk/menubar.py:353 +#: pysollib/tk/menubar.py:354 msgid "Card &background" msgstr "&Рубашка карты" -#: pysollib/tk/menubar.py:354 +#: pysollib/tk/menubar.py:355 msgid "Card &view" msgstr "&Вид карты" -#: pysollib/tk/menubar.py:355 +#: pysollib/tk/menubar.py:356 msgid "Card shado&w" msgstr "Тень карты" -#: pysollib/tk/menubar.py:356 +#: pysollib/tk/menubar.py:357 msgid "Shade &legal moves" msgstr "Подсвечивать &разрешенные ходы" -#: pysollib/tk/menubar.py:357 +#: pysollib/tk/menubar.py:358 msgid "&Negative card bottom" msgstr "&Негативные контуры карты" -#: pysollib/tk/menubar.py:358 +#: pysollib/tk/menubar.py:359 msgid "A&nimations" msgstr "&Анимация" -#: pysollib/tk/menubar.py:359 +#: pysollib/tk/menubar.py:360 msgid "&None" msgstr "&Нет" -#: pysollib/tk/menubar.py:360 +#: pysollib/tk/menubar.py:361 msgid "&Timer based" msgstr "Базирующаяся на &таймере" -#: pysollib/tk/menubar.py:361 +#: pysollib/tk/menubar.py:362 msgid "&Fast" msgstr "&Быстрая" -#: pysollib/tk/menubar.py:362 +#: pysollib/tk/menubar.py:363 msgid "&Slow" msgstr "&Медленная" -#: pysollib/tk/menubar.py:363 +#: pysollib/tk/menubar.py:364 msgid "&Very slow" msgstr "&Очень медленная" -#: pysollib/tk/menubar.py:364 +#: pysollib/tk/menubar.py:365 msgid "Stick&y mouse" msgstr "&Липкая мышь" -#: pysollib/tk/menubar.py:368 +#: pysollib/tk/menubar.py:367 msgid "&Fonts..." msgstr "&Шрифты..." -#: pysollib/tk/menubar.py:369 +#: pysollib/tk/menubar.py:368 msgid "&Colors..." msgstr "&Цвета..." -#: pysollib/tk/menubar.py:370 +#: pysollib/tk/menubar.py:369 msgid "Time&outs..." msgstr "Тайма&уты..." -#: pysollib/tk/menubar.py:372 +#: pysollib/tk/menubar.py:371 msgid "&Toolbar" msgstr "Панель &инструментов" -#: pysollib/tk/menubar.py:374 +#: pysollib/tk/menubar.py:373 msgid "Stat&usbar" msgstr "Панель состояния" -#: pysollib/tk/menubar.py:375 +#: pysollib/tk/menubar.py:374 msgid "Show &statusbar" msgstr "Показывать панель состояния" -#: pysollib/tk/menubar.py:376 +#: pysollib/tk/menubar.py:375 msgid "Show &number of cards" msgstr "Показывать количество карт" -#: pysollib/tk/menubar.py:377 +#: pysollib/tk/menubar.py:376 msgid "Show &help bar" msgstr "Показывать панель помощи" -#: pysollib/tk/menubar.py:378 +#: pysollib/tk/menubar.py:377 msgid "&Demo logo" msgstr "&Демо лого" -#: pysollib/tk/menubar.py:379 +#: pysollib/tk/menubar.py:378 msgid "Startup splash sc&reen" msgstr "Окно &запуска" -#: pysollib/tk/menubar.py:383 +#: pysollib/tk/menubar.py:382 msgid "&Help" msgstr "&Помощь" -#: pysollib/tk/menubar.py:384 +#: pysollib/tk/menubar.py:383 msgid "&Contents" msgstr "&Содержание" -#: pysollib/tk/menubar.py:385 +#: pysollib/tk/menubar.py:384 msgid "&How to play" msgstr "Как &играть" -#: pysollib/tk/menubar.py:386 +#: pysollib/tk/menubar.py:385 msgid "&Rules for this game" msgstr "&Правила текущей игры" -#: pysollib/tk/menubar.py:387 +#: pysollib/tk/menubar.py:386 msgid "&License terms" msgstr "&Лицензия" -#: pysollib/tk/menubar.py:390 +#: pysollib/tk/menubar.py:389 msgid "&About " msgstr "&О программе " -#: pysollib/tk/menubar.py:498 +#: pysollib/tk/menubar.py:497 msgid "All &games..." msgstr "&Все игры..." -#: pysollib/tk/menubar.py:499 +#: pysollib/tk/menubar.py:498 msgid "Playable pre&view..." msgstr "Играемый &предпросмотр..." -#: pysollib/tk/menubar.py:501 +#: pysollib/tk/menubar.py:500 msgid "&Popular games" msgstr "&Популярные игры" -#: pysollib/tk/menubar.py:504 +#: pysollib/tk/menubar.py:503 msgid "&French games" msgstr "&Классические игры" -#: pysollib/tk/menubar.py:507 +#: pysollib/tk/menubar.py:506 msgid "&Mahjongg games" msgstr "Игры маджонг" -#: pysollib/tk/menubar.py:510 +#: pysollib/tk/menubar.py:509 msgid "&Oriental games" msgstr "&Восточные игры" -#: pysollib/tk/menubar.py:514 +#: pysollib/tk/menubar.py:513 msgid "&Special games" msgstr "&Особые игры" -#: pysollib/tk/menubar.py:518 +#: pysollib/tk/menubar.py:517 msgid "All games by name" msgstr "Все игры по имени" -#: pysollib/tk/menubar.py:855 pysollib/tk/menubar.py:857 +#: pysollib/tk/menubar.py:854 pysollib/tk/menubar.py:856 #: pysollib/tk/selectcardset.py:240 -msgid "Load" -msgstr "Загрузить" +msgid "&Load" +msgstr "&Загрузить" -#: pysollib/tk/menubar.py:857 -msgid "Info..." -msgstr "Информация..." +#: pysollib/tk/menubar.py:856 +msgid "&Info..." +msgstr "&Информация..." -#: pysollib/tk/menubar.py:860 +#: pysollib/tk/menubar.py:859 msgid "Select " msgstr "Выбрать " -#: pysollib/tk/menubar.py:920 +#: pysollib/tk/menubar.py:919 msgid "Select table background" msgstr "Выбрать фоновое изображение" -#: pysollib/tk/menubar.py:932 pysollib/tk/selecttile.py:176 +#: pysollib/tk/menubar.py:931 pysollib/tk/selecttile.py:177 msgid "Select table color" msgstr "Выбрать цвет" @@ -2300,7 +2594,7 @@ msgid "by Compatibility" msgstr "По совместимости с другими программами" #: pysollib/tk/selectgame.py:159 -msgid "New games in v" +msgid "New games in v." msgstr "Новые игры в версии " #: pysollib/tk/selectgame.py:162 @@ -2473,11 +2767,11 @@ msgstr "Выиграл:" msgid "Lost:" msgstr "Проиграл:" -#: pysollib/tk/selectgame.py:374 pysollib/tk/tkstats.py:804 +#: pysollib/tk/selectgame.py:374 pysollib/tk/tkstats.py:803 msgid "Playing time:" msgstr "Игровое время:" -#: pysollib/tk/selectgame.py:375 pysollib/tk/tkstats.py:811 +#: pysollib/tk/selectgame.py:375 pysollib/tk/tkstats.py:810 msgid "Moves:" msgstr "Ходов:" @@ -2486,22 +2780,18 @@ msgid "% won:" msgstr "% побед:" #: pysollib/tk/selectgame.py:409 -msgid "Select" -msgstr "Выбрать" +msgid "&Rules" +msgstr "&Правила" -#: pysollib/tk/selectgame.py:409 pysollib/tk/toolbar.py:195 -msgid "Rules" -msgstr "Правила" - -#: pysollib/tk/selectgame.py:490 +#: pysollib/tk/selectgame.py:489 msgid "Playable Preview - " msgstr "Играемый предпросмотр - " -#: pysollib/tk/selectgame.py:538 +#: pysollib/tk/selectgame.py:537 msgid "variable" msgstr "переменное кол-во" -#: pysollib/tk/selectgame.py:539 +#: pysollib/tk/selectgame.py:538 msgid "unlimited" msgstr "неограниченное кол-во" @@ -2530,8 +2820,8 @@ msgid "All Backgrounds" msgstr "Все фоновые изображения" #: pysollib/tk/selecttile.py:158 -msgid "Solid color..." -msgstr "Монотонный цвет..." +msgid "&Solid color..." +msgstr "&Монотонный цвет..." #: pysollib/tk/soundoptionsdialog.py:76 msgid "Sound enabled" @@ -2550,12 +2840,12 @@ msgid "Music volume" msgstr "Уровень музыки" #: pysollib/tk/soundoptionsdialog.py:106 -msgid "Apply" -msgstr "Применить" +msgid "&Apply" +msgstr "&Применить" #: pysollib/tk/soundoptionsdialog.py:106 pysollib/tk/soundoptionsdialog.py:108 -msgid "Mixer..." -msgstr "Миксер..." +msgid "&Mixer..." +msgstr "&Миксер..." #: pysollib/tk/soundoptionsdialog.py:155 msgid "Sound preferences info" @@ -2569,11 +2859,11 @@ msgstr "" "Изменения установок DirectX вступят в силу\n" "при следующем запуске " -#: pysollib/tk/statusbar.py:135 +#: pysollib/tk/statusbar.py:138 msgid "Moves/Total moves" msgstr "Ходов/Всего ходов" -#: pysollib/tk/statusbar.py:137 +#: pysollib/tk/statusbar.py:140 msgid "Games played: won/lost" msgstr "Игр: выиграно/проиграно" @@ -2613,23 +2903,23 @@ msgstr "Текст рядом с пиктограммами" msgid "Text only" msgstr "Только текст" -#: pysollib/tk/tkhtml.py:280 +#: pysollib/tk/tkhtml.py:229 msgid "Index" msgstr "Индекс" -#: pysollib/tk/tkhtml.py:284 +#: pysollib/tk/tkhtml.py:233 msgid "Back" msgstr "Назад" -#: pysollib/tk/tkhtml.py:288 +#: pysollib/tk/tkhtml.py:237 msgid "Forward" msgstr "Вперед" -#: pysollib/tk/tkhtml.py:292 +#: pysollib/tk/tkhtml.py:241 msgid "Close" msgstr "Закрыть" -#: pysollib/tk/tkhtml.py:394 +#: pysollib/tk/tkhtml.py:347 msgid "" " HTML limitation:\n" "The %s protocol is not supported yet.\n" @@ -2645,7 +2935,7 @@ msgstr "" "чтобы открыть URL:\n" "%s\n" -#: pysollib/tk/tkhtml.py:419 pysollib/tk/tkhtml.py:423 +#: pysollib/tk/tkhtml.py:372 pysollib/tk/tkhtml.py:376 msgid "Unable to service request:\n" msgstr "" @@ -2665,46 +2955,56 @@ msgstr "Всего:" msgid "No games" msgstr "Нет игр" +#: pysollib/tk/tkstats.py:289 +msgid "&All games..." +msgstr "&Все игры..." + #: pysollib/tk/tkstats.py:291 -msgid "Reset..." -msgstr "Очистить..." +msgid "&Reset..." +msgstr "О&чистить..." -#: pysollib/tk/tkstats.py:574 pysollib/tk/tkstats.py:647 -#: pysollib/tk/tkstats.py:663 -msgid "Save to file" -msgstr "Сохранить в файл" +#: pysollib/tk/tkstats.py:572 pysollib/tk/tkstats.py:645 +#: pysollib/tk/tkstats.py:661 +msgid "&Save to file" +msgstr "&Сохранить в файл" -#: pysollib/tk/tkstats.py:575 -msgid "Reset all..." -msgstr "Очистить все..." +#: pysollib/tk/tkstats.py:573 +msgid "&Reset all..." +msgstr "О&чистить все..." -#: pysollib/tk/tkstats.py:625 +#: pysollib/tk/tkstats.py:623 msgid "No entries for player " msgstr "Нет записей для игрока " -#: pysollib/tk/tkstats.py:642 -#, fuzzy +#: pysollib/tk/tkstats.py:640 msgid "No log entries for %s\n" -msgstr "Нет записей для " +msgstr "Нет записей для %s\n" -#: pysollib/tk/tkstats.py:658 -#, fuzzy +#: pysollib/tk/tkstats.py:645 +msgid "Session &log..." +msgstr "&Лог сессии..." + +#: pysollib/tk/tkstats.py:656 msgid "No current session log entries for %s\n" -msgstr "В текущем сеансе нет записей для " +msgstr "В текущем сеансе нет записей для %s\n" -#: pysollib/tk/tkstats.py:678 +#: pysollib/tk/tkstats.py:661 +msgid "&Full log..." +msgstr "&Полный лог..." + +#: pysollib/tk/tkstats.py:676 msgid "Highlight piles: " msgstr "Подсветка групп: " -#: pysollib/tk/tkstats.py:679 +#: pysollib/tk/tkstats.py:677 msgid "Highlight cards: " msgstr "Подсветка карт: " -#: pysollib/tk/tkstats.py:680 +#: pysollib/tk/tkstats.py:678 msgid "Highlight same rank: " msgstr "Подсветка карт одного достоинства: " -#: pysollib/tk/tkstats.py:683 +#: pysollib/tk/tkstats.py:681 msgid "" "\n" "Redeals: " @@ -2712,7 +3012,7 @@ msgstr "" "\n" "Раздач: " -#: pysollib/tk/tkstats.py:684 +#: pysollib/tk/tkstats.py:682 msgid "" "\n" "Cards in Talon: " @@ -2720,7 +3020,7 @@ msgstr "" "\n" "Карт в колоде: " -#: pysollib/tk/tkstats.py:686 +#: pysollib/tk/tkstats.py:684 msgid "" "\n" "Cards in Waste: " @@ -2728,7 +3028,7 @@ msgstr "" "\n" "Карт в сбросе: " -#: pysollib/tk/tkstats.py:688 +#: pysollib/tk/tkstats.py:686 msgid "" "\n" "Cards in Foundations: " @@ -2736,87 +3036,86 @@ msgstr "" "\n" "Карт в игре: " -#: pysollib/tk/tkstats.py:691 +#: pysollib/tk/tkstats.py:689 msgid "Game status" msgstr "Статус игры" -#: pysollib/tk/tkstats.py:694 +#: pysollib/tk/tkstats.py:692 msgid "Playing time: " msgstr "Игровое время: " -#: pysollib/tk/tkstats.py:695 +#: pysollib/tk/tkstats.py:693 msgid "Started at: " msgstr "Игра начата: " -#: pysollib/tk/tkstats.py:696 +#: pysollib/tk/tkstats.py:694 msgid "Moves: " msgstr "Ходов: " -#: pysollib/tk/tkstats.py:697 +#: pysollib/tk/tkstats.py:695 msgid "Undo moves: " msgstr "Отменено ходов: " -#: pysollib/tk/tkstats.py:698 +#: pysollib/tk/tkstats.py:696 msgid "Bookmark moves: " msgstr "Ходов по закладкам: " -#: pysollib/tk/tkstats.py:699 +#: pysollib/tk/tkstats.py:697 msgid "Demo moves: " msgstr "Демо ходов: " -#: pysollib/tk/tkstats.py:700 +#: pysollib/tk/tkstats.py:698 msgid "Total player moves: " msgstr "Всего ходов игрока:" -#: pysollib/tk/tkstats.py:701 +#: pysollib/tk/tkstats.py:699 msgid "Total moves in this game: " msgstr "Всего ходов в этой игре: " -#: pysollib/tk/tkstats.py:702 +#: pysollib/tk/tkstats.py:700 msgid "Hints: " msgstr "Подсказок: " -#: pysollib/tk/tkstats.py:706 -msgid "Statistics..." -msgstr "Статистика..." +#: pysollib/tk/tkstats.py:704 +msgid "&Statistics..." +msgstr "&Статистика..." -#: pysollib/tk/tkstats.py:731 +#: pysollib/tk/tkstats.py:730 msgid "N" msgstr "N" -#: pysollib/tk/tkstats.py:737 -msgid "Started at" -msgstr "Игра начата" - -#: pysollib/tk/tkstats.py:740 +#: pysollib/tk/tkstats.py:739 msgid "Result" msgstr "Результат" -#: pysollib/tk/tkstats.py:796 +#: pysollib/tk/tkstats.py:795 msgid "Minimum" msgstr "Минимум" -#: pysollib/tk/tkstats.py:797 +#: pysollib/tk/tkstats.py:796 msgid "Maximum" msgstr "Максимум" -#: pysollib/tk/tkstats.py:798 +#: pysollib/tk/tkstats.py:797 msgid "Average" msgstr "Среднее" -#: pysollib/tk/tkstats.py:818 +#: pysollib/tk/tkstats.py:817 msgid "Total moves:" msgstr "Всего ходов:" -#: pysollib/tk/tkstats.py:849 -#, fuzzy +#: pysollib/tk/tkstats.py:848 msgid "No TOP for this game" -msgstr "Не имеется" +msgstr "TOP для текущей игры отсутствует" #: pysollib/tk/toolbar.py:183 msgid "New" msgstr "Новая" +#: pysollib/tk/toolbar.py:184 +msgid "Restart" +msgstr "Начало" + #: pysollib/tk/toolbar.py:184 msgid "" "Restart the\n" @@ -2881,10 +3180,18 @@ msgstr "Пауза в игре" msgid "View statistics" msgstr "Посмотреть статистику" +#: pysollib/tk/toolbar.py:195 +msgid "Rules" +msgstr "Правила" + #: pysollib/tk/toolbar.py:195 msgid "Rules for this game" msgstr "Правила текущей игры" +#: pysollib/tk/toolbar.py:197 +msgid "Quit" +msgstr "Выйти" + #: pysollib/tk/toolbar.py:209 msgid "Player" msgstr "Игрок" @@ -2893,7 +3200,7 @@ msgstr "Игрок" msgid "Player options" msgstr "Установки игрока" -#: pysollib/tk/toolbar.py:428 +#: pysollib/tk/toolbar.py:429 msgid "Toolbar" msgstr "Панель инструментов" @@ -2925,52 +3232,23 @@ msgstr "красный" msgid "cardset" msgstr "набор карт" -#~ msgid "" -#~ "No Free\n" -#~ "Matching\n" -#~ "Pairs" -#~ msgstr "" -#~ "Нет\n" -#~ "свободных\n" -#~ "пар" +#~ msgid "Set demo options" +#~ msgstr "Настройка демо" -#~ msgid "" -#~ "1 Free\n" -#~ "Matching\n" -#~ "Pair" -#~ msgstr "" -#~ "1\n" -#~ "свободная\n" -#~ "пара" +#~ msgid "Display floating Demo logo" +#~ msgstr "Показывать демо лого" -#~ msgid "" -#~ " Free\n" -#~ "Matching\n" -#~ "Pairs" -#~ msgstr "" -#~ " \n" -#~ "свободных\n" -#~ "пар" +#~ msgid "Show score in statusbar" +#~ msgstr "Показывать счет в строке состояния" -#~ msgid "" -#~ "\n" -#~ "Tiles\n" -#~ "Removed\n" -#~ "\n" -#~ msgstr "" -#~ "\n" -#~ "удалено\n" -#~ "\n" +#~ msgid "Set demo delay in seconds" +#~ msgstr "Установить задуржку демо в секундах" -#~ msgid "" -#~ "\n" -#~ "Tiles\n" -#~ "Remaining\n" -#~ "\n" -#~ msgstr "" -#~ "\n" -#~ "осталось\n" -#~ "\n" +#~ msgid "Select" +#~ msgstr "Выбрать" + +#~ msgid "Started at " +#~ msgstr "Игра начата " #~ msgid "Playable Area" #~ msgstr "Область игры" diff --git a/pysollib/actions.py b/pysollib/actions.py index 426c80fa17..8a1ff42fd7 100644 --- a/pysollib/actions.py +++ b/pysollib/actions.py @@ -55,12 +55,11 @@ # toolkit imports from pysoltk import EVENT_HANDLED, EVENT_PROPAGATE -from pysoltk import MfxDialog, MfxSimpleEntry +from pysoltk import MfxMessageDialog, MfxSimpleEntry from pysoltk import MfxExceptionDialog from pysoltk import BooleanVar, IntVar, StringVar from pysoltk import PlayerOptionsDialog from pysoltk import SoundOptionsDialog -from pysoltk import DemoOptionsDialog #from pysoltk import HintOptionsDialog from pysoltk import TimeoutsDialog from pysoltk import ColorsDialog @@ -378,9 +377,9 @@ def _mNewGameBySeed(self, seed, origin): if not self.app.getGameInfo(id): raise ValueError except (ValueError, TypeError), ex: - d = MfxDialog(self.top, title=_("Invalid game number"), - text=_("Invalid game number\n") + str(seed), - bitmap="error") + d = MfxMessageDialog(self.top, title=_("Invalid game number"), + text=_("Invalid game number\n") + str(seed), + bitmap="error") return f = self.game.nextGameFlags(id, random) if f & 17 == 0: @@ -407,7 +406,7 @@ def mSelectGameById(self, *args): id, f = None, self.game.getGameNumber(format=0) d = MfxSimpleEntry(self.top, _("Select new game number"), _("\n\nEnter new game number"), f, - strings=(_("OK"), _("Next number"), _("Cancel")), + strings=(_("&OK"), _("&Next number"), _("&Cancel")), default=0, e_width=25) if d.status != 0: return if d.button == 2: return @@ -614,8 +613,8 @@ def mEditGameComment(self, *args): text=_("Error while writing to file")) else: if fd: fd.close() - d = MfxDialog(self.top, title=PACKAGE+_(" Info"), bitmap="info", - text=_("Comments were appended to\n\n") + fn) + d = MfxMessageDialog(self.top, title=PACKAGE+_(" Info"), bitmap="info", + text=_("Comments were appended to\n\n") + fn) self.tkopt.comment.set(bool(game.gsaveinfo.comment)) @@ -650,8 +649,8 @@ def _mStatsSave(self, player, header, filename, write_method): text=_("Error while writing to file")) else: if file: file.close() - d = MfxDialog(self.top, title=PACKAGE+_(" Info"), bitmap="info", - text=text + _(" were appended to\n\n") + filename) + d = MfxMessageDialog(self.top, title=PACKAGE+_(" Info"), bitmap="info", + text=text + _(" were appended to\n\n") + filename) def mPlayerStats(self, *args, **kw): @@ -891,20 +890,6 @@ def mOptIrregularPiles(self, *args): if self._cancelDrag(): return self.app.opt.irregular_piles = self.tkopt.irregular_piles.get() - def mOptDemoOptions(self, *args): - if self._cancelDrag(break_pause=False): return - d = DemoOptionsDialog(self.top, _("Set demo options"), self.app) - if d.status == 0 and d.button == 0: - self.app.opt.demo_logo = d.demo_logo - self.app.opt.demo_score = d.demo_score - self.app.opt.demo_sleep = d.demo_sleep - -## def mOptHintOptions(self, *args): -## if self._cancelDrag(break_pause=False): return -## d = HintOptionsDialog(self.top, "Set hint options", self.app) -## if d.status == 0 and d.button == 0: -## self.app.opt.hint_sleep = d.hint_sleep - def mOptColorsOptions(self, *args): if self._cancelDrag(break_pause=False): return d = ColorsDialog(self.top, _("Set colors"), self.app) @@ -953,9 +938,9 @@ def mOptSave(self, *args): text=_("Error while saving options")) else: # tell the player where their config files reside - d = MfxDialog(self.top, title=PACKAGE+_(" Info"), - text=_("Options were saved to\n\n") + self.app.fn.opt, - bitmap="info") + d = MfxMessageDialog(self.top, title=PACKAGE+_(" Info"), bitmap="info", + text=_("Options were saved to\n\n") + self.app.fn.opt) + # # Help menu diff --git a/pysollib/app.py b/pysollib/app.py index f43a4af66c..5ea9c0f6b6 100644 --- a/pysollib/app.py +++ b/pysollib/app.py @@ -60,7 +60,7 @@ # Toolkit imports from pysoltk import tkname, tkversion, wm_withdraw, loadImage from pysoltk import bind, unbind_destroy -from pysoltk import MfxDialog, MfxExceptionDialog +from pysoltk import MfxMessageDialog, MfxExceptionDialog from pysoltk import TclError, MfxRoot, MfxCanvas, MfxScrolledCanvas from pysoltk import PysolMenubar from pysoltk import PysolProgressBar @@ -77,6 +77,7 @@ # // Options # ************************************************************************/ + class Options: def __init__(self): self.version_tuple = VERSION_TUPLE @@ -158,8 +159,8 @@ def __init__(self): self.recent_gameid = [] self.favorite_gameid = [] self.last_gameid = 0 # last game played - self.last_player = None # last player - self.last_save_dir = None # last directory for load/save + #self.last_player = None # last player + #self.last_save_dir = None # last directory for load/save self.game_holded = 0 self.wm_maximized = 0 # @@ -176,7 +177,6 @@ def setDefaults(self, top=None): if top: sw, sh, sd = top.winfo_screenwidth(), top.winfo_screenheight(), top.winfo_screendepth() if sd > 8: - #self.tabletile_name = "Fade_Green.ppm" # basename self.tabletile_name = "Nostalgy.gif" # basename else: self.tabletile_name = None @@ -185,8 +185,6 @@ def setDefaults(self, top=None): c = "Standard" if sw < 800 or sh < 600: c = "2000" -## elif sw >= 1024 and sh >= 768 and sd > 8: -## c = "Dondorf Whist A" self.cardset = { 0: (c, ""), CSI.TYPE_FRENCH: (c, ""), @@ -517,8 +515,9 @@ def __init__(self): self.dn.__dict__[k] = v # file names self.fn = Struct( - opt = os.path.join(self.dn.config, "options.dat"), - stats = os.path.join(self.dn.config, "statistics.dat"), + opt = os.path.join(self.dn.config, "options.dat"), + opt_conf = os.path.join(self.dn.config, "options.conf"), + stats = os.path.join(self.dn.config, "statistics.dat"), holdgame = os.path.join(self.dn.config, "holdgame.dat"), comments = os.path.join(self.dn.config, "comments.dat"), ) @@ -822,13 +821,22 @@ def loadImages2(self): ## self.gimages.stats.append(self.dataloader.findImage(f, dir)) def loadImages3(self): - MfxDialog.img = [] + MfxMessageDialog.img = {} #dir = os.path.join('images', 'dialog', 'default') dir = os.path.join('images', 'dialog', 'bluecurve') for f in ('error', 'info', 'question', 'warning'): fn = self.dataloader.findImage(f, dir) im = loadImage(fn) - MfxDialog.img.append(im) + MfxMessageDialog.img[f] = im +## MfxMessageDialog.button_img = {} +## dir = os.path.join('images', 'buttons', 'bluecurve') +## for n, f in ( +## (_('OK'), 'ok'), +## (_('Cancel'), 'cancel'), +## ): +## fn = self.dataloader.findImage(f, dir) +## im = loadImage(fn) +## MfxMessageDialog.button_img[n] = im SelectDialogTreeData.img = [] dir = os.path.join('images', 'tree') for f in ('folder', 'openfolder', 'node', 'emptynode'): @@ -1071,7 +1079,7 @@ def requestCompatibleCardsetType(self, id): return 1 # t = self.checkCompatibleCardsetType(gi, self.cardset) - d = MfxDialog(self.top, title=_("Incompatible ")+CARDSET, + d = MfxMessageDialog(self.top, title=_("Incompatible ")+CARDSET, bitmap="warning", text=_('''The currently selected %s %s is not compatible with the game @@ -1079,7 +1087,7 @@ def requestCompatibleCardsetType(self, id): Please select a %s type %s. ''') % (CARDSET, self.cardset.name, gi.name, t[0], CARDSET), - strings=(_("OK"),), default=0) + strings=(_("&OK"),), default=0) cs = self.__selectCardsetDialog(t) if cs is None: return -1 @@ -1091,7 +1099,7 @@ def __selectCardsetDialog(self, t): d = SelectCardsetByTypeDialogWithPreview( self.top, title=_("Please select a %s type %s") % (t[0], CARDSET), app=self, manager=self.cardset_manager, key=key, - strings=(None, _("OK"), _("Cancel")), default=1) + strings=(None, _("&OK"), _("&Cancel")), default=1) if d.status != 0 or d.button != 1: return None cs = self.cardset_manager.get(d.key) @@ -1240,7 +1248,7 @@ def getGameTitleName(self, id): def getGameMenuitemName(self, id): gi = self.gdb.get(id) if gi is None: return None - return gi.short_name + return gettext(gi.short_name) def getGameRulesFilename(self, id): gi = self.gdb.get(id) @@ -1248,7 +1256,7 @@ def getGameRulesFilename(self, id): if gi.rules_filename is not None: return gi.rules_filename n = gi.name - n = re.sub(r"[\[\(].*$", "", n) + ##n = re.sub(r"[\[\(].*$", "", n) n = latin1_to_ascii(n) n = re.sub(r"[^\w]", "", n) n = n.lower() + ".html" diff --git a/pysollib/game.py b/pysollib/game.py index fe193ef360..5b4989569f 100644 --- a/pysollib/game.py +++ b/pysollib/game.py @@ -55,7 +55,7 @@ from pysoltk import CURSOR_WATCH, ANCHOR_SW, ANCHOR_SE from pysoltk import tkname, bind, wm_map from pysoltk import after, after_idle, after_cancel -from pysoltk import MfxDialog, MfxExceptionDialog +from pysoltk import MfxMessageDialog, MfxExceptionDialog from pysoltk import MfxCanvasText, MfxCanvasImage from pysoltk import MfxCanvasLine, MfxCanvasRectangle from pysoltk import Card @@ -823,18 +823,18 @@ def areYouSure(self, title=None, text=None, confirm=-1, default=0): if not title: title = PACKAGE if not text: text = _("Discard current game ?") self.playSample("areyousure") - d = MfxDialog(self.top, title=title, text=text, - bitmap="question", - Default=default, strings=(_("OK"), _("Cancel"))) + d = MfxMessageDialog(self.top, title=title, text=text, + bitmap="question", + strings=(_("&OK"), _("&Cancel"))) if d.status != 0 or d.button != 0: return 0 return 1 def notYetImplemented(self): # don't used - d = MfxDialog(self.top, title="Not yet implemented", - text="This function is\nnot yet implemented.", - bitmap="error") + d = MfxMessageDialog(self.top, title="Not yet implemented", + text="This function is\nnot yet implemented.", + bitmap="error") # main animation method def animatedMoveTo(self, from_stack, to_stack, cards, x, y, tkraise=1, frames=-1, shadow=-1): @@ -1193,8 +1193,8 @@ def checkForWin(self): time = self.getTime() self.finished = True self.playSample("winperfect", priority=1000) - d = MfxDialog(self.top, title=_("Game won"), - text=_(''' + d = MfxMessageDialog(self.top, title=_("Game won"), + text=_(''' Congratulations, this was a truly perfect game ! @@ -1202,33 +1202,33 @@ def checkForWin(self): for %d moves. %s ''') % (time, self.moves.index, top_msg), - strings=(_("New game"), None, _("Cancel")), - image=self.app.gimages.logos[5], separatorwidth=2) + strings=(_("&New game"), None, _("&Cancel")), + image=self.app.gimages.logos[5], separatorwidth=2) elif status == 1: top_msg = self.updateStats() time = self.getTime() self.finished = True self.playSample("winwon", priority=1000) - d = MfxDialog(self.top, title=_("Game won"), - text=_(''' + d = MfxMessageDialog(self.top, title=_("Game won"), + text=_(''' Congratulations, you did it ! Your playing time is %s for %d moves. %s ''') % (time, self.moves.index, top_msg), - strings=(_("New game"), None, _("Cancel")), - image=self.app.gimages.logos[4], separatorwidth=2) + strings=(_("&New game"), None, _("&Cancel")), + image=self.app.gimages.logos[4], separatorwidth=2) elif self.gstats.updated < 0: self.playSample("winfinished", priority=1000) - d = MfxDialog(self.top, title=_("Game finished"), bitmap="info", - text=_("\nGame finished\n"), - strings=(_("New game"), None, _("Cancel"))) + d = MfxMessageDialog(self.top, title=_("Game finished"), bitmap="info", + text=_("\nGame finished\n"), + strings=(_("&New game"), None, _("&Cancel"))) else: self.playSample("winlost", priority=1000) - d = MfxDialog(self.top, title=_("Game finished"), bitmap="info", - text=_("\nGame finished, but not without my help...\n"), - strings=(_("New game"), _("Restart"), _("Cancel"))) + d = MfxMessageDialog(self.top, title=_("Game finished"), bitmap="info", + text=_("\nGame finished, but not without my help...\n"), + strings=(_("&New game"), _("&Restart"), _("&Cancel"))) self.updateMenus() if d.status == 0 and d.button == 0: # new game @@ -1631,20 +1631,21 @@ def demoEvent(self): status = 2 elif player_moves == 0: self.playSample("autopilotwon") - s = self.app.miscrandom.choice((_("Great"), _("Cool"), _("Yeah"), _("Wow"))) - d = MfxDialog(self.top, title=PACKAGE+_(" Autopilot"), - text=_("\nGame solved in %d moves.\n") % self.moves.index, - image=self.app.gimages.logos[4], strings=(s,), - separatorwidth=2, timeout=timeout) + s = self.app.miscrandom.choice((_("&Great"), _("&Cool"), _("&Yeah"), _("&Wow"))) # ??? accelerators + d = MfxMessageDialog(self.top, title=PACKAGE+_(" Autopilot"), + text=_("\nGame solved in %d moves.\n") % self.moves.index, + image=self.app.gimages.logos[4], strings=(s,), + separatorwidth=2, timeout=timeout) status = d.status else: - s = self.app.miscrandom.choice((_("OK"), _("OK"))) + ##s = self.app.miscrandom.choice((_("&OK"), _("&OK"))) + s = _("&OK") text = _("\nGame finished\n") if self.app.debug: text = text + "\n%d %d\n" % (self.stats.player_moves, self.stats.demo_moves) - d = MfxDialog(self.top, title=PACKAGE+_(" Autopilot"), - text=text, bitmap=bitmap, strings=(s,), - padx=30, timeout=timeout) + d = MfxMessageDialog(self.top, title=PACKAGE+_(" Autopilot"), + text=text, bitmap=bitmap, strings=(s,), + padx=30, timeout=timeout) status = d.status elif finished: ##self.stopPlayTimer() @@ -1653,11 +1654,11 @@ def demoEvent(self): else: if player_moves == 0: self.playSample("autopilotlost") - s = self.app.miscrandom.choice((_("Oh well"), _("That's life"), _("Hmm"))) - d = MfxDialog(self.top, title=PACKAGE+_(" Autopilot"), - text=_("\nThis won't come out...\n"), - bitmap=bitmap, strings=(s,), - padx=30, timeout=timeout) + s = self.app.miscrandom.choice((_("&Oh well"), _("&That's life"), _("&Hmm"))) # ??? accelerators + d = MfxMessageDialog(self.top, title=PACKAGE+_(" Autopilot"), + text=_("\nThis won't come out...\n"), + bitmap=bitmap, strings=(s,), + padx=30, timeout=timeout) status = d.status if finished: self.updateStats(demo=1) @@ -2125,8 +2126,8 @@ def loadGame(self, filename): except AssertionError, ex: self.updateMenus() self.setCursor(cursor=self.app.top_cursor) - d = MfxDialog(self.top, title=_("Load game error"), bitmap="error", - text=_("""\ + d = MfxMessageDialog(self.top, title=_("Load game error"), bitmap="error", + text=_("""\ Error while loading game. Probably the game file is damaged, @@ -2139,8 +2140,8 @@ def loadGame(self, filename): except: self.updateMenus() self.setCursor(cursor=self.app.top_cursor) - d = MfxDialog(self.top, title=_("Load game error"), bitmap="error", - text=_("""\ + d = MfxMessageDialog(self.top, title=_("Load game error"), bitmap="error", + text=_("""\ Internal error while loading game. Please report this bug.""")) diff --git a/pysollib/gamedb.py b/pysollib/gamedb.py index d889c3ffd7..cc566b9cb8 100644 --- a/pysollib/gamedb.py +++ b/pysollib/gamedb.py @@ -307,7 +307,7 @@ class GI: 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 107, 108,)), ("3.10", (109, 110, 111, 112, 113, 114, 116, 117, 118, 119, - 120,-121,-122, 123, 124, 125, 127)), + 120, 121, 122, 123, 124, 125, 127)), ("3.20", (128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 12345, 12346, 12347, 12348, 12349, 12350, 12351, 12352)), @@ -318,16 +318,35 @@ class GI: ("4.20", (165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178)), ("4.30", (179, 180, 181, 182, 183, 184)), - ("4.41", (185, 186,-187,-188,-189,-190,-191,-192, 193,-194, - 195, 196,-197,-198, 199)), + ("4.41", (185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199)), ("4.60", (200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236)), -## ## + tuple(range(353, 370)), -## ), ("4.70", (237,)), + ('fc-0.5.0', (#121, 122, 187, 188, 189, 190, 191, 192, 194, 197, 198, + 5301, 5302, 9011, 11001, 11002, 11003, 11004, 11005, + 11006, 12353, 12354, 12355, 12356, 12357, 12358, 12359, + 12360, 12361, 12362, 12363, 12364, 12365, 12366, 12367, + 12368, 12369, 12370, 12371, 12372, 12373, 12374, 12375, + 12376, 12377, 12378, 12379, 12380, 12381, 12382, 12383, + 12384, 12385, 13001, 13002, 13003, 13004, 13005, 13006, + 13007, 13008, 13009, 13010, 13011, 13012, 13013, 13014, + 13163, 13164, 13165, 13166, 13167, 14401, 14402, 14403, + 14404, 14405, 14406, 14407, 14408, 14409, 14410, 14411, + 14412, 14413, 15406, 15407, 15408, 15409, 15410, 15411, + 15412, 15413, 15414, 15415, 15416, 15417, 15418, 15419, + 15420, 15421, 15422, 16000, 16001, 16002, 16003, 16004, + 16666, 16667, 16668, 16669, 16670, 16671, 16672, 16673, + 16674, 16675, 16676, 16677, 16678, 16679, 16680, 22216, + 22217, 22218, 22219, 22220, 22221, 22223, 22224, 22225, + 22226, 22227, 22228, 22229, 22230, 22231, 22232,)), + ('fc-0.8.0', tuple(range(263, 323))), + ('fc-0.9.0', tuple(range(323, 421))), + ('fc-0.9.1', tuple(range(421, 441))), + ('fc-0.9.2', tuple(range(441, 466))), ) # deprecated - the correct way is to or a GI.GT_XXX flag @@ -489,11 +508,8 @@ def register(self, gi): for n in gi.altnames: if self.__all_gamenames.has_key(n): raise GameInfoException, "duplicate altgame name " + str(gi.id) + ": " + n - if 0 and gi.si.game_flags & GI.GT_XORIGINAL: - return - if 0 and (206 <= gi.id <= 236): - ##print gi.id - return + ##if 0 and gi.si.game_flags & GI.GT_XORIGINAL: + ## return ##print gi.id, gi.name self.__all_games[gi.id] = gi self.__all_gamenames[gi.name] = gi @@ -510,6 +526,11 @@ def register(self, gi): # update registry k = gi.si.game_type self.registered_game_types[k] = self.registered_game_types.get(k, 0) + 1 +## if not gi.si.game_type == GI.GT_MAHJONGG: +## for v, k in GI.GAMES_BY_PYSOL_VERSION: +## if gi.id in k: break +## else: +## print gi.id # diff --git a/pysollib/games/algerian.py b/pysollib/games/algerian.py index a7e209619d..ce375ceb58 100644 --- a/pysollib/games/algerian.py +++ b/pysollib/games/algerian.py @@ -165,5 +165,5 @@ def startGame(self): registerGame(GameInfo(322, AlgerianPatience, "Algerian Patience", GI.GT_2DECK_TYPE, 2, 0)) registerGame(GameInfo(457, AlgerianPatience3, "Algerian Patience (3 decks)", - GI.GT_3DECK_TYPE, 3, 0)) + GI.GT_3DECK_TYPE | GI.GT_ORIGINAL, 3, 0)) diff --git a/pysollib/games/beleagueredcastle.py b/pysollib/games/beleagueredcastle.py index b8012d3bc4..83e38eaa8b 100644 --- a/pysollib/games/beleagueredcastle.py +++ b/pysollib/games/beleagueredcastle.py @@ -641,7 +641,7 @@ def shallHighlightMatch(self, stack1, card1, stack2, card2): registerGame(GameInfo(300, Stronghold, "Stronghold", GI.GT_BELEAGUERED_CASTLE | GI.GT_OPEN, 1, 0)) registerGame(GameInfo(301, Fastness, "Fastness", - GI.GT_BELEAGUERED_CASTLE | GI.GT_OPEN, 1, 0)) + GI.GT_BELEAGUERED_CASTLE | GI.GT_OPEN | GI.GT_ORIGINAL, 1, 0)) registerGame(GameInfo(306, Zerline, "Zerline", GI.GT_BELEAGUERED_CASTLE, 2, 0)) registerGame(GameInfo(324, Bastion, "Bastion", @@ -653,7 +653,7 @@ def shallHighlightMatch(self, stack1, card1, stack2, card2): registerGame(GameInfo(393, CastleOfIndolence, "Castle of Indolence", GI.GT_BELEAGUERED_CASTLE, 2, 0)) registerGame(GameInfo(395, Zerline3Decks, "Zerline (3 decks)", - GI.GT_BELEAGUERED_CASTLE, 3, 0)) + GI.GT_BELEAGUERED_CASTLE | GI.GT_ORIGINAL, 3, 0)) registerGame(GameInfo(400, Rittenhouse, "Rittenhouse", GI.GT_BELEAGUERED_CASTLE | GI.GT_OPEN, 2, 0)) diff --git a/pysollib/games/bisley.py b/pysollib/games/bisley.py index 559baf5715..279de5a7f6 100644 --- a/pysollib/games/bisley.py +++ b/pysollib/games/bisley.py @@ -190,11 +190,11 @@ def _shuffleHook(self, cards): # /*********************************************************************** -# // Adelaide +# // Realm # // Mancunian # ************************************************************************/ -class Adelaide(Game): +class Realm(Game): Hint_Class = CautiousDefaultHint RowStack_Class = StackWrapper(UD_AC_RowStack, base_rank=NO_RANK) @@ -236,7 +236,7 @@ def shallHighlightMatch(self, stack1, card1, stack2, card2): return card1.color != card2.color and abs(card1.rank-card2.rank) == 1 -class Mancunian(Adelaide): +class Mancunian(Realm): RowStack_Class = StackWrapper(UD_RK_RowStack, base_rank=NO_RANK) def shallHighlightMatch(self, stack1, card1, stack2, card2): @@ -247,11 +247,11 @@ def shallHighlightMatch(self, stack1, card1, stack2, card2): registerGame(GameInfo(290, Bisley, "Bisley", GI.GT_1DECK_TYPE | GI.GT_OPEN, 1, 0)) registerGame(GameInfo(372, DoubleBisley, "Double Bisley", - GI.GT_2DECK_TYPE | GI.GT_OPEN, 2, 0)) + GI.GT_2DECK_TYPE | GI.GT_OPEN | GI.GT_ORIGINAL, 2, 0)) registerGame(GameInfo(373, Gloria, "Gloria", - GI.GT_2DECK_TYPE | GI.GT_OPEN, 2, 0)) -registerGame(GameInfo(374, Adelaide, "Adelaide", - GI.GT_1DECK_TYPE | GI.GT_OPEN, 1, 0)) + GI.GT_2DECK_TYPE | GI.GT_OPEN | GI.GT_ORIGINAL, 2, 0)) +registerGame(GameInfo(374, Realm, "Realm", + GI.GT_1DECK_TYPE | GI.GT_OPEN | GI.GT_ORIGINAL, 1, 0)) registerGame(GameInfo(375, Mancunian, "Mancunian", - GI.GT_1DECK_TYPE | GI.GT_OPEN, 1, 0)) + GI.GT_1DECK_TYPE | GI.GT_OPEN | GI.GT_ORIGINAL, 1, 0)) diff --git a/pysollib/games/braid.py b/pysollib/games/braid.py index ea59bf4b01..76880e722b 100644 --- a/pysollib/games/braid.py +++ b/pysollib/games/braid.py @@ -312,7 +312,7 @@ def createGame(self, rows=8): l, s = Layout(self), self.s # set window - w, h = l.XM+(rows+2)*l.XS, l.YM+3*l.XS+10*l.YOFFSET + w, h = l.XM+(rows+2)*l.XS, max(l.YM+3*l.XS+10*l.YOFFSET, l.YM+2*l.YS+11*l.YOFFSET+20) self.setSize(w, h) # create stacks diff --git a/pysollib/games/curdsandwhey.py b/pysollib/games/curdsandwhey.py index 26235fdb9a..43157a7cb4 100644 --- a/pysollib/games/curdsandwhey.py +++ b/pysollib/games/curdsandwhey.py @@ -313,13 +313,13 @@ def createGame(self, rows=10): registerGame(GameInfo(312, Galloway, "Galloway", GI.GT_1DECK_TYPE, 1, 0)) registerGame(GameInfo(313, Robin, "Robin", - GI.GT_2DECK_TYPE, 2, 0)) + GI.GT_2DECK_TYPE | GI.GT_ORIGINAL, 2, 0)) registerGame(GameInfo(348, Arachnida, "Arachnida", GI.GT_SPIDER, 2, 0)) registerGame(GameInfo(349, MissMuffet, "Miss Muffet", GI.GT_SPIDER | GI.GT_OPEN, 1, 0)) registerGame(GameInfo(352, Nordic, "Nordic", - GI.GT_SPIDER | GI.GT_OPEN, 1, 0)) + GI.GT_SPIDER | GI.GT_OPEN | GI.GT_ORIGINAL, 1, 0)) registerGame(GameInfo(414, GermanPatience, "German Patience", GI.GT_2DECK_TYPE, 2, 0)) registerGame(GameInfo(415, BavarianPatience, "Bavarian Patience", diff --git a/pysollib/games/freecell.py b/pysollib/games/freecell.py index dce7fd75c7..148fbccbf5 100644 --- a/pysollib/games/freecell.py +++ b/pysollib/games/freecell.py @@ -520,7 +520,7 @@ def startGame(self): registerGame(GameInfo(383, Bath, "Bath", GI.GT_FREECELL | GI.GT_OPEN, 1, 0)) registerGame(GameInfo(394, Clink, "Clink", - GI.GT_FREECELL | GI.GT_OPEN, 1, 0)) + GI.GT_FREECELL | GI.GT_OPEN | GI.GT_ORIGINAL, 1, 0)) registerGame(GameInfo(448, Repair, "Repair", GI.GT_FREECELL | GI.GT_OPEN, 2, 0)) registerGame(GameInfo(451, Cell11, "Cell 11", diff --git a/pysollib/games/katzenschwanz.py b/pysollib/games/katzenschwanz.py index b987ab508f..51a215f34e 100644 --- a/pysollib/games/katzenschwanz.py +++ b/pysollib/games/katzenschwanz.py @@ -343,10 +343,10 @@ def startGame(self): registerGame(GameInfo(279, Kings, "Kings", GI.GT_FREECELL | GI.GT_OPEN, 2, 0)) registerGame(GameInfo(286, Retinue, "Retinue", - GI.GT_FREECELL | GI.GT_OPEN, 2, 0)) + GI.GT_FREECELL | GI.GT_OPEN | GI.GT_ORIGINAL, 2, 0)) registerGame(GameInfo(299, SalicLaw, "Salic Law", GI.GT_2DECK_TYPE, 2, 0)) registerGame(GameInfo(442, Deep, "Deep", - GI.GT_FREECELL | GI.GT_OPEN, 2, 0)) + GI.GT_FREECELL | GI.GT_OPEN | GI.GT_ORIGINAL, 2, 0)) diff --git a/pysollib/games/klondike.py b/pysollib/games/klondike.py index 0c00c7182f..feac717ce3 100644 --- a/pysollib/games/klondike.py +++ b/pysollib/games/klondike.py @@ -576,8 +576,9 @@ def createGame(self, max_rounds=1, reserves=7, **layout): self.sg.dropstacks.append(s.talon) x, y = l.XM, self.height - l.YM # ??? - self.texts.info = MfxCanvasText(self.canvas, x, y, anchor="sw", - font=self.app.getFont("canvas_default")) + #self.texts.info = MfxCanvasText(self.canvas, x, y, anchor="sw", + # font=self.app.getFont("canvas_default")) + l.createText(s.talon, 'ss') def startGame(self, flip=0, reverse=1): for i in range(1, len(self.s.rows)): diff --git a/pysollib/games/montana.py b/pysollib/games/montana.py index 4b29dee4ef..8fc3f2c4fd 100644 --- a/pysollib/games/montana.py +++ b/pysollib/games/montana.py @@ -396,9 +396,9 @@ class SpacesAndAces(BlueMoon): registerGame(GameInfo(117, RedMoon, "Red Moon", GI.GT_MONTANA | GI.GT_OPEN, 1, 2)) registerGame(GameInfo(275, Galary, "Galary", - GI.GT_MONTANA | GI.GT_OPEN, 1, 2)) + GI.GT_MONTANA | GI.GT_OPEN | GI.GT_ORIGINAL, 1, 2)) registerGame(GameInfo(276, Moonlight, "Moonlight", - GI.GT_MONTANA | GI.GT_OPEN, 1, 2, + GI.GT_MONTANA | GI.GT_OPEN | GI.GT_ORIGINAL, 1, 2, si={"ncards": 48})) registerGame(GameInfo(380, Jungle, "Jungle", GI.GT_MONTANA | GI.GT_OPEN, 1, 1)) diff --git a/pysollib/games/montecarlo.py b/pysollib/games/montecarlo.py index 708008cb6d..2cb3c029be 100644 --- a/pysollib/games/montecarlo.py +++ b/pysollib/games/montecarlo.py @@ -791,7 +791,7 @@ def isNeighbour(self, stack1, stack2): GI.GT_PAIRING_TYPE, 1, 0, ranks=(0, 6, 7, 8, 9, 10, 11, 12) )) registerGame(GameInfo(329, TheWishOpen, "The Wish (open)", - GI.GT_PAIRING_TYPE | GI.GT_OPEN, 1, 0, + GI.GT_PAIRING_TYPE | GI.GT_OPEN | GI.GT_ORIGINAL, 1, 0, ranks=(0, 6, 7, 8, 9, 10, 11, 12) )) registerGame(GameInfo(368, Vertical, "Vertical", GI.GT_PAIRING_TYPE | GI.GT_OPEN, 1, 0)) diff --git a/pysollib/games/numerica.py b/pysollib/games/numerica.py index 7c321c9aa2..05c9a8b80f 100644 --- a/pysollib/games/numerica.py +++ b/pysollib/games/numerica.py @@ -532,11 +532,11 @@ class Shifting(Numerica): registerGame(GameInfo(357, Gnat, "Gnat", GI.GT_NUMERICA, 1, 0)) registerGame(GameInfo(378, Gloaming, "Gloaming", - GI.GT_NUMERICA | GI.GT_OPEN, 1, 0)) + GI.GT_NUMERICA | GI.GT_OPEN | GI.GT_ORIGINAL, 1, 0)) registerGame(GameInfo(379, Chamberlain, "Chamberlain", - GI.GT_NUMERICA | GI.GT_OPEN, 1, 0)) + GI.GT_NUMERICA | GI.GT_OPEN | GI.GT_ORIGINAL, 1, 0)) registerGame(GameInfo(402, Toad, "Toad", - GI.GT_NUMERICA, 2, 0)) + GI.GT_NUMERICA | GI.GT_ORIGINAL, 2, 0)) registerGame(GameInfo(430, PussInTheCorner, "Puss in the Corner", GI.GT_NUMERICA, 1, 0)) registerGame(GameInfo(435, Shifting, "Shifting", diff --git a/pysollib/games/osmosis.py b/pysollib/games/osmosis.py index 75d74a98df..7c1f907a18 100644 --- a/pysollib/games/osmosis.py +++ b/pysollib/games/osmosis.py @@ -292,11 +292,11 @@ def startGame(self, flip=0): registerGame(GameInfo(60, Peek, "Peek", GI.GT_1DECK_TYPE, 1, -1)) registerGame(GameInfo(298, OpenPeek, "Open Peek", - GI.GT_1DECK_TYPE | GI.GT_OPEN, 1, 0)) + GI.GT_1DECK_TYPE | GI.GT_OPEN | GI.GT_ORIGINAL, 1, 0)) registerGame(GameInfo(370, Genesis, "Genesis", - GI.GT_1DECK_TYPE | GI.GT_OPEN, 1, 0)) + GI.GT_1DECK_TYPE | GI.GT_OPEN | GI.GT_ORIGINAL, 1, 0)) registerGame(GameInfo(371, GenesisPlus, "Genesis +", - GI.GT_1DECK_TYPE | GI.GT_OPEN, 1, 0)) + GI.GT_1DECK_TYPE | GI.GT_OPEN | GI.GT_ORIGINAL, 1, 0)) registerGame(GameInfo(409, Bridesmaids, "Bridesmaids", GI.GT_1DECK_TYPE, 1, -1)) diff --git a/pysollib/games/pileon.py b/pysollib/games/pileon.py index 789d6ec6ba..e1203bc2c2 100644 --- a/pysollib/games/pileon.py +++ b/pysollib/games/pileon.py @@ -131,7 +131,7 @@ class PileOn2Decks(PileOn): GI.GT_1DECK_TYPE | GI.GT_OPEN, 1, 0, altnames=("Fifteen Puzzle",) )) registerGame(GameInfo(289, SmallPileOn, "Small PileOn", - GI.GT_1DECK_TYPE | GI.GT_OPEN, 1, 0, + GI.GT_1DECK_TYPE | GI.GT_OPEN | GI.GT_ORIGINAL, 1, 0, ranks=(0, 5, 6, 7, 8, 9, 10, 11, 12), rules_filename = "pileon.html")) ## registerGame(GameInfo(341, PileOn2Decks, "PileOn (2 decks)", diff --git a/pysollib/games/royalcotillion.py b/pysollib/games/royalcotillion.py index a1ef212228..c10beae1b6 100644 --- a/pysollib/games/royalcotillion.py +++ b/pysollib/games/royalcotillion.py @@ -219,21 +219,49 @@ def startGame(self): # /*********************************************************************** # // Alhambra +# // Granada # ************************************************************************/ -class Alhambra_Waste(WasteStack): - def acceptsCards(self, from_stack, cards): - if not WasteStack.acceptsCards(self, from_stack, cards): - return 0 - # check cards - if not self.cards: - return 0 - c1, c2 = self.cards[-1], cards[0] - return c1.suit == c2.suit and ((c1.rank + 1) % self.cap.mod == c2.rank or (c2.rank + 1) % self.cap.mod == c1.rank) +class Alhambra_RowStack(UD_SS_RowStack): + def getBottomImage(self): + return self.game.app.images.getReserveBottom() + + +class Alhambra_Talon(DealRowTalonStack): + def canDealCards(self): + r_cards = sum([len(r.cards) for r in self.game.s.rows]) + if self.cards: + return True + elif r_cards and self.round != self.max_rounds: + return True + return False + + def dealCards(self, sound=0): + old_state = self.game.enterState(self.game.S_DEAL) + num_cards = 0 + rows = self.game.s.rows + r_cards = sum([len(r.cards) for r in self.game.s.rows]) + if self.cards: + if sound and not self.game.demo: + self.game.playSample("dealwaste") + num_cards = self.dealRowAvail(sound=0, frames=4) + elif r_cards and self.round != self.max_rounds: + if sound: + self.game.playSample("turnwaste", priority=20) + for r in rows: + for i in range(len(r.cards)): + self.game.moveMove(1, r, self, frames=0) + self.game.flipMove(self) + num_cards = self.dealRowAvail(sound=0, frames=4) + self.game.nextRoundMove(self) + self.game.leaveState(old_state) + return num_cards class Alhambra(Game): - def createGame(self): + Hint_Class = CautiousDefaultHint + + def createGame(self, rows=1): # create layout l, s = Layout(self), self.s @@ -243,35 +271,40 @@ def createGame(self): # create stacks x, y, = l.XM, l.YM for i in range(4): - s.foundations.append(SS_FoundationStack(x, y, self, suit=i, max_move=0)) + s.foundations.append(SS_FoundationStack(x, y, self, suit=i, + max_move=0)) x = x + l.XS for i in range(4): - s.foundations.append(SS_FoundationStack(x, y, self, suit=i, max_move=0, - base_rank=KING, dir=-1)) + s.foundations.append(SS_FoundationStack(x, y, self, suit=i, + max_move=0, base_rank=KING, dir=-1)) x = x + l.XS x, y, = l.XM, y + l.YS for i in range(8): - s.reserves.append(BasicRowStack(x, y, self, max_accept=0)) + stack = OpenStack(x, y, self, max_accept=0) + stack.CARD_XOFFSET, stack.CARD_YOFFSET = 0, l.YOFFSET + s.reserves.append(stack) x = x + l.XS - x, y = l.XM + 3*l.XS, y + 2*l.YS - s.talon = WasteTalonStack(x, y, self, max_rounds=3) + x, y = l.XM+(8-1-rows)*l.XS/2, y+l.YS+5*l.YOFFSET + s.talon = Alhambra_Talon(x, y, self, max_rounds=3) l.createText(s.talon, "sw") - x = x + l.XS - s.waste = Alhambra_Waste(x, y, self, mod=13, max_accept=1) - l.createText(s.waste, "se") + x += l.XS + for i in range(rows): + stack = Alhambra_RowStack(x, y, self, mod=13, + max_accept=1, base_rank=ANY_RANK) + stack.CARD_XOFFSET, stack.CARD_YOFFSET = 0, 0 + s.rows.append(stack) + x += l.XS # define stack-groups (non default) - s.rows.append(s.waste) l.defaultStackGroups() - # # game overrides # def _shuffleHook(self, cards): # move one Aces and Kings of first deck to top of the Talon (i.e. first card to be dealt) - return self._shuffleHookMoveToTop(cards, lambda c: (c.deck == 0 and c.rank in (0, 12), (c.rank, c.suit)), 8) + return self._shuffleHookMoveToTop(cards, lambda c: (c.deck == 0 and c.rank in (ACE, KING), (c.rank, c.suit)), 8) def startGame(self): self.s.talon.dealRow(rows=self.s.foundations, frames=0) @@ -282,6 +315,11 @@ def startGame(self): self.s.talon.dealCards() +class Granada(Alhambra): + def createGame(self): + Alhambra.createGame(self, rows=4) + + # /*********************************************************************** # // Carpet # ************************************************************************/ @@ -502,9 +540,11 @@ def fillStack(self, stack): ranks=range(11) # without Queens and Kings )) registerGame(GameInfo(392, NewBritishConstitution, "New British Constitution", - GI.GT_2DECK_TYPE, 2, 0, + GI.GT_2DECK_TYPE | GI.GT_ORIGINAL, 2, 0, ranks=range(11) # without Queens and Kings )) registerGame(GameInfo(443, Twenty, "Twenty", GI.GT_2DECK_TYPE, 2, 0)) +registerGame(GameInfo(465, Granada, "Granada", + GI.GT_2DECK_TYPE, 2, 2)) diff --git a/pysollib/games/spider.py b/pysollib/games/spider.py index 06c3d5ea1e..d3f6a54193 100644 --- a/pysollib/games/spider.py +++ b/pysollib/games/spider.py @@ -1020,9 +1020,9 @@ def createGame(self): "Ground for a Divorce (3 decks)", GI.GT_SPIDER, 3, 0)) registerGame(GameInfo(441, York, "York", - GI.GT_SPIDER | GI.GT_OPEN, 2, 0)) + GI.GT_SPIDER | GI.GT_OPEN | GI.GT_ORIGINAL, 2, 0)) registerGame(GameInfo(444, TripleYork, "Triple York", - GI.GT_SPIDER | GI.GT_OPEN, 3, 0)) + GI.GT_SPIDER | GI.GT_OPEN | GI.GT_ORIGINAL, 3, 0)) registerGame(GameInfo(445, BigSpider1Suit, "Big Spider (1 suit)", GI.GT_SPIDER, 3, 0, suits=(0, 0, 0, 0), @@ -1032,7 +1032,7 @@ def createGame(self): suits=(0, 0, 2, 2), rules_filename = "bigspider.html")) registerGame(GameInfo(449, Spider3x3, "Spider 3x3", - GI.GT_SPIDER, 3, 0, + GI.GT_SPIDER | GI.GT_ORIGINAL, 3, 0, suits=(0, 1, 2), rules_filename = "bigspider.html")) registerGame(GameInfo(454, Spider4Decks, "Spider (4 decks)", diff --git a/pysollib/games/yukon.py b/pysollib/games/yukon.py index ced4d9ef96..ac36557367 100644 --- a/pysollib/games/yukon.py +++ b/pysollib/games/yukon.py @@ -532,7 +532,7 @@ def startGame(self): registerGame(GameInfo(284, TenAcross, "Ten Across", GI.GT_YUKON, 1, 0)) registerGame(GameInfo(285, Panopticon, "Panopticon", - GI.GT_YUKON, 1, 0)) + GI.GT_YUKON | GI.GT_ORIGINAL, 1, 0)) registerGame(GameInfo(339, Moosehide, "Moosehide", GI.GT_YUKON, 1, 0)) registerGame(GameInfo(387, Roslin, "Roslin", @@ -542,4 +542,4 @@ def startGame(self): registerGame(GameInfo(450, RawPrawn, "Raw Prawn", GI.GT_YUKON, 1, 0)) registerGame(GameInfo(456, BimBom, "Bim Bom", - GI.GT_YUKON, 2, 0)) + GI.GT_YUKON | GI.GT_ORIGINAL, 2, 0)) diff --git a/pysollib/help.py b/pysollib/help.py index 20e232c0cd..45ede3ea5b 100644 --- a/pysollib/help.py +++ b/pysollib/help.py @@ -44,7 +44,7 @@ from settings import PACKAGE, PACKAGE_URL from version import VERSION, FC_VERSION from pysoltk import tkname, makeHelpToplevel, wm_map, wm_set_icon -from pysoltk import MfxDialog +from pysoltk import MfxMessageDialog from pysoltk import tkHTMLViewer from gamedb import GAME_DB @@ -52,9 +52,9 @@ # // # ************************************************************************/ -class AboutDialog(MfxDialog): +class AboutDialog(MfxMessageDialog): def createFrames(self, kw): - top_frame, bottom_frame = MfxDialog.createFrames(self, kw) + top_frame, bottom_frame = MfxMessageDialog.createFrames(self, kw) return top_frame, bottom_frame @@ -64,9 +64,9 @@ def helpAbout(app, timeout=0, sound=1): t = _("A Python Solitaire Game Collection\n") if app.miscrandom.random() < 0.8: t = _("A World Domination Project\n") - strings=(_("Nice"), _("Credits...")) + strings=(_("&Nice"), _("&Credits...")) if timeout: - strings=(_("Enjoy"),) + strings=(_("&Enjoy"),) ##version = _("Version %s (%s)\n\n") % (FC_VERSION, VERSION) version = _("Version %s\n\n") % FC_VERSION d = AboutDialog(app.top, title=_("About ") + PACKAGE, timeout=timeout, @@ -99,8 +99,8 @@ def helpCredits(app, timeout=0, sound=1): elif tkname == "gnome": t = "PyGTK, " elif tkname == "kde": t = "pyKDE, " elif tkname == "wx": t = "wxPython, " - d = MfxDialog(app.top, title=_("Credits"), timeout=timeout, - text=PACKAGE+_(''' credits go to: + d = MfxMessageDialog(app.top, title=_("Credits"), timeout=timeout, + text=PACKAGE+_(''' credits go to: Volker Weidner for getting me into Solitaire Guido van Rossum for the initial example program @@ -135,9 +135,9 @@ def helpHTML(app, document, dir_, top=None): document, dir_ = "index.html", "html" help_html_index = app.dataloader.findFile(document, dir_) except EnvError: - d = MfxDialog(app.top, title=PACKAGE + _(" HTML Problem"), - text=_("Cannot find help document\n") + document, - bitmap="warning") + d = MfxMessageDialog(app.top, title=PACKAGE + _(" HTML Problem"), + text=_("Cannot find help document\n") + document, + bitmap="warning") return None ##print doc, help_html_index try: diff --git a/pysollib/hint.py b/pysollib/hint.py index 4bb2cee0e6..4a0144f3e8 100644 --- a/pysollib/hint.py +++ b/pysollib/hint.py @@ -700,14 +700,17 @@ class SpiderType_Hint(DefaultHint): fcs_command = os.path.join(os.path.split(sys.path[0])[0], 'fc-solve.exe') fcs_command = '"%s"' % fcs_command -try: - pin, pout, perr = os.popen3(fcs_command+' --help') - if pout.readline().startswith('fc-solve'): - FreecellSolver = True - del pin, pout, perr -except: - ##traceback.print_exc() - pass +if os.name in ('posix', 'nt'): + try: + pin, pout, perr = os.popen3(fcs_command+' --help') + if pout.readline().startswith('fc-solve'): + FreecellSolver = True + del pin, pout, perr + if os.name == 'posix': + os.wait() + except: + ##traceback.print_exc() + pass class FreeCellSolverWrapper: @@ -855,6 +858,8 @@ def computeHints(self): if hint: self.hints.append(hint) ##print self.hints + if os.name == 'posix': + os.wait() def computeHints_mod(self): diff --git a/pysollib/main.py b/pysollib/main.py index dbf733e3de..1da70ab704 100644 --- a/pysollib/main.py +++ b/pysollib/main.py @@ -53,7 +53,7 @@ # Toolkit imports from pysoltk import tkname, tkversion, wm_withdraw, wm_set_icon, loadImage -from pysoltk import MfxDialog, MfxExceptionDialog +from pysoltk import MfxMessageDialog, MfxExceptionDialog from pysoltk import TclError, MfxRoot from pysoltk import PysolProgressBar @@ -65,15 +65,15 @@ def fatal_no_cardsets(app): app.wm_withdraw() - d = MfxDialog(app.top, title=PACKAGE + _(" installation error"), - text=_('''No %ss were found !!! + d = MfxMessageDialog(app.top, title=PACKAGE + _(" installation error"), + text=_('''No %ss were found !!! Main data directory is: %s Please check your %s installation. ''') % (CARDSET, app.dataloader.dir, PACKAGE), - bitmap="error", strings=(_("Quit"),)) + bitmap="error", strings=(_("&Quit"),)) ##raise Exception, "no "+CARDSET+"s found !" @@ -256,10 +256,7 @@ def pysol_init(app, args): # set global color scheme if not opts["fg"] and not opts["bg"]: if os.name == "posix": # Unix/X11 - top.option_add('*selectBackground', '#00008b', 50) - top.option_add('*selectForeground', 'white', 50) - top.option_add('*Entry.background', 'white', 50) - top.option_add('*Listbox.background', 'white', 50) + pass if os.name == "mac": color, priority = "#d9d9d9", "60" classes = ( @@ -280,6 +277,20 @@ def pysol_init(app, args): top.option_add("*foreground", fg) app.top_palette[0] = fg + # + if os.name == "posix": # Unix/X11 + top.option_add('*Entry.background', 'white', 60) + top.option_add('*Entry.foreground', 'black', 60) + top.option_add('*Listbox.background', 'white', 60) + top.option_add('*Listbox.foreground', 'black', 60) + ##top.option_add('*borderWidth', '1', 50) + ##top.option_add('*Button.borderWidth', '1', 50) + top.option_add('*Scrollbar.elementBorderWidth', '1', 60) + top.option_add('*Scrollbar.borderWidth', '1', 60) + top.option_add('*Menu.borderWidth', '1', 60) + #top.option_add('*Button.HighlightBackground', '#595d59') + #top.option_add('*Button.HighlightThickness', '1') + # font if opts["fn"]: font = opts["fn"] @@ -307,8 +318,8 @@ def pysol_init(app, args): # check games if len(app.gdb.getGamesIdSortedByName()) == 0: app.wm_withdraw() - d = MfxDialog(top, title=PACKAGE + _(" installation error"), - text=_(''' + d = MfxMessageDialog(top, title=PACKAGE + _(" installation error"), + text=_(''' No games were found !!! Main data directory is: @@ -316,7 +327,7 @@ def pysol_init(app, args): Please check your %s installation. ''') % (app.dataloader.dir, PACKAGE), - bitmap="error", strings=(_("Quit"),)) + bitmap="error", strings=(_("&Quit"),)) return 1 # init cardsets @@ -394,14 +405,20 @@ def pysol_init(app, args): if not opts["nosound"]: if warn_thread: top.update() - d = MfxDialog(top, title=PACKAGE + _(" installation problem"), - text=_("Your Python installation is compiled without thread support.\n\nSounds and background music will be disabled."), - bitmap="warning", strings=(_("OK"),)) + d = MfxMessageDialog(top, title=PACKAGE + _(" installation problem"), + text=_('''\ +Your Python installation is compiled without thread support. + +Sounds and background music will be disabled.'''), + bitmap="warning", strings=(_("&OK"),)) elif warn_pysolsoundserver: top.update() - d = MfxDialog(top, title=PACKAGE + _(" installation problem"), - text=_("The pysolsoundserver module was not found.\n\nSounds and background music will be disabled."), - bitmap="warning", strings=(_("OK"),)) + d = MfxMessageDialog(top, title=PACKAGE + _(" installation problem"), + text=_('''\ +The pysolsoundserver module was not found. + +Sounds and background music will be disabled.'''), + bitmap="warning", strings=(_("&OK"),)) # create the progress bar title = _("Welcome to ") + PACKAGE @@ -486,9 +503,9 @@ def pysol_main(args): ## raise ## t = str(ex.__class__) ## if str(ex): t = t + ":\n" + str(ex) -## d = MfxDialog(app.top, title=PACKAGE + " internal error", +## d = MfxMessageDialog(app.top, title=PACKAGE + " internal error", ## text="Internal errror. Please report this bug:\n\n"+t, -## strings=("Quit",), bitmap="error") +## strings=("&Quit",), bitmap="error") try: pysol_exit(app) except: diff --git a/pysollib/pysoltk.py b/pysollib/pysoltk.py index 64c4f7b8af..28b3812144 100644 --- a/pysollib/pysoltk.py +++ b/pysollib/pysoltk.py @@ -29,7 +29,6 @@ from tk.tkstats import * from tk.playeroptionsdialog import * from tk.soundoptionsdialog import * -from tk.demooptionsdialog import * from tk.timeoutsdialog import * from tk.colorsdialog import * from tk.fontsdialog import * diff --git a/pysollib/resource.py b/pysollib/resource.py index 527e48ffeb..d9932001c9 100644 --- a/pysollib/resource.py +++ b/pysollib/resource.py @@ -239,75 +239,87 @@ class CSI: TYPE_TRUMP_ONLY = 9 TYPE = { - 1: "French type (52 cards)", - 2: "Hanafuda type (48 cards)", - 3: "Tarock type (78 cards)", - 4: "Mahjongg type (42 tiles)", - 5: "Hex A Deck type (68 cards)", - 6: "Mughal Ganjifa type (96 cards)", - 7: "Navagraha Ganjifa type (108 cards)", - 8: "Dashavatara Ganjifa type (120 cards)", - 9: "Trumps only type (variable cards)", + 1: _("French type (52 cards)"), + 2: _("Hanafuda type (48 cards)"), + 3: _("Tarock type (78 cards)"), + 4: _("Mahjongg type (42 tiles)"), + 5: _("Hex A Deck type (68 cards)"), + 6: _("Mughal Ganjifa type (96 cards)"), + 7: _("Navagraha Ganjifa type (108 cards)"), + 8: _("Dashavatara Ganjifa type (120 cards)"), + 9: _("Trumps only type (variable cards)"), + } + + TYPE_NAME = { + 1: _("French"), + 2: _("Hanafuda"), + 3: _("Tarock"), + 4: _("Mahjongg"), + 5: _("Hex A Deck"), + 6: _("Mughal Ganjifa"), + 7: _("Navagraha Ganjifa"), + 8: _("Dashavatara Ganjifa"), + 9: _("Trumps only"), } # cardset styles STYLE = { - 1: "Adult", # - 2: "Animals", # - 3: "Anime", # - 4: "Art", # - 5: "Cartoons", # - 6: "Children", # - 7: "Classic look", # - 8: "Collectors", # scanned collectors cardsets - 9: "Computers", # - 10: "Engines", # - 11: "Fantasy", # - 30: "Ganjifa", # - 12: "Hanafuda", # - 29: "Hex A Deck", # - 13: "Holiday", # - 28: "Mahjongg", # - 14: "Movies", # - 31: "Matrix", # - 15: "Music", # - 16: "Nature", # - 17: "Operating Systems", # e.g. cards with Linux logos - 19: "People", # famous people - 20: "Places", # - 21: "Plain", # - 22: "Products", # - 18: "Round cardsets", # - 23: "Science Fiction", # - 24: "Sports", # - 27: "Tarock", # - 25: "Vehicels", # - 26: "Video Games", # + 1: _("Adult"), # + 2: _("Animals"), # + 3: _("Anime"), # + 4: _("Art"), # + 5: _("Cartoons"), # + 6: _("Children"), # + 7: _("Classic look"), # + 8: _("Collectors"), # scanned collectors cardsets + 9: _("Computers"), # + 10: _("Engines"), # + 11: _("Fantasy"), # + 30: _("Ganjifa"), # + 12: _("Hanafuda"), # + 29: _("Hex A Deck"), # + 13: _("Holiday"), # + 28: _("Mahjongg"), # + 14: _("Movies"), # + 31: _("Matrix"), # + 15: _("Music"), # + 16: _("Nature"), # + 17: _("Operating Systems"), # e.g. cards with Linux logos + 19: _("People"), # famous people + 20: _("Places"), # + 21: _("Plain"), # + 22: _("Products"), # + 18: _("Round cardsets"), # + 23: _("Science Fiction"), # + 24: _("Sports"), # + 27: _("Tarock"), # + 25: _("Vehicels"), # + 26: _("Video Games"), # } # cardset nationality (suit and rank symbols) NATIONALITY = { - 1021: "Australia", # - 1001: "Austria", # - 1019: "Belgium", # - 1010: "Canada", # - 1011: "China", # - 1012: "Czech Republic", # - 1013: "Denmark", # - 1003: "England", # - 1004: "France", # - 1006: "Germany", # - 1014: "Great Britain", # - 1015: "Hungary", # - 1020: "India", # - 1005: "Italy", # - 1016: "Japan", # - 1002: "Netherlands", # - 1007: "Russia", # - 1008: "Spain", # - 1017: "Sweden", # - 1009: "Switzerland", # - 1018: "USA", # + 1021: _("Australia"), # + 1001: _("Austria"), # + 1019: _("Belgium"), # + 1010: _("Canada"), # + 1011: _("China"), # + 1012: _("Czech Republic"), # + 1013: _("Denmark"), # + 1003: _("England"), # + 1004: _("France"), # + 1006: _("Germany"), # + 1014: _("Great Britain"), # + 1015: _("Hungary"), # + 1020: _("India"), # + 1005: _("Italy"), # + 1016: _("Japan"), # + 1002: _("Netherlands"), # + 1007: _("Russia"), # + 1008: _("Spain"), # + 1017: _("Sweden"), # + 1009: _("Switzerland"), # + 1018: _("USA"), # } # cardset creation date @@ -327,19 +339,17 @@ class CSI: 22: "2200 - 2299", } - # - TYPE_NAME = {} - -def create_csi_type_name(): - for id, type in CSI.TYPE.items(): - i = type.find('type') - if i > 0: - CSI.TYPE_NAME[id] = type[:i-1] - else: - CSI.TYPE_NAME[id] = type - -if not CSI.TYPE_NAME: - create_csi_type_name() +## # +## TYPE_NAME = {} +## def create_csi_type_name(): +## for id, type in CSI.TYPE.items(): +## i = type.find('type') +## if i > 0: +## CSI.TYPE_NAME[id] = type[:i-1] +## else: +## CSI.TYPE_NAME[id] = type +## if not CSI.TYPE_NAME: +## create_csi_type_name() class CardsetConfig(Struct): diff --git a/pysollib/stack.py b/pysollib/stack.py index 2168e16b2b..620f933757 100644 --- a/pysollib/stack.py +++ b/pysollib/stack.py @@ -327,6 +327,8 @@ def initBindings(self): def prepareView(self): ##assertView(self) + if (self.CARD_XOFFSET == 0 and self.CARD_YOFFSET == 0): + assert self.cap.max_move <= 1 # prepare some variables ox, oy = self.CARD_XOFFSET, self.CARD_YOFFSET if type(ox) is types.IntType: diff --git a/pysollib/stats.py b/pysollib/stats.py index d3039bfa75..feb166bb87 100644 --- a/pysollib/stats.py +++ b/pysollib/stats.py @@ -43,8 +43,6 @@ from util import PACKAGE, VERSION from gamedb import GI -# Toolkit imports -from pysoltk import MfxDialog # // FIXME - this a quick hack and needs a rewrite @@ -128,7 +126,7 @@ def writeStats(self, writer, player, header, sort_by='name'): twon, tlost, tgames, ttime, tmoves = 0, 0, 0, 0, 0 g = sort_func() for id in g: - name = app.getGameMenuitemName(id) + name = app.getGameTitleName(id) #won, lost = app.stats.getStats(player, id) won, lost, time, moves = app.stats.getFullStats(player, id) twon, tlost = twon + won, tlost + lost @@ -161,7 +159,7 @@ def _writeLog(self, writer, player, header, prev_games): if not player or not prev_games: return 0 self.writeHeader(writer, header, 71) - writer.plog(_("Game"), _("Game number"), _("Started at "), _("Status")) + writer.plog(_("Game"), _("Game number"), _("Started at"), _("Status")) writer.nl() twon, tlost = 0, 0 for pg in prev_games: diff --git a/pysollib/tk/colorsdialog.py b/pysollib/tk/colorsdialog.py index f0d050622c..a9fe39a3f7 100644 --- a/pysollib/tk/colorsdialog.py +++ b/pysollib/tk/colorsdialog.py @@ -31,7 +31,7 @@ # Toolkit imports from tkconst import EVENT_HANDLED, EVENT_PROPAGATE -from tkwidget import _ToplevelDialog, MfxDialog +from tkwidget import MfxDialog # /*********************************************************************** # // @@ -40,7 +40,7 @@ class ColorsDialog(MfxDialog): def __init__(self, parent, title, app, **kw): kw = self.initKw(kw) - _ToplevelDialog.__init__(self, parent, title, kw.resizable, kw.default) + MfxDialog.__init__(self, parent, title, kw.resizable, kw.default) top_frame, bottom_frame = self.createFrames(kw) self.createBitmaps(top_frame, kw) @@ -128,8 +128,8 @@ def selectColor(self, label): def initKw(self, kw): kw = KwStruct(kw, - strings=(_("OK"), _("Cancel")), default=0, - separatorwidth = 0, + strings=(_("&OK"), _("&Cancel")), + default=0, ) return MfxDialog.initKw(self, kw) diff --git a/pysollib/tk/demooptionsdialog.py b/pysollib/tk/demooptionsdialog.py deleted file mode 100644 index ba62f499a3..0000000000 --- a/pysollib/tk/demooptionsdialog.py +++ /dev/null @@ -1,112 +0,0 @@ -## vim:ts=4:et:nowrap -## -##---------------------------------------------------------------------------## -## -## PySol -- a Python Solitaire game -## -## Copyright (C) 2003 Markus Franz Xaver Johannes Oberhumer -## Copyright (C) 2002 Markus Franz Xaver Johannes Oberhumer -## Copyright (C) 2001 Markus Franz Xaver Johannes Oberhumer -## Copyright (C) 2000 Markus Franz Xaver Johannes Oberhumer -## Copyright (C) 1999 Markus Franz Xaver Johannes Oberhumer -## Copyright (C) 1998 Markus Franz Xaver Johannes Oberhumer -## All Rights Reserved. -## -## This program is free software; you can redistribute it and/or modify -## it under the terms of the GNU General Public License as published by -## the Free Software Foundation; either version 2 of the License, or -## (at your option) any later version. -## -## This program is distributed in the hope that it will be useful, -## but WITHOUT ANY WARRANTY; without even the implied warranty of -## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -## GNU General Public License for more details. -## -## You should have received a copy of the GNU General Public License -## along with this program; see the file COPYING. -## If not, write to the Free Software Foundation, Inc., -## 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -## -## Markus F.X.J. Oberhumer -## -## http://www.oberhumer.com/pysol -## -##---------------------------------------------------------------------------## - -__all__ = ['DemoOptionsDialog'] - -# imports -import os, sys, Tkinter - -# PySol imports -from pysollib.mfxutil import destruct, kwdefault, KwStruct, Struct - -# Toolkit imports -from tkconst import EVENT_HANDLED, EVENT_PROPAGATE -from tkwidget import _ToplevelDialog, MfxDialog - -# /*********************************************************************** -# // -# ************************************************************************/ - -class DemoOptionsDialog(MfxDialog): - def __init__(self, parent, title, app, **kw): - kw = self.initKw(kw) - _ToplevelDialog.__init__(self, parent, title, kw.resizable, kw.default) - top_frame, bottom_frame = self.createFrames(kw) - self.createBitmaps(top_frame, kw) - # - self.demo_logo_var = Tkinter.BooleanVar() - self.demo_logo_var.set(app.opt.demo_logo != 0) - self.demo_score_var = Tkinter.BooleanVar() - self.demo_score_var.set(app.opt.demo_score != 0) - self.demo_sleep_var = Tkinter.DoubleVar() - self.demo_sleep_var.set(app.opt.demo_sleep) - widget = Tkinter.Checkbutton(top_frame, variable=self.demo_logo_var, - text=_("Display floating Demo logo")) - widget.pack(side=Tkinter.TOP, padx=kw.padx, pady=kw.pady) - widget = Tkinter.Checkbutton(top_frame, variable=self.demo_score_var, - text=_("Show score in statusbar")) - widget.pack(side=Tkinter.TOP, padx=kw.padx, pady=kw.pady) - widget = Tkinter.Scale(top_frame, from_=0.2, to=9.9, - resolution=0.1, orient=Tkinter.HORIZONTAL, - length="3i", label=_("Set demo delay in seconds"), - variable=self.demo_sleep_var, takefocus=0) - widget.pack(side=Tkinter.TOP, padx=kw.padx, pady=kw.pady) - # - focus = self.createButtons(bottom_frame, kw) - self.mainloop(focus, kw.timeout) - # - self.demo_logo = self.demo_logo_var.get() - self.demo_score = self.demo_score_var.get() - self.demo_sleep = self.demo_sleep_var.get() - - - def initKw(self, kw): - kw = KwStruct(kw, - strings=(_("OK"), _("Cancel")), default=0, - separatorwidth = 0, - ) - return MfxDialog.initKw(self, kw) - - -# /*********************************************************************** -# // -# ************************************************************************/ - - -def demooptionsdialog_main(args): - from tkutil import wm_withdraw - opt = Struct(demo_logo=1, demo_sleep=1.5) - app = Struct(opt=opt) - tk = Tkinter.Tk() - wm_withdraw(tk) - tk.update() - d = DemoOptionsDialog(tk, "Demo options", app) - print d.status, d.button, ":", d.demo_logo, d.demo_sleep - return 0 - -if __name__ == "__main__": - import sys - sys.exit(demooptionsdialog_main(sys.argv)) - diff --git a/pysollib/tk/edittextdialog.py b/pysollib/tk/edittextdialog.py index c5d0cf2208..f18969b3ed 100644 --- a/pysollib/tk/edittextdialog.py +++ b/pysollib/tk/edittextdialog.py @@ -42,7 +42,7 @@ from pysollib.mfxutil import destruct, kwdefault, KwStruct, Struct # Toolkit imports -from tkwidget import _ToplevelDialog, MfxDialog +from tkwidget import MfxDialog # /*********************************************************************** # // @@ -52,7 +52,7 @@ class EditTextDialog(MfxDialog): def __init__(self, parent, title, text, **kw): kw = self.initKw(kw) - _ToplevelDialog.__init__(self, parent, title, kw.resizable, kw.default) + MfxDialog.__init__(self, parent, title, kw.resizable, kw.default) top_frame, bottom_frame = self.createFrames(kw) self.createBitmaps(top_frame, kw) # @@ -79,9 +79,10 @@ def __init__(self, parent, title, text, **kw): def initKw(self, kw): kw = KwStruct(kw, - strings=(_("OK"), _("Cancel")), default=-1, - resizable = 1, - separatorwidth = 0, + strings=(_("&OK"), _("&Cancel")), + default=-1, + resizable=1, + separatorwidth=0, ) return MfxDialog.initKw(self, kw) diff --git a/pysollib/tk/fontsdialog.py b/pysollib/tk/fontsdialog.py index a5a10203e7..6ea9da64ff 100644 --- a/pysollib/tk/fontsdialog.py +++ b/pysollib/tk/fontsdialog.py @@ -32,7 +32,7 @@ # Toolkit imports from tkconst import EVENT_HANDLED, EVENT_PROPAGATE -from tkwidget import _ToplevelDialog, MfxDialog +from tkwidget import MfxDialog from tkutil import bind # /*********************************************************************** @@ -43,7 +43,7 @@ class FontChooserDialog(MfxDialog): def __init__(self, parent, title, init_font, **kw): ##print init_font kw = self.initKw(kw) - _ToplevelDialog.__init__(self, parent, title, kw.resizable, kw.default) + MfxDialog.__init__(self, parent, title, kw.resizable, kw.default) top_frame, bottom_frame = self.createFrames(kw) self.createBitmaps(top_frame, kw) @@ -83,7 +83,7 @@ def __init__(self, parent, title, init_font, **kw): self.entry = Entry(frame, bg='white') self.entry.grid(row=0, column=0, columnspan=2, sticky=W+E+N+S) self.entry.insert(END, _('abcdefghABCDEFGH')) - self.list_box = Listbox(frame, width=36) + self.list_box = Listbox(frame, width=36, exportselection=False) sb = Scrollbar(frame) self.list_box.configure(yscrollcommand=sb.set) sb.configure(command=self.list_box.yview) @@ -137,8 +137,8 @@ def fontupdate(self, *args): def initKw(self, kw): kw = KwStruct(kw, - strings=(_("OK"), _("Cancel")), default=0, - separatorwidth=0, + strings=(_("&OK"), _("&Cancel")), + default=0, padx=10, pady=10, buttonpadx=10, buttonpady=5, ) @@ -151,7 +151,7 @@ def initKw(self, kw): class FontsDialog(MfxDialog): def __init__(self, parent, title, app, **kw): kw = self.initKw(kw) - _ToplevelDialog.__init__(self, parent, title, kw.resizable, kw.default) + MfxDialog.__init__(self, parent, title, kw.resizable, kw.default) top_frame, bottom_frame = self.createFrames(kw) self.createBitmaps(top_frame, kw) @@ -201,8 +201,8 @@ def selectFont(self, label, fn): def initKw(self, kw): kw = KwStruct(kw, - strings=(_("OK"), _("Cancel")), default=0, - separatorwidth = 0, + strings=(_("&OK"), _("&Cancel")), + default=0, ) return MfxDialog.initKw(self, kw) diff --git a/pysollib/tk/gameinfodialog.py b/pysollib/tk/gameinfodialog.py index 46c5071d21..cb6ee333e9 100644 --- a/pysollib/tk/gameinfodialog.py +++ b/pysollib/tk/gameinfodialog.py @@ -31,7 +31,7 @@ from pysollib.gamedb import GI # Toolkit imports -from tkwidget import _ToplevelDialog, MfxDialog +from tkwidget import MfxDialog # /*********************************************************************** # // @@ -40,7 +40,7 @@ class GameInfoDialog(MfxDialog): def __init__(self, parent, title, app, **kw): kw = self.initKw(kw) - _ToplevelDialog.__init__(self, parent, title, kw.resizable, kw.default) + MfxDialog.__init__(self, parent, title, kw.resizable, kw.default) top_frame, bottom_frame = self.createFrames(kw) self.createBitmaps(top_frame, kw) @@ -130,7 +130,8 @@ def showStacks(self, frame, row, title, stacks): def initKw(self, kw): kw = KwStruct(kw, - strings=(_("OK"),), default=0, - separatorwidth = 2, + strings=(_("&OK"),), + default=0, + separatorwidth=2, ) return MfxDialog.initKw(self, kw) diff --git a/pysollib/tk/menubar.py b/pysollib/tk/menubar.py index 1fdced3e6e..4a61cc7971 100644 --- a/pysollib/tk/menubar.py +++ b/pysollib/tk/menubar.py @@ -364,8 +364,6 @@ def _createMenubar(self): submenu.add_radiobutton(label=n_("&Very slow"), variable=self.tkopt.animations, value=4, command=self.mOptAnimations) menu.add_checkbutton(label=n_("Stick&y mouse"), variable=self.tkopt.sticky_mouse, command=self.mOptStickyMouse) menu.add_separator() - #menu.add_command(label="&Hint options...", command=self.mOptHintOptions) - #menu.add_command(label="&Demo options...", command=self.mOptDemoOptions) menu.add_command(label=n_("&Fonts..."), command=self.mOptFontsOptions) menu.add_command(label=n_("&Colors..."), command=self.mOptColorsOptions) menu.add_command(label=n_("Time&outs..."), command=self.mOptTimeoutsOptions) @@ -852,10 +850,10 @@ def mSaveAs(self, *event): def mSelectCardsetDialog(self, *event): if self._cancelDrag(break_pause=False): return - ##strings, default = ("OK", "Load", "Cancel"), 0 - strings, default = (None, _("Load"), _("Cancel"),), 1 + ##strings, default = ("&OK", "&Load", "&Cancel"), 0 + strings, default = (None, _("&Load"), _("&Cancel"),), 1 ##if os.name == "posix": - strings, default = (None, _("Load"), _("Cancel"), _("Info..."),), 1 + strings, default = (None, _("&Load"), _("&Cancel"), _("&Info..."),), 1 t = CARDSET key = self.app.nextgame.cardset.index d = SelectCardsetDialogWithPreview(self.top, title=_("Select ")+t, diff --git a/pysollib/tk/playeroptionsdialog.py b/pysollib/tk/playeroptionsdialog.py index 3cd0892e1a..6881c96190 100644 --- a/pysollib/tk/playeroptionsdialog.py +++ b/pysollib/tk/playeroptionsdialog.py @@ -43,7 +43,7 @@ # Toolkit imports from tkconst import EVENT_HANDLED, EVENT_PROPAGATE -from tkwidget import _ToplevelDialog, MfxDialog +from tkwidget import MfxDialog from tkutil import bind @@ -54,8 +54,7 @@ class SelectUserNameDialog(MfxDialog): def __init__(self, parent, title, usernames=[], **kw): kw = self.initKw(kw) - _ToplevelDialog.__init__(self, parent, title, - kw.resizable, kw.default) + MfxDialog.__init__(self, parent, title, kw.resizable, kw.default) top_frame, bottom_frame = self.createFrames(kw) self.createBitmaps(top_frame, kw) # @@ -83,7 +82,7 @@ def updateUserName(self, *args): def initKw(self, kw): kw = KwStruct(kw, - strings=(_("OK"), _("Cancel")), default=0, + strings=(_("&OK"), _("&Cancel")), default=0, separatorwidth=0, resizable=0, padx=10, pady=10, @@ -96,7 +95,7 @@ def initKw(self, kw): class PlayerOptionsDialog(MfxDialog): def __init__(self, parent, title, app, **kw): kw = self.initKw(kw) - _ToplevelDialog.__init__(self, parent, title, kw.resizable, kw.default) + MfxDialog.__init__(self, parent, title, kw.resizable, kw.default) top_frame, bottom_frame = self.createFrames(kw) self.createBitmaps(top_frame, kw) self.app = app @@ -158,9 +157,7 @@ def mDone(self, button): def initKw(self, kw): kw = KwStruct(kw, - strings=(_("OK"), _("Cancel")), default=0, - separatorwidth=2, - resizable=0, + strings=(_("&OK"), _("&Cancel")), default=0, padx=10, pady=10, ) return MfxDialog.initKw(self, kw) diff --git a/pysollib/tk/selectcardset.py b/pysollib/tk/selectcardset.py index 7c9b4d0a80..8612ea36d5 100644 --- a/pysollib/tk/selectcardset.py +++ b/pysollib/tk/selectcardset.py @@ -45,7 +45,7 @@ # Toolkit imports from tkutil import loadImage -from tkwidget import _ToplevelDialog, MfxDialog, MfxScrolledCanvas +from tkwidget import MfxDialog, MfxScrolledCanvas from tkcanvas import MfxCanvasImage from selecttree import SelectDialogTreeLeaf, SelectDialogTreeNode from selecttree import SelectDialogTreeData, SelectDialogTreeCanvas @@ -181,7 +181,7 @@ class SelectCardsetDialogWithPreview(MfxDialog): def __init__(self, parent, title, app, manager, key=None, **kw): kw = self.initKw(kw) - _ToplevelDialog.__init__(self, parent, title, kw.resizable, kw.default) + MfxDialog.__init__(self, parent, title, kw.resizable, kw.default) top_frame, bottom_frame = self.createFrames(kw) self.createBitmaps(top_frame, kw) # @@ -237,9 +237,9 @@ def destroy(self): def initKw(self, kw): kw = KwStruct(kw, - strings=(_("OK"), _("Load"), _("Cancel"),), default=0, - separatorwidth=2, resizable=1, - font=None, + strings=(_("&OK"), _("&Load"), _("&Cancel"),), + default=0, + resizable=1, padx=10, pady=10, buttonpadx=10, buttonpady=5, ) @@ -308,7 +308,7 @@ class SelectCardsetByTypeDialogWithPreview(SelectCardsetDialogWithPreview): class CardsetInfoDialog(MfxDialog): def __init__(self, parent, title, cardset, images, **kw): kw = self.initKw(kw) - _ToplevelDialog.__init__(self, parent, title, kw.resizable, kw.default) + MfxDialog.__init__(self, parent, title, kw.resizable, kw.default) top_frame, bottom_frame = self.createFrames(kw) self.createBitmaps(top_frame, kw) frame = Tkinter.Frame(top_frame) @@ -393,9 +393,10 @@ def __init__(self, parent, title, cardset, images, **kw): def initKw(self, kw): kw = KwStruct(kw, - strings=(_("OK"),), default=0, - resizable = 1, - separatorwidth = 2, + strings=(_("&OK"),), + default=0, + resizable=1, + separatorwidth=2, padx=10, pady=10, buttonpadx=10, buttonpady=5, ) diff --git a/pysollib/tk/selectgame.py b/pysollib/tk/selectgame.py index f254e2b6d3..d55752604f 100644 --- a/pysollib/tk/selectgame.py +++ b/pysollib/tk/selectgame.py @@ -47,7 +47,7 @@ # Toolkit imports from tkutil import unbind_destroy -from tkwidget import _ToplevelDialog, MfxDialog, MfxScrolledCanvas +from tkwidget import MfxDialog, MfxScrolledCanvas from tkcanvas import MfxCanvasText from selecttree import SelectDialogTreeLeaf, SelectDialogTreeNode from selecttree import SelectDialogTreeData, SelectDialogTreeCanvas @@ -156,7 +156,7 @@ def __init__(self, app): select_func = lambda gi, games=games: gi.id in games if name is None or not filter(select_func, self.all_games_gi): continue - name = _("New games in v") + name + name = _("New games in v.") + name gg.append(SelectGameNode(None, name, select_func)) if 1 and gg: s_by_pysol_version = SelectGameNode(None, _("by PySol version"), tuple(gg)) @@ -241,7 +241,7 @@ class SelectGameDialog(MfxDialog): def __init__(self, parent, title, app, gameid, **kw): kw = self.initKw(kw) - _ToplevelDialog.__init__(self, parent, title, kw.resizable, kw.default) + MfxDialog.__init__(self, parent, title, kw.resizable, kw.default) top_frame, bottom_frame = self.createFrames(kw) self.createBitmaps(top_frame, kw) # @@ -265,9 +265,9 @@ def __init__(self, parent, title, app, gameid, **kw): def initKw(self, kw): kw = KwStruct(kw, - strings=(None, None, _("Cancel"),), default=0, - separatorwidth=2, resizable=1, - font=None, + strings=(None, None, _("&Cancel"),), default=0, + separatorwidth=2, + resizable=1, padx=10, pady=10, buttonpadx=10, buttonpady=5, ) @@ -302,7 +302,7 @@ class SelectGameDialogWithPreview(SelectGameDialog): def __init__(self, parent, title, app, gameid, bookmark=None, **kw): kw = self.initKw(kw) - _ToplevelDialog.__init__(self, parent, title, kw.resizable, kw.default) + MfxDialog.__init__(self, parent, title, kw.resizable, kw.default) top_frame, bottom_frame = self.createFrames(kw) self.createBitmaps(top_frame, kw) # @@ -406,7 +406,7 @@ def __init__(self, parent, title, app, gameid, bookmark=None, **kw): def initKw(self, kw): kw = KwStruct(kw, - strings=(_("Select"), _("Rules"), _("Cancel"),), + strings=(_("&Select"), _("&Rules"), _("&Cancel"),), default=0, ) return SelectGameDialog.initKw(self, kw) @@ -485,8 +485,7 @@ def updatePreview(self, gameid, animations=5): self.preview_game.endGame() self.preview_game.destruct() ##self.top.wm_title("Select Game - " + self.app.getGameTitleName(gameid)) - #title = gettext(unicode(self.app.getGameTitleName(gameid), 'utf-8')) - title = gettext(self.app.getGameTitleName(gameid)) + title = self.app.getGameTitleName(gameid) self.top.wm_title(_("Playable Preview - ") + title) ## if False: ## cw, ch = canvas.winfo_width(), canvas.winfo_height() diff --git a/pysollib/tk/selecttile.py b/pysollib/tk/selecttile.py index d50c38964d..c82bf12b19 100644 --- a/pysollib/tk/selecttile.py +++ b/pysollib/tk/selecttile.py @@ -44,7 +44,7 @@ # Toolkit imports from tkutil import loadImage -from tkwidget import _ToplevelDialog, MfxDialog, MfxScrolledCanvas +from tkwidget import MfxDialog, MfxScrolledCanvas from selecttree import SelectDialogTreeLeaf, SelectDialogTreeNode from selecttree import SelectDialogTreeData, SelectDialogTreeCanvas @@ -112,7 +112,7 @@ class SelectTileDialogWithPreview(MfxDialog): def __init__(self, parent, title, app, manager, key=None, **kw): kw = self.initKw(kw) - _ToplevelDialog.__init__(self, parent, title, kw.resizable, kw.default) + MfxDialog.__init__(self, parent, title, kw.resizable, kw.default) top_frame, bottom_frame = self.createFrames(kw) self.createBitmaps(top_frame, kw) # @@ -155,8 +155,9 @@ def destroy(self): def initKw(self, kw): kw = KwStruct(kw, - strings=(_("OK"), _("Solid color..."), _("Cancel"),), default=0, - separatorwidth=2, resizable=1, + strings=(_("&OK"), _("&Solid color..."), _("&Cancel"),), + default=0, + resizable=1, font=None, padx=10, pady=10, buttonpadx=10, buttonpady=5, diff --git a/pysollib/tk/selecttree.py b/pysollib/tk/selecttree.py index 1eddef43b3..db299b579f 100644 --- a/pysollib/tk/selecttree.py +++ b/pysollib/tk/selecttree.py @@ -44,7 +44,6 @@ # Toolkit imports from tkutil import makeImage -from tkwidget import _ToplevelDialog, MfxDialog, MfxScrolledCanvas from tkcanvas import MfxCanvas from tktree import MfxTreeLeaf, MfxTreeNode, MfxTreeInCanvas @@ -183,8 +182,3 @@ def doubleClick(self, event=None): self.redraw() return "break" -# /*********************************************************************** -# // Canvas for a preview (right side) -# ************************************************************************/ - -##SelectDialogPreviewCanvas = MfxScrolledCanvas diff --git a/pysollib/tk/soundoptionsdialog.py b/pysollib/tk/soundoptionsdialog.py index bb0c70b3a0..0ca59eaa1e 100644 --- a/pysollib/tk/soundoptionsdialog.py +++ b/pysollib/tk/soundoptionsdialog.py @@ -47,7 +47,7 @@ # Toolkit imports from tkconst import EVENT_HANDLED, EVENT_PROPAGATE -from tkwidget import _ToplevelDialog, MfxDialog +from tkwidget import MfxDialog # /*********************************************************************** # // @@ -59,7 +59,7 @@ class SoundOptionsDialog(MfxDialog): def __init__(self, parent, title, app, **kw): self.app = app kw = self.initKw(kw) - _ToplevelDialog.__init__(self, parent, title, kw.resizable, kw.default) + MfxDialog.__init__(self, parent, title, kw.resizable, kw.default) top_frame, bottom_frame = self.createFrames(kw) self.createBitmaps(top_frame, kw) # @@ -103,15 +103,15 @@ def __init__(self, parent, title, app, **kw): self.mainloop(focus, kw.timeout) def initKw(self, kw): - strings=[_("OK"), _("Apply"), _("Mixer..."), _("Cancel"),] + strings=[_("&OK"), _("&Apply"), _("&Mixer..."), _("&Cancel"),] if self.MIXER is None: - strings[2] = (_("Mixer..."), -1) + strings[2] = (_("&Mixer..."), -1) ## if os.name != "nt" and not self.app.debug: ## strings[2] = None kw = KwStruct(kw, - strings=strings, default=0, - separatorwidth=2, resizable=1, - font=None, + strings=strings, + default=0, + resizable=1, padx=10, pady=10, buttonpadx=10, buttonpady=5, ) @@ -155,7 +155,7 @@ def mOptSoundDirectX(self, *event): d = MfxDialog(self.top, title=_("Sound preferences info"), text=_("Changing DirectX settings will take effect\nthe next time you restart ")+PACKAGE, bitmap="warning", - default=0, strings=(_("OK"),)) + default=0, strings=(_("&OK"),)) # /*********************************************************************** diff --git a/pysollib/tk/statusbar.py b/pysollib/tk/statusbar.py index c5cea31181..e87947acd0 100644 --- a/pysollib/tk/statusbar.py +++ b/pysollib/tk/statusbar.py @@ -62,10 +62,12 @@ def __init__(self, top, row, column, columnspan): self.padx = 1 self.pady = 2 # - self.frame = Tkinter.Frame(self.top, bd=1) #, relief='raised') + self.frame = Tkinter.Frame(self.top, bd=1) self.frame.grid(row=self._row, column=self._column, columnspan=self._columnspan, sticky='ew', padx=self.padx, pady=self.pady) + #if os.name == "mac": + # Tkinter.Label(self.frame, width=2).pack(side='right') # util def _createLabel(self, name, diff --git a/pysollib/tk/timeoutsdialog.py b/pysollib/tk/timeoutsdialog.py index caff51542d..1ec237853b 100644 --- a/pysollib/tk/timeoutsdialog.py +++ b/pysollib/tk/timeoutsdialog.py @@ -30,7 +30,7 @@ # Toolkit imports from tkconst import EVENT_HANDLED, EVENT_PROPAGATE -from tkwidget import _ToplevelDialog, MfxDialog +from tkwidget import MfxDialog # /*********************************************************************** # // @@ -39,7 +39,7 @@ class TimeoutsDialog(MfxDialog): def __init__(self, parent, title, app, **kw): kw = self.initKw(kw) - _ToplevelDialog.__init__(self, parent, title, kw.resizable, kw.default) + MfxDialog.__init__(self, parent, title, kw.resizable, kw.default) top_frame, bottom_frame = self.createFrames(kw) #self.createBitmaps(top_frame, kw) @@ -89,8 +89,8 @@ def __init__(self, parent, title, app, **kw): def initKw(self, kw): kw = KwStruct(kw, - strings=(_("OK"), _("Cancel")), default=0, - separatorwidth=0, + strings=(_("&OK"), _("&Cancel")), default=0, + padx=10, pady=10, ) return MfxDialog.initKw(self, kw) diff --git a/pysollib/tk/tkhtml.py b/pysollib/tk/tkhtml.py index c9ac8a84c2..9e63001253 100644 --- a/pysollib/tk/tkhtml.py +++ b/pysollib/tk/tkhtml.py @@ -456,7 +456,7 @@ def goHome(self, *event): def errorDialog(self, msg): d = MfxDialog(self.parent, title=PACKAGE+" HTML Problem", text=msg, bitmap="warning", - strings=(_("OK"),), default=0) + strings=(_("&OK"),), default=0) def showImage(self, src, alt, ismap, align, width, height): url = self.basejoin(src) diff --git a/pysollib/tk/tkstats.py b/pysollib/tk/tkstats.py index 279a68af0a..33723a3ea6 100644 --- a/pysollib/tk/tkstats.py +++ b/pysollib/tk/tkstats.py @@ -54,7 +54,7 @@ # Toolkit imports from tkutil import bind, unbind_destroy, loadImage -from tkwidget import _ToplevelDialog, MfxDialog +from tkwidget import MfxDialog, MfxMessageDialog from tkwidget import MfxScrolledCanvas gettext = _ @@ -70,7 +70,7 @@ class SingleGame_StatsDialog(MfxDialog): def __init__(self, parent, title, app, player, gameid, **kw): self.app = app kw = self.initKw(kw) - _ToplevelDialog.__init__(self, parent, title, kw.resizable, kw.default) + MfxDialog.__init__(self, parent, title, kw.resizable, kw.default) top_frame, bottom_frame = self.createFrames(kw) self.top_frame = top_frame self.createBitmaps(top_frame, kw) @@ -285,13 +285,11 @@ def createPieChart(self, app, won, lost, text): def initKw(self, kw): kw = KwStruct(kw, - strings=(_("OK"), - (_("All games..."), 102), + strings=(_("&OK"), + (_("&All games..."), 102), (TOP_TITLE+"...", 105), - (_("Reset..."), 302)), default=0, + (_("&Reset..."), 302)), default=0, image=self.app.gimages.logos[5], - separatorwidth=2, - resizable=0, padx=10, pady=10, ) return MfxDialog.initKw(self, kw) @@ -543,7 +541,7 @@ def __init__(self, parent, title, app, player, **kw): # kwdefault(kw, width=self.CHAR_W*64, height=lines*self.CHAR_H) kw = self.initKw(kw) - _ToplevelDialog.__init__(self, parent, title, kw.resizable, kw.default) + MfxDialog.__init__(self, parent, title, kw.resizable, kw.default) top_frame, bottom_frame = self.createFrames(kw) self.createBitmaps(top_frame, kw) # @@ -570,13 +568,13 @@ def __init__(self, parent, title, app, player, **kw): def initKw(self, kw): kw = KwStruct(kw, - strings=(_("OK"), - (_("Save to file"), 202), - (_("Reset all..."), 301),), + strings=(_("&OK"), + (_("&Save to file"), 202), + (_("&Reset all..."), 301),), default=0, - separatorwidth=2, resizable=1, - padx=10, pady=10, - #width=900, + resizable=1, + padx=10, pady=10, + #width=900, ) return MfxDialog.initKw(self, kw) @@ -644,7 +642,7 @@ def fillCanvas(self, player, header): def initKw(self, kw): kw = KwStruct(kw, - strings=(_("OK"), (_("Session log..."), 104), (_("Save to file"), 203)), default=0, + strings=(_("&OK"), (_("Session &log..."), 104), (_("&Save to file"), 203)), default=0, width=76*self.CHAR_W, ) return AllGames_StatsDialog.initKw(self, kw) @@ -660,7 +658,7 @@ def fillCanvas(self, player, header): def initKw(self, kw): kw = KwStruct(kw, - strings=(_("OK"), (_("Full log..."), 103), (_("Save to file"), 204)), default=0, + strings=(_("&OK"), (_("&Full log..."), 103), (_("&Save to file"), 204)), default=0, ) return FullLog_StatsDialog.initKw(self, kw) @@ -668,7 +666,7 @@ def initKw(self, kw): # // # ************************************************************************/ -class Status_StatsDialog(MfxDialog): +class Status_StatsDialog(MfxMessageDialog): def __init__(self, parent, game): stats, gstats = game.stats, game.gstats w1 = w2 = "" @@ -688,26 +686,27 @@ def __init__(self, parent, game): w2 = w2 + _("\nCards in Foundations: ") + str(n) # date = time.strftime("%Y-%m-%d %H:%M", time.localtime(game.gstats.start_time)) - MfxDialog.__init__(self, parent, title=_("Game status"), - text=game.getTitleName() + "\n" + - game.getGameNumber(format=1) + "\n" + - _("Playing time: ") + game.getTime() + "\n" + - _("Started at: ") + date + "\n\n"+ - _("Moves: ") + str(game.moves.index) + "\n" + - _("Undo moves: ") + str(stats.undo_moves) + "\n" + - _("Bookmark moves: ") + str(gstats.goto_bookmark_moves) + "\n" + - _("Demo moves: ") + str(stats.demo_moves) + "\n" + - _("Total player moves: ") + str(stats.player_moves) + "\n" + - _("Total moves in this game: ") + str(stats.total_moves) + "\n" + - _("Hints: ") + str(stats.hints) + "\n" + - "\n" + - w1 + w2, - strings=(_("OK"), - (_("Statistics..."), 101), - (TOP_TITLE+"...", 105), ), - image=game.app.gimages.logos[3], - image_side="left", image_padx=20, - padx=20, separatorwidth=2) + MfxMessageDialog.__init__(self, parent, title=_("Game status"), + text=game.getTitleName() + "\n" + + game.getGameNumber(format=1) + "\n" + + _("Playing time: ") + game.getTime() + "\n" + + _("Started at: ") + date + "\n\n"+ + _("Moves: ") + str(game.moves.index) + "\n" + + _("Undo moves: ") + str(stats.undo_moves) + "\n" + + _("Bookmark moves: ") + str(gstats.goto_bookmark_moves) + "\n" + + _("Demo moves: ") + str(stats.demo_moves) + "\n" + + _("Total player moves: ") + str(stats.player_moves) + "\n" + + _("Total moves in this game: ") + str(stats.total_moves) + "\n" + + _("Hints: ") + str(stats.hints) + "\n" + + "\n" + + w1 + w2, + strings=(_("&OK"), + (_("&Statistics..."), 101), + (TOP_TITLE+"...", 105), ), + image=game.app.gimages.logos[3], + image_side="left", image_padx=20, + padx=20, + ) # /*********************************************************************** # // @@ -716,7 +715,7 @@ def __init__(self, parent, game): class _TopDialog(MfxDialog): def __init__(self, parent, title, top, **kw): kw = self.initKw(kw) - _ToplevelDialog.__init__(self, parent, title, kw.resizable, kw.default) + MfxDialog.__init__(self, parent, title, kw.resizable, kw.default) top_frame, bottom_frame = self.createFrames(kw) self.createBitmaps(top_frame, kw) @@ -773,7 +772,7 @@ def __init__(self, parent, title, top, **kw): def initKw(self, kw): - kw = KwStruct(kw, strings=(_('OK'),), default=0, separatorwidth = 2) + kw = KwStruct(kw, strings=(_('&OK'),), default=0, separatorwidth=2) return MfxDialog.initKw(self, kw) @@ -781,7 +780,7 @@ class Top_StatsDialog(MfxDialog): def __init__(self, parent, title, app, player, gameid, **kw): self.app = app kw = self.initKw(kw) - _ToplevelDialog.__init__(self, parent, title, kw.resizable, kw.default) + MfxDialog.__init__(self, parent, title, kw.resizable, kw.default) top_frame, bottom_frame = self.createFrames(kw) self.createBitmaps(top_frame, kw) @@ -857,8 +856,9 @@ def showTop(self, top): def initKw(self, kw): kw = KwStruct(kw, - strings=(_('OK'),), + strings=(_('&OK'),), default=0, image=self.app.gimages.logos[4], - separatorwidth = 2) + separatorwidth=2, + ) return MfxDialog.initKw(self, kw) diff --git a/pysollib/tk/tkutil.py b/pysollib/tk/tkutil.py index d728d33b17..234b93c62b 100644 --- a/pysollib/tk/tkutil.py +++ b/pysollib/tk/tkutil.py @@ -181,6 +181,10 @@ def makeHelpToplevel(app, title=None): window.option_add('*foreground', fg) window.option_add('*selectBackground', '#00008b', 50) window.option_add('*selectForeground', 'white', 50) + if os.name == "posix": + window.option_add('*Scrollbar.elementBorderWidth', '1', 60) + window.option_add('*Scrollbar.borderWidth', '1', 60) + if title: window.wm_title(title) window.wm_iconname(title) diff --git a/pysollib/tk/tkwidget.py b/pysollib/tk/tkwidget.py index ae5030ffe9..80a51ef8bb 100644 --- a/pysollib/tk/tkwidget.py +++ b/pysollib/tk/tkwidget.py @@ -33,7 +33,7 @@ ## ##---------------------------------------------------------------------------## -__all__ = ['MfxDialog', +__all__ = ['MfxMessageDialog', 'MfxExceptionDialog', 'MfxSimpleEntry', 'MfxTooltip', @@ -56,25 +56,30 @@ from tkutil import makeToplevel, setTransient from tkcanvas import MfxCanvas + # /*********************************************************************** # // abstract base class for the dialogs in this module # ************************************************************************/ -class _ToplevelDialog: - img = None +class MfxDialog: # ex. _ToplevelDialog + img = {} + button_img = {} def __init__(self, parent, title="", resizable=0, default=-1): self.parent = parent self.status = 0 self.button = default self.timer = None + self.accel_keys = {} self.top = makeToplevel(parent, title=title) self.top.wm_resizable(resizable, resizable) ##w, h = self.top.winfo_screenwidth(), self.top.winfo_screenheight() ##self.top.wm_maxsize(w-4, h-32) bind(self.top, "WM_DELETE_WINDOW", self.wmDeleteWindow) + # def mainloop(self, focus=None, timeout=0): bind(self.top, "", self.mCancel) + bind(self.top, '', self.altKeyEvent) # for accelerators if focus is not None: focus.focus() setTransient(self.top, self.parent) @@ -131,31 +136,24 @@ def mTimeout(self, *event): self.status = 2 raise SystemExit + def mDone(self, button): + self.button = button + raise SystemExit -# /*********************************************************************** -# // replacement for the tk_dialog script -# ************************************************************************/ + def altKeyEvent(self, event): + key = event.char.lower() + key = unicode(key, 'utf-8') + button = self.accel_keys.get(key) + if not button is None: + self.mDone(button) -class MfxDialog(_ToplevelDialog): - def __init__(self, parent, title, **kw): - kw = self.initKw(kw) - _ToplevelDialog.__init__(self, parent, title, kw.resizable, kw.default) - top_frame, bottom_frame = self.createFrames(kw) - self.createBitmaps(top_frame, kw) - # - self.button = kw.default - msg = Tkinter.Label(top_frame, text=kw.text, justify=kw.justify, - width=kw.width) - msg.pack(fill=Tkinter.BOTH, expand=1, padx=kw.padx, pady=kw.pady) - # - focus = self.createButtons(bottom_frame, kw) - self.mainloop(focus, kw.timeout) def initKw(self, kw): kw = KwStruct(kw, timeout=0, resizable=0, text="", justify="center", - strings=(_("OK"),), default=0, + strings=(_("&OK"),), + default=0, width=0, padx=20, pady=20, bitmap=None, bitmap_side="left", @@ -170,27 +168,21 @@ def initKw(self, kw): def createFrames(self, kw): bottom_frame = Tkinter.Frame(self.top) - bottom_frame.pack(side=Tkinter.BOTTOM, fill=Tkinter.BOTH, ipady=3) + bottom_frame.pack(side='bottom', fill='both', expand=1, ipady=3) if kw.separatorwidth > 0: separator = Tkinter.Frame(self.top, relief="sunken", height=kw.separatorwidth, width=kw.separatorwidth, borderwidth=kw.separatorwidth / 2) - separator.pack(side=Tkinter.BOTTOM, fill=Tkinter.X) + separator.pack(side='bottom', fill='x') top_frame = Tkinter.Frame(self.top) - top_frame.pack(side=Tkinter.TOP, fill=Tkinter.BOTH, expand=1) + top_frame.pack(side='top', fill='both', expand=1) return top_frame, bottom_frame def createBitmaps(self, frame, kw): - bm = ["error", "info", "question", "warning"] - if kw.bitmap in bm: - img = None - if self.img: - img = self.img[bm.index(kw.bitmap)] + if kw.bitmap: ## in ("error", "info", "question", "warning") + img = self.img.get(kw.bitmap) b = Tkinter.Label(frame, image=img) b.pack(side=kw.bitmap_side, padx=kw.bitmap_padx, pady=kw.bitmap_pady) - elif kw.bitmap: - b = Tkinter.Label(frame, bitmap=kw.bitmap) - b.pack(side=kw.bitmap_side, padx=kw.bitmap_padx, pady=kw.bitmap_pady) elif kw.image: b = Tkinter.Label(frame, image=kw.image) b.pack(side=kw.image_side, padx=kw.image_padx, pady=kw.image_pady) @@ -206,6 +198,7 @@ def createButtons(self, frame, kw): if s: ##s = re.sub(r"[\s\.\,]", "", s) s = s.replace('...', '.') + s = s.replace('&', '') max_len = max(max_len, len(s)) ##print s, len(s) if max_len > 12 and os.name == 'posix': button_width = max_len @@ -213,6 +206,8 @@ def createButtons(self, frame, kw): elif max_len > 6 : button_width = max_len+2 else : button_width = 8 #print 'button_width =', button_width + # + # for s in kw.strings: xbutton = button = button + 1 if type(s) is types.TupleType: @@ -221,6 +216,8 @@ def createButtons(self, frame, kw): s = s[0] if s is None: continue + accel_indx = s.find('&') + s = s.replace('&', '') if button < 0: b = Tkinter.Button(frame, text=s, state="disabled") button = xbutton @@ -230,30 +227,54 @@ def createButtons(self, frame, kw): if button == kw.default: focus = b focus.config(default="active") - l = len(s) -## if 1 and l < max_len: -## l = l + (max_len - l) / 2 -## b.config(width=l) + # b.config(width=button_width) - column = column + 1 - b.grid_configure(column=column, row=0, sticky="ew", padx=padx, pady=pady) - b.grid_columnconfigure(column) + if accel_indx >= 0: + # key accelerator + b.config(underline=accel_indx) + key = s[accel_indx] + self.accel_keys[key.lower()] = button + # +## img = None +## if self.button_img: +## img = self.button_img.get(s) +## b.config(compound='left', image=img) + column += 1 + b.grid(column=column, row=0, sticky="nse", padx=padx, pady=pady) if focus is not None: l = (lambda event=None, self=self, button=kw.default: self.mDone(button)) bind(self.top, "", l) bind(self.top, "", l) + # left justify + ##frame.columnconfigure(0, weight=1) return focus - def mDone(self, button): - self.button = button - raise SystemExit + +# /*********************************************************************** +# // replacement for the tk_dialog script +# ************************************************************************/ + +class MfxMessageDialog(MfxDialog): + def __init__(self, parent, title, **kw): + kw = self.initKw(kw) + MfxDialog.__init__(self, parent, title, kw.resizable, kw.default) + top_frame, bottom_frame = self.createFrames(kw) + self.createBitmaps(top_frame, kw) + # + self.button = kw.default + msg = Tkinter.Label(top_frame, text=kw.text, justify=kw.justify, + width=kw.width) + msg.pack(fill=Tkinter.BOTH, expand=1, padx=kw.padx, pady=kw.pady) + # + focus = self.createButtons(bottom_frame, kw) + self.mainloop(focus, kw.timeout) # /*********************************************************************** # // # ************************************************************************/ -class MfxExceptionDialog(MfxDialog): +class MfxExceptionDialog(MfxMessageDialog): def __init__(self, parent, ex, title="Error", **kw): kw = KwStruct(kw, bitmap="error") text = kw.get("text", "") @@ -265,7 +286,7 @@ def __init__(self, parent, ex, title="Error", **kw): else: t = str(ex) kw.text = text + unicode(t, errors='replace') - apply(MfxDialog.__init__, (self, parent, title), kw.getKw()) + apply(MfxMessageDialog.__init__, (self, parent, title), kw.getKw()) # /*********************************************************************** @@ -275,7 +296,7 @@ def __init__(self, parent, ex, title="Error", **kw): class MfxSimpleEntry(MfxDialog): def __init__(self, parent, title, label, value, **kw): kw = self.initKw(kw) - _ToplevelDialog.__init__(self, parent, title, kw.resizable, kw.default) + MfxDialog.__init__(self, parent, title, kw.resizable, kw.default) top_frame, bottom_frame = self.createFrames(kw) self.createBitmaps(top_frame, kw) # @@ -294,7 +315,7 @@ def __init__(self, parent, title, label, value, **kw): def initKw(self, kw): kw = KwStruct(kw, - strings=(_("OK"), _("Cancel")), default=0, + strings=(_("&OK"), _("&Cancel")), default=0, separatorwidth = 0, ) return MfxDialog.initKw(self, kw) diff --git a/pysollib/tk/toolbar.py b/pysollib/tk/toolbar.py index 711ba3aa55..b0e48703e6 100644 --- a/pysollib/tk/toolbar.py +++ b/pysollib/tk/toolbar.py @@ -220,7 +220,8 @@ def __init__(self, top, dir, size=0, relief=Tkinter.FLAT, # (see also setRelief) if os.name == 'posix': #self.frame.config(bd=0, highlightthickness=1) - self.frame.config(bd=1, relief='raised', highlightthickness=0) + relief = self.button_relief == 'flat' and 'raised' or 'flat' + self.frame.config(bd=1, relief=relief, highlightthickness=0) elif os.name == "nt": self.frame.config(bd=2, relief="groove", padx=2, pady=2) #self._createSeparator(width=4, side=Tkinter.LEFT, relief=Tkinter.FLAT) diff --git a/scripts/all_games.py b/scripts/all_games.py index 2084532bd5..60686ea015 100755 --- a/scripts/all_games.py +++ b/scripts/all_games.py @@ -27,7 +27,7 @@ def getGameRulesFilename(n): if n.startswith('Mahjongg'): return 'mahjongg.html' - n = re.sub(r"[\[\(].*$", "", n) + ##n = re.sub(r"[\[\(].*$", "", n) n = latin1_to_ascii(n) n = re.sub(r"[^\w]", "", n) n = n.lower() + ".html"