diff --git a/.github/workflows/osxbuild.yaml b/.github/workflows/osxbuild.yaml index d6c54b12c..bbf1e4272 100644 --- a/.github/workflows/osxbuild.yaml +++ b/.github/workflows/osxbuild.yaml @@ -4,11 +4,10 @@ on: push: branches: [ master ] pull_request: - branches: [ master ] jobs: - osx_app: - runs-on: macos-10.15 + osx_app: + runs-on: macos-11 steps: - uses: actions/checkout@v2 - name: Set up Python @@ -32,17 +31,27 @@ jobs: cmake . -DUSE_BACKEND=OPENCL -DBUILD_DISTRIBUTED=1 make cp katago ../../katrain/katrain/KataGo/katago-osx + - name: Install platypus + run: | + curl -L --output "platypus.zip" https://github.com/sveinbjornt/Platypus/releases/download/5.3/platypus5.3.zip + unzip "platypus.zip" + gunzip Platypus.app/Contents/Resources/platypus_clt.gz + gunzip Platypus.app/Contents/Resources/ScriptExec.gz + mkdir -p /usr/local/bin + mkdir -p /usr/local/share/platypus + cp Platypus.app/Contents/Resources/platypus_clt /usr/local/bin/platypus + cp Platypus.app/Contents/Resources/ScriptExec /usr/local/share/platypus/ScriptExec + cp -a Platypus.app/Contents/Resources/MainMenu.nib /usr/local/share/platypus/MainMenu.nib + chmod -R 755 /usr/local/share/platypus - name: Get Kivy dependencies run: | cd .. git clone https://github.com/kivy/kivy-sdk-packager.git cd kivy-sdk-packager/osx - curl -O -L https://kivy.org/downloads/ci/osx/app/Kivy.dmg - hdiutil attach Kivy.dmg -mountroot . - cp -R Kivy/Kivy.app KaTrain.app + ./create-osx-bundle.sh -n "KaTrain" -a "Sander Land" -o "org.katrain.KaTrain" -i "../../katrain/katrain/img/icon.ico" - name: Install KaTrain pip dependencies run: | - pushd ../kivy-sdk-packager/osx/KaTrain.app/Contents/Resources/venv/bin + pushd ../kivy-sdk-packager/osx/build/KaTrain.app/Contents/Resources/venv/bin source activate popd python -m pip install . @@ -50,17 +59,17 @@ jobs: run: | export KATRAIN_VERSION=`python -c 'from katrain.core.constants import VERSION;print(VERSION)' ` echo "Setting version to ${KATRAIN_VERSION}" - cd ../kivy-sdk-packager/osx + cd ../kivy-sdk-packager/osx/build pushd KaTrain.app/Contents/Resources/ ln -s ./venv/bin/KaTrain yourapp popd - ./fix-bundle-metadata.sh KaTrain.app -n KaTrain -v "${KATRAIN_VERSION}" -a "Sander Land" -o "org.katrain.KaTrain" -i "../../katrain/katrain/img/icon.ico" - ./cleanup-app.sh KaTrain.app -g 1 - ./relocate.sh KaTrain.app + ../fix-bundle-metadata.sh KaTrain.app -n KaTrain -v "${KATRAIN_VERSION}" -a "Sander Land" -o "org.katrain.KaTrain" -i "../../katrain/katrain/img/icon.ico" + ../cleanup-app.sh KaTrain.app + ../relocate.sh KaTrain.app - name: Create dmg run: | pushd ../kivy-sdk-packager/osx - ./create-osx-dmg.sh KaTrain.app KaTrain + ./create-osx-dmg.sh build/KaTrain.app KaTrain popd mkdir osx_app cp ../kivy-sdk-packager/osx/KaTrain.dmg osx_app/ @@ -69,4 +78,3 @@ jobs: with: name: KaTrainOSX path: osx_app - diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index ab59b3c15..5b7d7faa5 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -11,7 +11,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: [3.6, 3.7, 3.8, 3.9] + python-version: [3.7, 3.8, 3.9] steps: - uses: actions/checkout@v2 diff --git a/CONTRIBUTIONS.md b/CONTRIBUTIONS.md index 9912902b2..7b8a0bf86 100644 --- a/CONTRIBUTIONS.md +++ b/CONTRIBUTIONS.md @@ -45,15 +45,16 @@ Many thanks to these additional authors: * "nimets123" for the timer sound effects and board/stone graphics. * Jordan Seaward for the stone sound effects. * "fohristiwhirl" for the Gibo and NGF formats parsing code. -* "kaorahi" for bug fixes and SGF parser improvements. +* "kaorahi" for bug fixes, SGF parser improvements, and tsumego frame code. * "ajkenny84" for the red-green colourblind theme. * Lukasz Wierzbowski for the ability to paste urls for sgfs and helping fix alt-gr issues. * Carton He for contributions to sgf parsing and handling. * "blamarche" for adding the board coordinates toggle. -* "pdeblanc" for adding the ancient chinese scoring option, fixing a bug in query termination +* "pdeblanc" for adding the ancient chinese scoring option, fixing a bug in query termination, and high precision score display. * "LiamHz" for adding the 'back to main branch' keyboard shortcut. * "xiaoyifang" for adding the reset analysis option, feature to save options on the loading screen, and scrolling through variations. * "electricRGB" for help with adding configurable keyboard shortcuts. +* "milescrawford" for work on restyling the territory estimate. ## Translators diff --git a/ENGINE.md b/ENGINE.md index a6bb92acf..1371b6ecd 100644 --- a/ENGINE.md +++ b/ENGINE.md @@ -62,14 +62,11 @@ Run DebugKaTrain.exe, which is released in the .zip file distributable in releas ### libzip compatibility -The most common KataGo issue relates to different libzip versions in the provided executables, - leading to an "Error 127". -Although the provided executables should work on the latest versions of Ubuntu with libzip installed, - various other versions and distros differ in their libzip version. - -* First, try `****sudo apt-get install libzip-dev****` to get this library on recent systems. -* Next, try installing all packages mentioned [here](INSTALL.md#LinuxTrouble). -* A final alternative is to go [here](https://github.com/lightvector/KataGo) and compile KataGo yourself. +The most common KataGo issue relates to incompatible library versions, leading to an "Error 127". + +* A good alternative is to go [here](https://github.com/lightvector/KataGo) and compile KataGo yourself. +* Installing dependencies mentioned [here](INSTALL.md#LinuxTrouble) may also resolve certain issues with KataGo or the gui. + ### Getting more information about errors diff --git a/LICENSE b/LICENSE index b08f6722b..46e711683 100644 --- a/LICENSE +++ b/LICENSE @@ -7,6 +7,7 @@ For on related licenses for these binaries and libraries see https://github.com/ - Equalize icon and Thrash Icon: derived from work by bqlqn from www.flaticon.com - Other Menu icons, Finish, Collaboration, and Flag icons: derived from work by Freepik from www.flaticon.com - Collapse branch icon: derived from work by Kirill Kazachek from www.flaticon.com +- Prune icon: derived from work by Pixelmeetup from www.flaticon.com - Reset icon: derived from work by Pixel Perfect from www.flaticon.com 3. The True Type Font DIGITAL-7 version 1.02 by Sizenko Alexander, which is free for non-commercial use. diff --git a/README.md b/README.md index a26d8cc01..0fc7c5e11 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,7 @@ KaTrain is a tool for analyzing games and playing go with AI feedback from KataG German French Russian +Turkish
Simplified Chinese @@ -111,12 +112,13 @@ This estimate should be reasonably accurate as long as you have not changed the game from the opening to the endgame without making serious (DDK) blunders. Further discussion can be found [here](http://github.com/sanderland/katrain/issues/44) and [here](http://github.com/sanderland/katrain/issues/74). * **Simple Style** Prefers moves that solidify both player's territory, leading to relatively simpler moves. +* Legacy options which were developed earlier include: * **ScoreLoss** is KataGo analyzing as usual, but choosing from potential moves depending on the expected score loss, leading to a varied style with mostly small mistakes. * **Policy** uses the top move from the policy network (it's 'shape sense' without reading). * **Policy Weighted** picks a random move weighted by the policy, leading to a varied style with mostly small mistakes, and occasional blunders due to a lack of reading. * **Blinded Policy** picks a number of moves at random and play the best move among them, being effectively 'blind' to part of the board each turn. Calibrated rank is based on the same idea, and recommended over this option. -* Options that are more on the 'fun and experimental' side include: +* Options that are more on the 'fun and experimental' side include: * Variants of **Blinded Policy**, which use the same basic strategy, but with a twist: * **Local Style** will consider mostly moves close to the last move. * **Tenuki Style** will consider mostly moves away from the last move. @@ -128,7 +130,7 @@ This estimate should be reasonably accurate as long as you have not changed the The Engine based AIs (KataGo, ScoreLoss, KataJigo) are affected by both the model and choice of visits and maximum time, while the policy net based AIs are affected by the choice of model file, but work identically with 1 visit. -Further technical details and discussion on these AIs can be found on [this](http://lifein19x19.com/viewtopic.php?f=10&t=17488&sid=b11e42c005bb6f4f48c83771e6a27eff) thread at the life in 19x19 forums. +Further technical details and discussion on some of these AIs can be found on [this](http://lifein19x19.com/viewtopic.php?f=10&t=17488&sid=b11e42c005bb6f4f48c83771e6a27eff) thread at the life in 19x19 forums. ## Analysis @@ -166,7 +168,11 @@ Keyboard shortcuts are shown with **[key]**. * **[l]**: Play out the game until the end and add as a collapsed branch, to visualize the potential effect of mistakes. This is done in the background, and can be started at several nodes at once when comparing the results at different starting positions. * **[spacebar]**: Turn continuous analysis on/off. This will continuously improve analysis of the current position, similar to Lizzie's 'pondering', but only when there are no other queries going on. * **[enter]** AI move. Makes the AI move for the current player regardless of current player selection. - + * **[F2]**: Deeper full game analysis. Analyze the entire game to a higher number of visits. + * **[F3]**: Performance report. Show an overview of performance statistics for both players. + * **[F10]**: Tsumego Frame. After placing a life and death problem in a corner/side, use this to fill up the rest of the board to improve AI's ability in solving life and death problems. + + ## Keyboard and mouse shortcuts In addition to shortcuts mentioned above and those shown in the main menu: @@ -202,12 +208,18 @@ Starting in December 2020, KataGo started [distributed training](https://katagot This allows people to all help generate self-play games to increase KataGo's strength and train bigger models. KaTrain 1.8.0+ makes it easy to contribute to distributed training: simply select the option from the main menu, register an account, and click run. - -During this mode you can do little more than watch games. Toggling continuous analysis (spacebar) will allow you to switch between manually navigating the current game, and automatically advancing it. +During this mode you can do little more than watch games. Keep in mind that partial games are not uploaded, so it is best to plan to keep it running for at least an hour, if not several, for the most effective contribution. +A few keyboard shortcuts have special functions in this mode: + +* **[Spacebar]** Switch between manually navigating the current game, and automatically advancing it. +* **[Escape]**: This sends the `quit` command to KataGo, which starts a slow shutdown, finishing partial games but not starting new ones. Only works on v1.11+. +* **[Pause]**: Pauses/resumes contributions via the `pause` and `resume` commands introduced in KataGo v1.11. + + ## Themes See [these instructions](THEMES.md) for how to modify the look of any graphics or colours, and creating or install themes. @@ -229,13 +241,11 @@ See [these instructions](THEMES.md) for how to modify the look of any graphics o ## Support / Contribute [![GitHub issues](http://img.shields.io/github/issues/sanderland/katrain)](http://github.com/sanderland/katrain/issues) -[![Contributors](http://img.shields.io/static/v1?label=contributors&message=26&color=dcb424)](CONTRIBUTIONS.md) -[![Github sponsors](http://img.shields.io/static/v1?label=sponsor&message=%E2%9D%A4&logo=GitHub&color=dcb424&link=http://github.com/sponsors/sanderland/)](http://github.com/sponsors/sanderland) +[![Contributors](http://img.shields.io/static/v1?label=contributors&message=<3&color=dcb424)](CONTRIBUTIONS.md) * Ideas, feedback, and contributions to code or translations are all very welcome. * For suggestions and planned improvements, see [open issues](http://github.com/sanderland/katrain/issues) on github to check if the functionality is already planned. * You can contact me on the [Leela Zero & Friends Discord](http://discord.gg/AjTPFpN) (use the #gui channel) to get help, discuss improvements, or simply show your appreciation. -* You can also donate to the project through [Github Sponsors](http://github.com/sponsors/sanderland). diff --git a/i18n.py b/i18n.py index e5a311583..827ba513a 100644 --- a/i18n.py +++ b/i18n.py @@ -16,7 +16,7 @@ lang_to_strings = defaultdict(set) DEFAULT_LANG = "en" - +INACTIVE_LANGS = ["es"] errors = False po = {} @@ -24,6 +24,8 @@ todos = defaultdict(list) for lang in locales: + if lang in INACTIVE_LANGS: + continue pofile[lang] = os.path.join(localedir, lang, "LC_MESSAGES", "katrain.po") po[lang] = polib.pofile(pofile[lang]) for entry in po[lang].translated_entries(): @@ -44,6 +46,8 @@ for lang in locales: + if lang in INACTIVE_LANGS: + continue if lang != DEFAULT_LANG: for msgid in lang_to_strings[lang]: if ( diff --git a/katrain/KataGo/katago b/katrain/KataGo/katago index a9575404c..e1b1faa3c 100755 Binary files a/katrain/KataGo/katago and b/katrain/KataGo/katago differ diff --git a/katrain/KataGo/katago.exe b/katrain/KataGo/katago.exe index 17dd786c8..afb22c920 100644 Binary files a/katrain/KataGo/katago.exe and b/katrain/KataGo/katago.exe differ diff --git a/katrain/__main__.py b/katrain/__main__.py index 9cff5f7ed..a980ee82d 100644 --- a/katrain/__main__.py +++ b/katrain/__main__.py @@ -488,6 +488,30 @@ def _do_engine_recovery_popup(self, error_message, code): popup.content.popup = popup popup.open() + def _do_tsumego_frame(self, ko, margin): + from katrain.core.tsumego_frame import tsumego_frame_from_katrain_game + + if not self.game.stones: + return + + black_to_play_p = self.next_player_info.player == "B" + node, analysis_region = tsumego_frame_from_katrain_game( + self.game, self.game.komi, black_to_play_p, ko_p=ko, margin=margin + ) + self.game.set_current_node(node) + if self.play_mode.mode == MODE_PLAY: + self.play_mode.switch_ui_mode() # go to analysis mode + if analysis_region: + flattened_region = [ + analysis_region[0][1], + analysis_region[0][0], + analysis_region[1][1], + analysis_region[1][0], + ] + self.game.set_region_of_interest(flattened_region) + node.analyze(self.game.engines[node.next_player]) + self.update_state(redraw_board=True) + def play_mistake_sound(self, node): if self.config("timer/sound") and node.played_sound is None and Theme.MISTAKE_SOUNDS: node.played_sound = True @@ -665,9 +689,11 @@ def _on_keyboard_down(self, _keyboard, keycode, _text, modifiers): Theme.KEY_TEACHER_POPUP, Theme.KEY_AI_POPUP, Theme.KEY_CONFIG_POPUP, + Theme.KEY_TSUMEGO_FRAME, Theme.KEY_CONTRIBUTE_POPUP, ]: # switch between popups popup.dismiss() + return elif keycode[1] in Theme.KEY_SUBMIT_POPUP: fn = getattr(popup.content, "on_submit", None) @@ -676,6 +702,15 @@ def _on_keyboard_down(self, _keyboard, keycode, _text, modifiers): return else: return + + if self.contributing: + if keycode[1] == Theme.KEY_STOP_CONTRIBUTING: + self.engine.graceful_shutdown() + return + elif keycode[1] in Theme.KEY_PAUSE_CONTRIBUTE: + self.engine.pause() + return + if keycode[1] == Theme.KEY_TOGGLE_CONTINUOUS_ANALYSIS: self.toggle_continuous_analysis() elif keycode[1] == Theme.KEY_TOGGLE_COORDINATES: @@ -717,6 +752,8 @@ def _on_keyboard_down(self, _keyboard, keycode, _text, modifiers): self("undo", "main-branch") elif keycode[1] == Theme.KEY_DEEPERANALYSIS_POPUP: self.analysis_controls.dropdown.open_game_analysis_popup() + elif keycode[1] == Theme.KEY_TSUMEGO_FRAME: + self.analysis_controls.dropdown.open_tsumego_frame_popup() elif keycode[1] == Theme.KEY_REPORT_POPUP: self.analysis_controls.dropdown.open_report_popup() elif keycode[1] == "f10" and self.debug_level >= OUTPUT_EXTRA_DEBUG: diff --git a/katrain/config.json b/katrain/config.json index 502d00eb8..b0e9315bc 100644 --- a/katrain/config.json +++ b/katrain/config.json @@ -28,7 +28,7 @@ "anim_pv_time": 0.5, "debug_level": 0, "lang": "en", - "version": "1.10.0", + "version": "1.11.0", "load_fast_analysis": false, "load_sgf_rewind": true }, @@ -82,6 +82,7 @@ true, true ], + "extra_precision": false, "save_analysis": false, "save_marks": false, "low_visits": 25, @@ -231,4 +232,4 @@ } } } -} \ No newline at end of file +} diff --git a/katrain/core/constants.py b/katrain/core/constants.py index 2aadcee2d..26fe14341 100644 --- a/katrain/core/constants.py +++ b/katrain/core/constants.py @@ -1,7 +1,7 @@ PROGRAM_NAME = "KaTrain" -VERSION = "1.10.1" +VERSION = "1.11.0" HOMEPAGE = "https://github.com/sanderland/katrain" -CONFIG_MIN_VERSION = "1.10.0" # keep config files from this version +CONFIG_MIN_VERSION = "1.11.0" # keep config files from this version ANALYSIS_FORMAT_VERSION = "1.0" DATA_FOLDER = "~/.katrain" diff --git a/katrain/core/contribute_engine.py b/katrain/core/contribute_engine.py index c6e20fc9d..9a46ff634 100644 --- a/katrain/core/contribute_engine.py +++ b/katrain/core/contribute_engine.py @@ -3,6 +3,7 @@ import random import shlex import shutil +import signal import subprocess import threading import time @@ -43,7 +44,7 @@ def __init__(self, katrain): self.visits_count = 0 self.start_time = 0 self.server_error = None - + self.paused = False self.save_sgf = self.config.get("savesgf", False) self.save_path = self.config.get("savepath", "./dist_sgf/") self.move_speed = self.config.get("movespeed", 2.0) @@ -136,6 +137,7 @@ def is_idle(self): def queries_remaining(self): return 1 + def start(self): try: self.katrain.log(f"Starting Distributed KataGo with {self.command}", OUTPUT_INFO) @@ -157,6 +159,7 @@ def start(self): OUTPUT_ERROR, ) return # don't start + self.paused = False self.stdout_thread = threading.Thread(target=self._read_stdout_thread, daemon=True) self.stderr_thread = threading.Thread(target=self._read_stderr_thread, daemon=True) self.stdout_thread.start() @@ -180,6 +183,8 @@ def check_alive(self, os_error="", maybe_open_help=False): def shutdown(self, finish=False): process = self.katago_process if process: + self.katago_process.stdin.write(b"forcequit\n") + self.katago_process.stdin.flush() self.katago_process = None process.terminate() if finish is not None: @@ -187,6 +192,26 @@ def shutdown(self, finish=False): if t: t.join() + def graceful_shutdown(self): + """respond to esc""" + if self.katago_process: + self.katago_process.stdin.write(b"quit\n") + self.katago_process.stdin.flush() + self.katrain.log("Finishing games in progress and stopping contribution", OUTPUT_KATAGO_STDERR) + + def pause(self): + """respond to pause""" + if self.katago_process: + if not self.paused: + self.katago_process.stdin.write(b"pause\n") + self.katago_process.stdin.flush() + self.katrain.log("Pausing contribution", OUTPUT_KATAGO_STDERR) + else: + self.katago_process.stdin.write(b"resume\n") + self.katago_process.stdin.flush() + self.katrain.log("Resuming contribution", OUTPUT_KATAGO_STDERR) + self.paused = not self.paused + def _read_stderr_thread(self): while self.katago_process is not None: try: diff --git a/katrain/core/game.py b/katrain/core/game.py index 82349b774..b93085bc4 100644 --- a/katrain/core/game.py +++ b/katrain/core/game.py @@ -65,7 +65,6 @@ def __init__( if move_tree: self.root = move_tree self.external_game = PROGRAM_NAME not in self.root.get_property("AP", "") - self.komi = self.root.komi handicap = int(self.root.handicap) num_starting_moves_black = 0 node = self.root @@ -99,7 +98,6 @@ def __init__( **(game_properties or {}), } ) - self.komi = self.root.komi handicap = katrain.config("game/handicap") if not bypass_config and handicap: self.root.place_handicap_stones(handicap) @@ -291,6 +289,10 @@ def redo(self, n_times=1, stop_on_mistake=None): if stop_on_mistake is None: self.set_current_node(cn) + @property + def komi(self): + return self.root.komi + @property def board_size(self): return self.root.board_size diff --git a/katrain/core/lang.py b/katrain/core/lang.py index 28eb2af34..ccc946846 100644 --- a/katrain/core/lang.py +++ b/katrain/core/lang.py @@ -11,7 +11,7 @@ class Lang(Observable): observers = [] callbacks = [] - FONTS = {"jp": "NotoSansJP-Regular.otf"} + FONTS = {"jp": "NotoSansJP-Regular.otf", "tr": "NotoSans-Regular.ttf"} def __init__(self, lang): super(Lang, self).__init__() diff --git a/katrain/core/sgf_parser.py b/katrain/core/sgf_parser.py index 51cc7d727..c40627830 100644 --- a/katrain/core/sgf_parser.py +++ b/katrain/core/sgf_parser.py @@ -14,7 +14,7 @@ class ParseError(Exception): class Move: GTP_COORD = list("ABCDEFGHJKLMNOPQRSTUVWXYZ") + [ - xa + c for xa in "AB" for c in "ABCDEFGHJKLMNOPQRSTUVWXYZ" + xa + c for xa in "ABCDEFGH" for c in "ABCDEFGHJKLMNOPQRSTUVWXYZ" ] # board size 52+ support PLAYERS = "BW" SGF_COORD = list("ABCDEFGHIJKLMNOPQRSTUVWXYZ".lower()) + list("ABCDEFGHIJKLMNOPQRSTUVWXYZ") # sgf goes to 52 diff --git a/katrain/core/tsumego_frame.py b/katrain/core/tsumego_frame.py new file mode 100755 index 000000000..877684f9a --- /dev/null +++ b/katrain/core/tsumego_frame.py @@ -0,0 +1,289 @@ +from katrain.core.game_node import GameNode +from katrain.core.sgf_parser import Move + +# tsumego frame ported from lizgoban by kaorahi +# note: coords = (j, i) in katrain + +near_to_edge = 2 +offence_to_win = 5 + +BLACK = "B" +WHITE = "W" + + +def tsumego_frame_from_katrain_game(game, komi, black_to_play_p, ko_p, margin): + current_node = game.current_node + bw_board = [[game.chains[c][0].player if c >= 0 else "-" for c in line] for line in game.board] + isize, jsize = ij_sizes(bw_board) + blacks, whites, analysis_region = tsumego_frame(bw_board, komi, black_to_play_p, ko_p, margin) + sgf_blacks = katrain_sgf_from_ijs(blacks, isize, jsize, "B") + sgf_whites = katrain_sgf_from_ijs(whites, isize, jsize, "W") + + played_node = GameNode(parent=current_node, properties={"AB": sgf_blacks, "AW": sgf_whites}) # this inserts + + katrain_region = analysis_region and (analysis_region[1], analysis_region[0]) + return (played_node, katrain_region) + + +def katrain_sgf_from_ijs(ijs, isize, jsize, player): + return [Move((j, i)).sgf((jsize, isize)) for i, j in ijs] + + +def tsumego_frame(bw_board, komi, black_to_play_p, ko_p, margin): + stones = stones_from_bw_board(bw_board) + filled_stones = tsumego_frame_stones(stones, komi, black_to_play_p, ko_p, margin) + region_pos = pick_all(filled_stones, "tsumego_frame_region_mark") + bw = pick_all(filled_stones, "tsumego_frame") + blacks = [(i, j) for i, j, black in bw if black] + whites = [(i, j) for i, j, black in bw if not black] + return (blacks, whites, get_analysis_region(region_pos)) + + +def pick_all(stones, key): + return [[i, j, s.get("black")] for i, row in enumerate(stones) for j, s in enumerate(row) if s.get(key)] + + +def get_analysis_region(region_pos): + if len(region_pos) == 0: + return None + ai, aj, dummy = tuple(zip(*region_pos)) + ri = (min(ai), max(ai)) + rj = (min(aj), max(aj)) + return ri[0] < ri[1] and rj[0] < rj[1] and (ri, rj) + + +def tsumego_frame_stones(stones, komi, black_to_play_p, ko_p, margin): + sizes = ij_sizes(stones) + isize, jsize = sizes + ijs = [ + {"i": i, "j": j, "black": h.get("black")} + for i, row in enumerate(stones) + for j, h in enumerate(row) + if h.get("stone") + ] + + if len(ijs) == 0: + return [] + # find range of problem + top = min_by(ijs, "i", +1) + left = min_by(ijs, "j", +1) + bottom = min_by(ijs, "i", -1) + right = min_by(ijs, "j", -1) + imin = snap0(top["i"]) + jmin = snap0(left["j"]) + imax = snapS(bottom["i"], isize) + jmax = snapS(right["j"], jsize) + # flip/rotate for standard position + # don't mix flip and swap (FF = SS = identity, but SFSF != identity) + flip_spec = ( + [False, False, True] if imin < jmin else [need_flip_p(imin, imax, isize), need_flip_p(jmin, jmax, jsize), False] + ) + if True in flip_spec: + flipped = flip_stones(stones, flip_spec) + filled = tsumego_frame_stones(flipped, komi, black_to_play_p, ko_p, margin) + return flip_stones(filled, flip_spec) + # put outside stones + i0 = imin - margin + i1 = imax + margin + j0 = jmin - margin + j1 = jmax + margin + frame_range = [i0, i1, j0, j1] + black_to_attack_p = guess_black_to_attack([top, bottom, left, right], sizes) + put_border(stones, sizes, frame_range, black_to_attack_p) + put_outside(stones, sizes, frame_range, black_to_attack_p, black_to_play_p, komi) + put_ko_threat(stones, sizes, frame_range, black_to_attack_p, black_to_play_p, ko_p) + return stones + + +# detect corner/edge/center problems +# (avoid putting border stones on the first lines) +def snap(k, to): + return to if abs(k - to) <= near_to_edge else k + + +def snap0(k): + return snap(k, 0) + + +def snapS(k, size): + return snap(k, size - 1) + + +def min_by(ary, key, sign): + by = [sign * z[key] for z in ary] + return ary[by.index(min(by))] + + +def need_flip_p(kmin, kmax, size): + return kmin < size - kmax - 1 + + +def guess_black_to_attack(extrema, sizes): + return sum([sign_of_color(z) * height2(z, sizes) for z in extrema]) > 0 + + +def sign_of_color(z): + return 1 if z["black"] else -1 + + +def height2(z, sizes): + isize, jsize = sizes + return height(z["i"], isize) + height(z["j"], jsize) + + +def height(k, size): + return size - abs(k - (size - 1) / 2) + + +###################################### +# sub + + +def put_border(stones, sizes, frame_range, is_black): + i0, i1, j0, j1 = frame_range + put_twin(stones, sizes, i0, i1, j0, j1, is_black, False) + put_twin(stones, sizes, j0, j1, i0, i1, is_black, True) + + +def put_twin(stones, sizes, beg, end, at0, at1, is_black, reverse_p): + for at in (at0, at1): + for k in range(beg, end + 1): + i, j = (at, k) if reverse_p else (k, at) + put_stone(stones, sizes, i, j, is_black, False, True) + + +def put_outside(stones, sizes, frame_range, black_to_attack_p, black_to_play_p, komi): + isize, jsize = sizes + count = 0 + offense_komi = (+1 if black_to_attack_p else -1) * komi + defense_area = (isize * jsize - offense_komi - offence_to_win) / 2 + for i in range(isize): + for j in range(jsize): + if inside_p(i, j, frame_range): + continue + count += 1 + black_p = xor(black_to_attack_p, (count <= defense_area)) + empty_p = (i + j) % 2 == 0 and abs(count - defense_area) > isize + put_stone(stones, sizes, i, j, black_p, empty_p) + + +# standard position: +# ? = problem, X = offense, O = defense +# OOOOOOOOOOOOO +# OOOOOOOOOOOOO +# OOOOOOOOOOOOO +# XXXXXXXXXXXXX +# XXXXXXXXXXXXX +# XXXX......... +# XXXX.XXXXXXXX +# XXXX.X??????? +# XXXX.X??????? + +# (pattern, top_p, left_p) +offense_ko_threat = ( + """ +....OOOX. +.....XXXX +""", + True, + False, +) + +defense_ko_threat = ( + """ +.. +.. +X. +XO +OO +.O +""", + False, + True, +) + + +def put_ko_threat(stones, sizes, frame_range, black_to_attack_p, black_to_play_p, ko_p): + isize, jsize = sizes + for_offense_p = xor(ko_p, xor(black_to_attack_p, black_to_play_p)) + pattern, top_p, left_p = offense_ko_threat if for_offense_p else defense_ko_threat + aa = [list(line) for line in pattern.splitlines() if len(line) > 0] + height, width = ij_sizes(aa) + for i, row in enumerate(aa): + for j, ch in enumerate(row): + ai = i + (0 if top_p else isize - height) + aj = j + (0 if left_p else jsize - width) + if inside_p(ai, aj, frame_range): + return + black = xor(black_to_attack_p, ch == "O") + empty = ch == "." + put_stone(stones, sizes, ai, aj, black, empty) + + +def xor(a, b): + return bool(a) != bool(b) + + +###################################### +# util + + +def flip_stones(stones, flip_spec): + swap_p = flip_spec[2] + sizes = ij_sizes(stones) + isize, jsize = sizes + new_isize, new_jsize = [jsize, isize] if swap_p else [isize, jsize] + new_stones = [[None for z in range(new_jsize)] for row in range(new_isize)] + for i, row in enumerate(stones): + for j, z in enumerate(row): + new_i, new_j = flip_ij((i, j), sizes, flip_spec) + new_stones[new_i][new_j] = z + return new_stones + + +def put_stone(stones, sizes, i, j, black, empty, tsumego_frame_region_mark=False): + isize, jsize = sizes + if i < 0 or isize <= i or j < 0 or jsize <= j: + return + stones[i][j] = ( + {} + if empty + else { + "stone": True, + "tsumego_frame": True, + "black": black, + "tsumego_frame_region_mark": tsumego_frame_region_mark, + } + ) + + +def inside_p(i, j, region): + i0, i1, j0, j1 = region + return i0 <= i and i <= i1 and j0 <= j and j <= j1 + + +def stones_from_bw_board(bw_board): + return [[stone_from_str(s) for s in row] for row in bw_board] + + +def stone_from_str(s): + black = s == BLACK + white = s == WHITE + return {"stone": True, "black": black} if (black or white) else {} + + +def ij_sizes(stones): + return (len(stones), len(stones[0])) + + +def flip_ij(ij, sizes, flip_spec): + i, j = ij + isize, jsize = sizes + flip_i, flip_j, swap_ij = flip_spec + fi = flip1(i, isize, flip_i) + fj = flip1(j, jsize, flip_j) + return (fj, fi) if swap_ij else (fi, fj) + + +def flip1(k, size, flag): + return size - 1 - k if flag else k diff --git a/katrain/fonts/NotoSans-Regular.ttf b/katrain/fonts/NotoSans-Regular.ttf new file mode 100644 index 000000000..91a774a0a Binary files /dev/null and b/katrain/fonts/NotoSans-Regular.ttf differ diff --git a/katrain/gui.kv b/katrain/gui.kv index 9c04f7e62..e4119bc35 100644 --- a/katrain/gui.kv +++ b/katrain/gui.kv @@ -814,14 +814,19 @@ on_action: root.katrain("selfplay-setup","end") AnalysisMenuItem: text: i18n._("analysis:game") - icon: 'analysis.png' - shortcut: '' + icon: 'Deeper all.png' + shortcut: 'F2' on_action: root.open_game_analysis_popup() AnalysisMenuItem: text: i18n._("analysis:report") icon: 'analysis.png' shortcut: 'F3' on_action: root.open_report_popup() + AnalysisMenuItem: + text: i18n._("analysis:tsumegoframe") + icon: 'New-Game.png' + shortcut: 'F10' + on_action: root.open_tsumego_frame_popup() AnalysisMenuItem: text: i18n._("analysis:continuous") icon: 'play.png' @@ -899,7 +904,7 @@ size_hint: 1,1 - icon_size: self.height * 0.7, self.height * 0.7 + icon_size: self.height * 0.6, self.height * 0.6 : @@ -1078,6 +1083,9 @@ LangButton: icon: 'flags/flag-jp.png' on_press: app.language = 'jp' + LangButton: + icon: 'flags/flag-tr.png' + on_press: app.language = 'tr' BoxLayout: size_hint: 1,None height: root.item_height diff --git a/katrain/gui/badukpan.py b/katrain/gui/badukpan.py index 7d47cf04d..01d04a8f2 100644 --- a/katrain/gui/badukpan.py +++ b/katrain/gui/badukpan.py @@ -33,7 +33,7 @@ from katrain.core.lang import i18n from katrain.core.utils import evaluation_class, format_visits, var_to_grid, json_truncate_arrays from katrain.gui.kivyutils import draw_circle, draw_text, cached_texture -from katrain.gui.popups import I18NPopup, ReAnalyzeGamePopup, GameReportPopup +from katrain.gui.popups import I18NPopup, ReAnalyzeGamePopup, GameReportPopup, TsumegoFramePopup from katrain.gui.theme import Theme @@ -269,7 +269,9 @@ def draw_board(self, *_args): grid_spaces_margin_y = [0.75, 0.75] # bottom, top x_grid_spaces = board_size_x - 1 + sum(grid_spaces_margin_x) y_grid_spaces = board_size_y - 1 + sum(grid_spaces_margin_y) - self.grid_size = min(self.width / x_grid_spaces, self.height / y_grid_spaces) + # grid size is rounded to an integer to avoid rounding errors that + # produce tiny gaps between shaded grid squares + self.grid_size = math.floor(min(self.width / x_grid_spaces, self.height / y_grid_spaces) + 0.1) board_width_with_margins = x_grid_spaces * self.grid_size board_height_with_margins = y_grid_spaces * self.grid_size extra_px_margin_x = (self.width - board_width_with_margins) / 2 @@ -348,8 +350,49 @@ def draw_board_contents(self, *_args): with self.canvas: self.canvas.clear() - # stones current_node = katrain.game.current_node + + # ownership - allow one move out of date for smooth animation, + # drawn first so the board is shaded underneath all other elements. + ownership = current_node.ownership or (current_node.parent and current_node.parent.ownership) + if katrain.analysis_controls.ownership.active and ownership: + if ( + current_node.children + and katrain.controls.status_state[1] == STATUS_TEACHING + and current_node.children[-1].auto_undo + and current_node.children[-1].ownership + ): # loss + loss_grid = var_to_grid( + [a - b for a, b in zip(current_node.children[-1].ownership, ownership)], + (board_size_x, board_size_y), + ) + + for y in range(board_size_y - 1, -1, -1): + for x in range(board_size_x): + loss = max(0, (-1 if current_node.children[-1].move.player == "B" else 1) * loss_grid[y][x]) + if loss > 0: + Color(*Theme.EVAL_COLORS[self.trainer_config["theme"]][1][:3], loss) + Rectangle( + pos=( + self.gridpos_x[x] - self.grid_size / 2, + self.gridpos_y[y] - self.grid_size / 2, + ), + size=(self.grid_size, self.grid_size), + ) + else: + ownership_grid = var_to_grid(ownership, (board_size_x, board_size_y)) + for y in range(board_size_y - 1, -1, -1): + for x in range(board_size_x): + ix_owner = "B" if ownership_grid[y][x] > 0 else "W" + Color( + *Theme.STONE_COLORS[ix_owner][:3], abs(ownership_grid[y][x]) * Theme.OWNERSHIP_MAX_ALPHA + ) + Rectangle( + pos=(self.gridpos_x[x] - self.grid_size / 2, self.gridpos_y[y] - self.grid_size / 2), + size=(self.grid_size, self.grid_size), + ) + + # stones all_dots_off = not katrain.analysis_controls.eval.active has_stone = {} drawn_stone = {} @@ -399,40 +442,6 @@ def draw_board_contents(self, *_args): self.draw_stone(2, y, "W", evalcol=evalcol, evalscale=y / (board_size_y - 1)) self.draw_stone(3, y, "W", innercol=Theme.STONE_COLORS["B"], evalcol=evalcol) - # ownership - allow one move out of date for smooth animation - ownership = current_node.ownership or (current_node.parent and current_node.parent.ownership) - if katrain.analysis_controls.ownership.active and ownership: - rsz = self.grid_size * 0.2 - if ( - current_node.children - and katrain.controls.status_state[1] == STATUS_TEACHING - and current_node.children[-1].auto_undo - and current_node.children[-1].ownership - ): # loss - loss_grid = var_to_grid( - [a - b for a, b in zip(current_node.children[-1].ownership, ownership)], - (board_size_x, board_size_y), - ) - - for y in range(board_size_y - 1, -1, -1): - for x in range(board_size_x): - loss = max(0, (-1 if current_node.children[-1].move.player == "B" else 1) * loss_grid[y][x]) - if loss > 0: - Color(*Theme.EVAL_COLORS[self.trainer_config["theme"]][1][:3], loss) - Rectangle( - pos=(self.gridpos_x[x] - rsz / 2, self.gridpos_y[y] - rsz / 2), size=(rsz, rsz) - ) - else: - ownership_grid = var_to_grid(ownership, (board_size_x, board_size_y)) - for y in range(board_size_y - 1, -1, -1): - for x in range(board_size_x): - ix_owner = "B" if ownership_grid[y][x] > 0 else "W" - if ix_owner != (has_stone.get((x, y), -1)): - Color(*Theme.STONE_COLORS[ix_owner][:3], abs(ownership_grid[y][x])) - Rectangle( - pos=(self.gridpos_x[x] - rsz / 2, self.gridpos_y[y] - rsz / 2), size=(rsz, rsz) - ) - policy = current_node.policy if ( not policy @@ -517,6 +526,16 @@ def draw_roi_box(self, region_of_interest, width=2): width=width, ) + def format_loss(self, x: float) -> str: + if self.trainer_config.get("extra_precision"): + if abs(x) < 0.005: + return "0.0" + if 0 < x <= 0.995: + return "+" + f"{x:.2f}"[1:] + elif -0.995 <= x < 0: + return "-" + f"{x:.2f}"[2:] + return f"{x:+.1f}" + def draw_hover_contents(self, *_args): ghost_alpha = Theme.GHOST_ALPHA katrain = self.katrain @@ -609,9 +628,7 @@ def draw_hover_contents(self, *_args): + "}[/size]" ) - keys[TOP_MOVE_DELTA_SCORE] = ( - "0.0" if -0.05 < move_dict["pointsLost"] < 0.05 else f"{-move_dict['pointsLost']:+.1f}" - ) + keys[TOP_MOVE_DELTA_SCORE] = self.format_loss(-move_dict["pointsLost"]) # def fmt_maybe_missing(arg,sign,digits=1): # return str(round(sign*arg,digits)) if arg is not None else "N/A" @@ -620,9 +637,7 @@ def draw_hover_contents(self, *_args): keys[TOP_MOVE_WINRATE] = f"{winrate*100:.1f}" keys[TOP_MOVE_DELTA_WINRATE] = f"{-move_dict['winrateLost']:+.1%}" keys[TOP_MOVE_VISITS] = format_visits(move_dict["visits"]) - # keys[TOP_MOVE_UTILITY] = fmt_maybe_missing( move_dict.get('utility'),player_sign,2) - # keys[TOP_MOVE_UTILITYLCB] = fmt_maybe_missing(move_dict.get('utilityLcb'),player_sign,2) - # keys[TOP_MOVE_SCORE_STDDEV] =fmt_maybe_missing(move_dict.get('scoreStdev'),1) + Color(*Theme.HINT_TEXT_COLOR) draw_text( pos=(self.gridpos_x[move.coords[0]], self.gridpos_y[move.coords[1]]), @@ -798,6 +813,14 @@ def open_report_popup(self, *_args): report_popup.content.popup = report_popup report_popup.open() + def open_tsumego_frame_popup(self, *_args): + analysis_popup = I18NPopup( + title_key="analysis:tsumegoframe", size=[dp(500), dp(350)], content=TsumegoFramePopup() + ) + analysis_popup.content.popup = analysis_popup + analysis_popup.content.katrain = MDApp.get_running_app().gui + analysis_popup.open() + class AnalysisControls(MDBoxLayout): dropdown = ObjectProperty(None) diff --git a/katrain/gui/kivyutils.py b/katrain/gui/kivyutils.py index 2eda9ae41..fefc8cca6 100644 --- a/katrain/gui/kivyutils.py +++ b/katrain/gui/kivyutils.py @@ -399,7 +399,12 @@ def update_player_params(self, bw, params): self.players[bw].update_widget(**params) def update_player_info(self, bw, player_info): # update sub widget based on gui state change - self.players[bw].update_widget(player_type=player_info.player_type, player_subtype=player_info.player_subtype) + Clock.schedule_once( + lambda _dt: self.players[bw].update_widget( + player_type=player_info.player_type, player_subtype=player_info.player_subtype + ), + -1, + ) class PlayerInfo(MDBoxLayout, BackgroundMixin): diff --git a/katrain/gui/popups.py b/katrain/gui/popups.py index 6a3aa6504..48fd53fc6 100644 --- a/katrain/gui/popups.py +++ b/katrain/gui/popups.py @@ -479,22 +479,22 @@ class BaseConfigPopup(QuickConfigGui): KATAGOS = { "win": { - "OpenCL v1.10.0": "https://github.com/lightvector/KataGo/releases/download/v1.10.0/katago-v1.10.0-opencl-windows-x64.zip", - "Eigen AVX2 (Modern CPUs) v1.10.0": "https://github.com/lightvector/KataGo/releases/download/v1.10.0/katago-v1.10.0-eigenavx2-windows-x64.zip", - "Eigen (CPU, Non-optimized) v1.10.0": "https://github.com/lightvector/KataGo/releases/download/v1.10.0/katago-v1.10.0-eigen-windows-x64.zip", - "OpenCL v1.10.0 (bigger boards)": "https://github.com/lightvector/KataGo/releases/download/v1.10.0/katago-v1.10.0-opencl-windows-x64+bs29.zip", + "OpenCL v1.11.0": "https://github.com/lightvector/KataGo/releases/download/v1.11.0/katago-v1.11.0-opencl-windows-x64.zip", + "Eigen AVX2 (Modern CPUs) v1.11.0": "https://github.com/lightvector/KataGo/releases/download/v1.11.0/katago-v1.11.0-eigenavx2-windows-x64.zip", + "Eigen (CPU, Non-optimized) v1.11.0": "https://github.com/lightvector/KataGo/releases/download/v1.11.0/katago-v1.11.0-eigen-windows-x64.zip", + "OpenCL v1.11.0 (bigger boards)": "https://github.com/lightvector/KataGo/releases/download/v1.11.0/katago-v1.11.0-opencl-windows-x64+bs29.zip", }, "linux": { - "OpenCL v1.10.0": "https://github.com/lightvector/KataGo/releases/download/v1.10.0/katago-v1.10.0-opencl-linux-x64.zip", - "Eigen AVX2 (Modern CPUs) v1.10.0": "https://github.com/lightvector/KataGo/releases/download/v1.10.0/katago-v1.10.0-eigenavx2-linux-x64.zip", - "Eigen (CPU, Non-optimized) v1.10.0": "https://github.com/lightvector/KataGo/releases/download/v1.10.0/katago-v1.10.0-eigen-linux-x64.zip", - "OpenCL v1.10.0 (bigger boards)": "https://github.com/lightvector/KataGo/releases/download/v1.10.0/katago-v1.10.0-opencl-linux-x64+bs29.zip", + "OpenCL v1.11.0": "https://github.com/lightvector/KataGo/releases/download/v1.11.0/katago-v1.11.0-opencl-linux-x64.zip", + "Eigen AVX2 (Modern CPUs) v1.11.0": "https://github.com/lightvector/KataGo/releases/download/v1.11.0/katago-v1.11.0-eigenavx2-linux-x64.zip", + "Eigen (CPU, Non-optimized) v1.11.0": "https://github.com/lightvector/KataGo/releases/download/v1.11.0/katago-v1.11.0-eigen-linux-x64.zip", + "OpenCL v1.11.0 (bigger boards)": "https://github.com/lightvector/KataGo/releases/download/v1.11.0/katago-v1.11.0-opencl-linux-x64+bs29.zip", }, "just-descriptions": { - "CUDA v1.10.0 (Windows)": "https://github.com/lightvector/KataGo/releases/download/v1.10.0/katago-v1.10.0-cuda11.2-windows-x64.zip", - "CUDA v1.10.0 (Linux)": "https://github.com/lightvector/KataGo/releases/download/v1.10.0/katago-v1.10.0-cuda11.1-linux-x64.zip", - "Cuda/TensorRT v1.10.0 (Windows)": "https://github.com/lightvector/KataGo/releases/download/v1.10.0/katago-v1.10.0-trt8.2-cuda11.2-windows-x64.zip", - "Cuda/TensorRT v1.10.0 (Linux)": "https://github.com/lightvector/KataGo/releases/download/v1.10.0/katago-v1.10.0-trt8.2-cuda11.1-linux-x64.zip", + "CUDA v1.11.0 (Windows)": "https://github.com/lightvector/KataGo/releases/download/v1.11.0/katago-v1.11.0-cuda11.2-windows-x64.zip", + "CUDA v1.11.0 (Linux)": "https://github.com/lightvector/KataGo/releases/download/v1.11.0/katago-v1.11.0-cuda11.1-linux-x64.zip", + "Cuda/TensorRT v1.11.0 (Windows)": "https://github.com/lightvector/KataGo/releases/download/v1.11.0/katago-v1.11.0-trt8.2-cuda11.2-windows-x64.zip", + "Cuda/TensorRT v1.11.0 (Linux)": "https://github.com/lightvector/KataGo/releases/download/v1.11.0/katago-v1.11.0-trt8.2-cuda11.1-linux-x64.zip", }, } @@ -810,7 +810,7 @@ def __init__(self, katrain): (os.path.abspath(app.gui.config("general/sgf_save")), "Last Save Dir"), ] self.filesel.path = os.path.abspath(os.path.expanduser(app.gui.config("general/sgf_load"))) - self.filesel.select_string = i18n._("Load File") + self.filesel.select_string = "Load File" def on_submit(self): self.filesel.button_clicked() @@ -832,7 +832,7 @@ def set_suggested(_widget, path): self.filesel.ids.list_view.bind(path=set_suggested) self.filesel.path = os.path.abspath(save_path) - self.filesel.select_string = i18n._("Save File") + self.filesel.select_string = "Save File" def on_submit(self): self.filesel.button_clicked() @@ -846,6 +846,14 @@ def on_submit(self): self.button.trigger_action(duration=0) +class TsumegoFramePopup(BoxLayout): + katrain = ObjectProperty(None) + popup = ObjectProperty(None) + + def on_submit(self): + self.button.trigger_action(duration=0) + + class GameReportPopup(BoxLayout): def __init__(self, katrain, **kwargs): super().__init__(**kwargs) diff --git a/katrain/gui/theme.py b/katrain/gui/theme.py index d3a734db5..a3b95af1a 100644 --- a/katrain/gui/theme.py +++ b/katrain/gui/theme.py @@ -119,6 +119,7 @@ class Theme: GHOST_ALPHA = 0.6 POLICY_ALPHA = 0.5 + OWNERSHIP_MAX_ALPHA = 0.7 # max ownership brightness HINTS_LO_ALPHA = 0.6 HINTS_ALPHA = 0.8 @@ -162,6 +163,7 @@ class Theme: KEY_AI_POPUP = "f7" KEY_CONFIG_POPUP = "f8" KEY_CONTRIBUTE_POPUP = "f9" + KEY_TSUMEGO_FRAME = "f10" KEY_NEW_GAME = "n" KEY_SAVE_GAME = "s" @@ -204,3 +206,6 @@ class Theme: KEY_PAUSE_TIMER = ["pause", "break", "f15"] KEY_TOGGLE_COORDINATES = "k" KEY_ZEN = ["`", "~", "f12"] + + KEY_PAUSE_CONTRIBUTE = KEY_PAUSE_TIMER + KEY_STOP_CONTRIBUTING = KEY_STOP_ANALYSIS diff --git a/katrain/gui/widgets/filebrowser.py b/katrain/gui/widgets/filebrowser.py index 467f4a764..cff23f1de 100644 --- a/katrain/gui/widgets/filebrowser.py +++ b/katrain/gui/widgets/filebrowser.py @@ -232,7 +232,7 @@ class I18NFileChooserListLayout(FileChooserListLayout): padding_x: 15 height: '40dp' size_hint_x: None - text: root.select_string + text: i18n._(root.select_string) on_release: root.button_clicked() """ ) diff --git a/katrain/gui/widgets/movetree.py b/katrain/gui/widgets/movetree.py index 26c58c5ef..560e8f993 100644 --- a/katrain/gui/widgets/movetree.py +++ b/katrain/gui/widgets/movetree.py @@ -84,6 +84,16 @@ def delete_selected_node(self): self.set_game_node(parent) self.is_open = False + def prune_branch(self): + selected_node = self.menu_selected_node + if selected_node and selected_node.parent: + node = selected_node + while node.parent is not None: + node.parent.children = [node] + node = node.parent + self.set_game_node(selected_node) + self.is_open = False + def make_selected_node_main_branch(self): selected_node = self.menu_selected_node or self.scroll_view_widget.current_node if selected_node and selected_node.parent: @@ -229,6 +239,10 @@ def delete_selected_node(self): self.move_tree_canvas.delete_selected_node() self.redraw_tree_trigger() + def prune_branch(self): + self.move_tree_canvas.prune_branch() + self.redraw_tree_trigger() + def make_selected_node_main_branch(self): self.move_tree_canvas.make_selected_node_main_branch() self.redraw_tree_trigger() @@ -306,5 +320,12 @@ def on_scroll_start(self, touch, check_children=True): -background_color: Theme.LIGHTER_BACKGROUND_COLOR -height: dp(45) -width_margin: 1.6 + MoveTreeDropdownItem: + text: i18n._("Prune Branch") + icon: 'Prune.png' + on_action: root.katrain.controls.move_tree.prune_branch() + -background_color: Theme.LIGHTER_BACKGROUND_COLOR + -height: dp(45) + -width_margin: 1.6 """ ) diff --git a/katrain/i18n/locales/cn/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/cn/LC_MESSAGES/katrain.mo index fe5b77754..27544c318 100644 Binary files a/katrain/i18n/locales/cn/LC_MESSAGES/katrain.mo and b/katrain/i18n/locales/cn/LC_MESSAGES/katrain.mo differ diff --git a/katrain/i18n/locales/cn/LC_MESSAGES/katrain.po b/katrain/i18n/locales/cn/LC_MESSAGES/katrain.po index b2687603d..b3febb402 100644 --- a/katrain/i18n/locales/cn/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/cn/LC_MESSAGES/katrain.po @@ -318,6 +318,10 @@ msgstr "显示最后几手棋的选点" msgid "show ai dots" msgstr "AI的显示选点/SGF评价" +#. TODO - point loss precision options +msgid "show two digits for point loss near zero" +msgstr "Show two digits for point loss near zero" + #. submit button msgid "update teacher" msgstr "更新指导棋设置" @@ -429,7 +433,7 @@ msgstr "KataGo" msgid "aihelp:default" msgstr "" -"全功能的KataGo AI. 棋力由 `max visits` 和 `模型` 决定.在一般设置里 `引擎` 部分和引擎设置文件. 这里没有选项." +"全功能的KataGo AI. 棋力由 'max visits' 和 '模型' 决定.在一般设置里 '引擎' 部分和引擎设置文件. 这里没有选项." msgid "ai:jigo" msgstr "Kata控目" @@ -447,14 +451,14 @@ msgid "ai:policy" msgstr "直觉" msgid "aihelp:policy" -msgstr "按最佳直觉行棋, 没有计算. 棋力 主要由引擎设置里的 `模型` 决定. 布局落点设置 影响布局中随机落点的数量." +msgstr "按最佳直觉行棋, 没有计算. 棋力 主要由引擎设置里的 '模型' 决定. 布局落点设置 影响布局中随机落点的数量." msgid "ai:p:weighted" msgstr "直觉权重" msgid "aihelp:p:weighted" msgstr "" -"按直觉概率行棋, `weaken_fac` 决定了 较弱选点的多少. 决定了在没有随机性的最佳选点, `lower_bound` 决定了允许的 " +"按直觉概率行棋, 'weaken_fac' 决定了 较弱选点的多少. 决定了在没有随机性的最佳选点, 'lower_bound' 决定了允许的 " "直觉值的下限." msgid "ai:p:pick" @@ -462,31 +466,31 @@ msgstr "盲选直觉" msgid "aihelp:p:pick" msgstr "" -"随机选择 `pick_n + pick_frac * ` 并采用最佳的 一手. " -"当`pick_frac=1` 就是直觉AI. 如果直觉值大于 `pick_override`则采用最佳的一手以避免明显错误." +"随机选择 'pick_n + pick_frac * ' 并采用最佳的 一手. " +"当'pick_frac=1' 就是直觉AI. 如果直觉值大于 'pick_override'则采用最佳的一手以避免明显错误." msgid "ai:p:local" msgstr "局部模式" msgid "aihelp:p:local" msgstr "" -"使加权 `pick_n + pick_frac * ` 接近 最后一手且选出最优. 如果直觉值大于 " -"`pick_override`则采用最佳的一手以避免明显错误." +"使加权 'pick_n + pick_frac * ' 接近 最后一手且选出最优. 如果直觉值大于 " +"'pick_override'则采用最佳的一手以避免明显错误." msgid "ai:p:tenuki" msgstr "脱先模式" msgid "aihelp:p:tenuki" msgstr "" -"使加权`pick_n + pick_frac * ` 偏离 最后一手且选出最优. 如果直觉值 " -"大于`pick_override` 则采用最佳的一手以避免明显错误. 更高的 `stddev` 使其 偏离更多." +"使加权'pick_n + pick_frac * ' 偏离 最后一手且选出最优. 如果直觉值 " +"大于'pick_override' 则采用最佳的一手以避免明显错误. 更高的 'stddev' 使其 偏离更多." msgid "ai:p:influence" msgstr "取势模式" msgid "aihelp:p:influence" msgstr "" -"在高于 `threshold` 的点中选出最优. 加大 `line_weight` 以增加对靠近边缘的点的惩罚. 在 'endgame' " +"在高于 'threshold' 的点中选出最优. 加大 'line_weight' 以增加对靠近边缘的点的惩罚. 在 'endgame' " "部分结束后停止." msgid "ai:p:territory" @@ -494,7 +498,7 @@ msgstr "取地模式" msgid "aihelp:p:territory" msgstr "" -"在低于 `threshold` 的点中选出最优. 加大 `line_weight` 以增加对靠近中心的点的惩罚. 在 'endgame' " +"在低于 'threshold' 的点中选出最优. 加大 'line_weight' 以增加对靠近中心的点的惩罚. 在 'endgame' " "部分结束后停止." msgid "katago settings" @@ -919,3 +923,25 @@ msgstr "全局" #. TODO msgid "ai:antimirror" msgstr "KataAntiMirror" + +#. TODO - on move tree editing, deletes all other branches splitting off from +#. the +#. path UP TO this node +msgid "Prune Branch" +msgstr "Prune Branch" + +#. TODO +msgid "aihelp:antimirror" +msgstr "Anti Mirror-go Mode of KataGo." + +#. TODO - distance of wall to existing stones +msgid "tsumego:walldistance" +msgstr "Distance of wall" + +#. TODO - tsumego: ko is good enough? +msgid "tsumego:ko" +msgstr "Ko allowed?" + +#. TODO - Menu option for tsumego frame around position +msgid "analysis:tsumegoframe" +msgstr "Tsumego Frame" diff --git a/katrain/i18n/locales/de/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/de/LC_MESSAGES/katrain.mo index efc2fe1d8..a457c23f6 100644 Binary files a/katrain/i18n/locales/de/LC_MESSAGES/katrain.mo and b/katrain/i18n/locales/de/LC_MESSAGES/katrain.mo differ diff --git a/katrain/i18n/locales/de/LC_MESSAGES/katrain.po b/katrain/i18n/locales/de/LC_MESSAGES/katrain.po index 8dd89b530..a6f88aeac 100644 --- a/katrain/i18n/locales/de/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/de/LC_MESSAGES/katrain.po @@ -449,8 +449,8 @@ msgstr "KataGo" msgid "aihelp:default" msgstr "" -"Spielstärkste KataGo-AI. Spielstärke wird von `max visits` und `model` in " -"den allgemeinen Einstellungen im Bereich `engine` und dem Engine-" +"Spielstärkste KataGo-AI. Spielstärke wird von 'max visits' und 'model' in " +"den allgemeinen Einstellungen im Bereich 'engine' und dem Engine-" "Konfigurationsfile bestimmt. Hier gibt es sonst keine Optionen." msgid "ai:jigo" @@ -475,8 +475,8 @@ msgstr "Policy" msgid "aihelp:policy" msgstr "" "Wählt den besten Zug vom Policy-Netzwerk ohne Analyse. Die Stärke ist am " -"meisten von der `model` Einstellung in den Engine Einstellungen abhängig. " -"Die `opening_moves` Einstellung bestimmt wie viele Züge der Eröffnung " +"meisten von der 'model' Einstellung in den Engine Einstellungen abhängig. " +"Die 'opening_moves' Einstellung bestimmt wie viele Züge der Eröffnung " "zufällig sind." msgid "ai:p:weighted" @@ -485,9 +485,9 @@ msgstr "Policy Gewichtet" msgid "aihelp:p:weighted" msgstr "" "Wählt den Zug gemäß der Policy-Wahrscheinlichkeit, beeinflusst durch " -"`weaken_fac` wie wahrscheinlich schlechtere Züge gespielt werden. Mit einem " -"kleinen Wert spielt wie die AI `Policy`. `pick_override` legt fest, wann der" -" beste Zug gewählt wird ohne Zufall und `lower_bound` bestimmt die untere " +"'weaken_fac' wie wahrscheinlich schlechtere Züge gespielt werden. Mit einem " +"kleinen Wert spielt wie die AI 'Policy'. 'pick_override' legt fest, wann der" +" beste Zug gewählt wird ohne Zufall und 'lower_bound' bestimmt die untere " "Grenze des erlaubten Policy-Wertes." msgid "ai:p:pick" @@ -495,9 +495,9 @@ msgstr "Blinde Policy" msgid "aihelp:p:pick" msgstr "" -"Wählt `pick_n + pick_frac * ` gewichtete Züge " -"zufällig und spielt den besten. Spielt wie die AI `Policy`, wenn " -"`pick_frac=1`. Spielt besten Zug, wenn Policy-Wert höher als `pick_override`" +"Wählt 'pick_n + pick_frac * ' gewichtete Züge " +"zufällig und spielt den besten. Spielt wie die AI 'Policy', wenn " +"'pick_frac=1'. Spielt besten Zug, wenn Policy-Wert höher als 'pick_override'" " ist, um offensichtliche Fehler zu vermeiden." msgid "ai:p:local" @@ -505,19 +505,19 @@ msgstr "Lokaler Stil" msgid "aihelp:p:local" msgstr "" -"Wählt `pick_n + pick_frac * ` gewichtete Züge nahe " +"Wählt 'pick_n + pick_frac * ' gewichtete Züge nahe " "dem letzten Zug und spielt den besten. Spielt besten Zug, wenn Policy-Wert " -"höher als`pick_override` ist, um offensichtliche Fehler zu vermeiden." +"höher als'pick_override' ist, um offensichtliche Fehler zu vermeiden." msgid "ai:p:tenuki" msgstr "Tenuki-Stil" msgid "aihelp:p:tenuki" msgstr "" -"Wählt `pick_n + pick_frac * ` gewichtete Züge fern " +"Wählt 'pick_n + pick_frac * ' gewichtete Züge fern " "vom letzten Zug und spielt den besten. Spielt besten Zug, wenn Policy-Wert " -"höher als`pick_override` ist, um offensichtliche Fehler zu vermeiden. Eine " -"höhere `stddev` führt zu weiter entfernten Zügen." +"höher als'pick_override' ist, um offensichtliche Fehler zu vermeiden. Eine " +"höhere 'stddev' führt zu weiter entfernten Zügen." msgid "ai:p:influence" msgstr "Einflussstil" @@ -525,7 +525,7 @@ msgstr "Einflussstil" msgid "aihelp:p:influence" msgstr "" "Wählt Züge oberhalb des Grenzwertes und spielt den Besten. Erhöhe " -"`line_weight`, um Züge nahe der Ecken mehr zu bestrafen. Stoppt die " +"'line_weight', um Züge nahe der Ecken mehr zu bestrafen. Stoppt die " "Strategie nachdem der 'endgame'-Anteil des Brettes gefüllt ist." msgid "ai:p:territory" @@ -534,7 +534,7 @@ msgstr "Gebietsstil" msgid "aihelp:p:territory" msgstr "" "Wählt Züge unterhalb des Grenzwertes und spielt den besten. Erhöhe " -"`line_weight`, um Züge nahe der Mitte mehr zu bestrafen. Stoppt die " +"'line_weight', um Züge nahe der Mitte mehr zu bestrafen. Stoppt die " "Strategie nachdem der 'endgame'-Anteil des Brettes gefüllt ist." msgid "aihelp:p:rank" @@ -606,9 +606,9 @@ msgstr "Kata-Vorgabesteine" msgid "aihelp:handicap" msgstr "" -"Optimiertes KataGo für höhere Vorgabe-Spiele. Die Einstellung `pda` " -"entspricht `playoutDoublingAdvantage` in KataGo, aus Sicht von Schwarz. Wenn" -" `automatic` eingestellt ist, wird KaTrain automatischeinen geeigneten Wert " +"Optimiertes KataGo für höhere Vorgabe-Spiele. Die Einstellung 'pda' " +"entspricht 'playoutDoublingAdvantage' in KataGo, aus Sicht von Schwarz. Wenn" +" 'automatic' eingestellt ist, wird KaTrain automatischeinen geeigneten Wert " "finden." msgid "estimated strength" @@ -732,6 +732,10 @@ msgstr "Punktänderung" msgid "show stats if" msgstr "Zeige Bewertung wenn mehr als ... Visits" +#. TODO - point loss precision options +msgid "show two digits for point loss near zero" +msgstr "Show two digits for point loss near zero" + #. analysis option msgid "cache analysis to sgf" msgstr "Cache-Analyse in SGF" @@ -988,3 +992,25 @@ msgstr "Gesamtes Spiel" #. TODO msgid "ai:antimirror" msgstr "KataAntiMirror" + +#. TODO - on move tree editing, deletes all other branches splitting off from +#. the +#. path UP TO this node +msgid "Prune Branch" +msgstr "Prune Branch" + +#. TODO +msgid "aihelp:antimirror" +msgstr "Anti Mirror-go Mode of KataGo." + +#. TODO - distance of wall to existing stones +msgid "tsumego:walldistance" +msgstr "Distance of wall" + +#. TODO - tsumego: ko is good enough? +msgid "tsumego:ko" +msgstr "Ko allowed?" + +#. TODO - Menu option for tsumego frame around position +msgid "analysis:tsumegoframe" +msgstr "Tsumego Frame" diff --git a/katrain/i18n/locales/en/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/en/LC_MESSAGES/katrain.mo index b8e484ff2..0a48d0c8f 100644 Binary files a/katrain/i18n/locales/en/LC_MESSAGES/katrain.mo and b/katrain/i18n/locales/en/LC_MESSAGES/katrain.mo differ diff --git a/katrain/i18n/locales/en/LC_MESSAGES/katrain.po b/katrain/i18n/locales/en/LC_MESSAGES/katrain.po index bc5fc5056..ad2eb9528 100644 --- a/katrain/i18n/locales/en/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/en/LC_MESSAGES/katrain.po @@ -105,6 +105,10 @@ msgstr "Fast analysis of all moves" msgid "analysis:game" msgstr "Deeper full game analysis" +#. Menu option for tsumego frame around position +msgid "analysis:tsumegoframe" +msgstr "Tsumego Frame" + #. View a player performance report msgid "analysis:report" msgstr "Performance Report" @@ -503,6 +507,10 @@ msgstr "Show dots for the last moves" msgid "show ai dots" msgstr "Show dots/SGF comments for AI players" +#. point loss precision options +msgid "show two digits for point loss near zero" +msgstr "Show two digits for point loss near zero" + #. analysis option msgid "cache analysis to sgf" msgstr "Cache analysis in SGF" @@ -677,7 +685,7 @@ msgstr "KataGo binary {exe} does not exist, please check general settings." msgid "Kata exe not found in path" msgstr "" -"KataGo binary `{exe}` not found in your PATH, check your environment " +"KataGo binary '{exe}' not found in your PATH, check your environment " "variables or use the full path in general settings instead. If on MacOS, see" " the manual on how to use brew to install katago first" @@ -739,8 +747,8 @@ msgstr "KataGo" msgid "aihelp:default" msgstr "" -"Full strength KataGo AI. Strength is affected by `max visits` and `model` " -"in the general settings `engine` section and engine configuration file. No " +"Full strength KataGo AI. Strength is affected by 'max visits' and 'model' " +"in the general settings 'engine' section and engine configuration file. No " "options are available here." #. ai which handles handicap games better @@ -749,9 +757,9 @@ msgstr "KataHandicap" msgid "aihelp:handicap" msgstr "" -"KataGo optimized for playing higher handicap games.The `pda` setting " -"corresponds to `playoutDoublingAdvantage` in KataGo, from black's " -"perspective. When `automatic` is set, KaTrain will find a suitable value " +"KataGo optimized for playing higher handicap games.The 'pda' setting " +"corresponds to 'playoutDoublingAdvantage' in KataGo, from black's " +"perspective. When 'automatic' is set, KaTrain will find a suitable value " "automatically." msgid "ai:simple" @@ -766,8 +774,8 @@ msgstr "" " * opponent_fac), avoid tenuki (more than 5 spaces, importance " "tenuki_penalty), and avoid attachments (importance attachment_penalty). " "Weights can be negative to make it complicate the game instead, and wide " -"root noise (in general settings) can be used to increase play according to " -"the style at the cost of strength. " +"root noise (in general settings) can be used to play more according to the " +"style at the cost of strength. " msgid "ai:jigo" msgstr "KataJigo" @@ -775,6 +783,9 @@ msgstr "KataJigo" msgid "ai:antimirror" msgstr "KataAntiMirror" +msgid "aihelp:antimirror" +msgstr "Anti Mirror-go Mode of KataGo." + msgid "aihelp:jigo" msgstr "" "Will try to win by a set amount of points (default 0.5), without further " @@ -794,7 +805,7 @@ msgstr "Policy" msgid "aihelp:policy" msgstr "" "Plays the top move from the policy network, without any reading. Strength is" -" mainly affected by `model` in engine settings. The `opening_moves` setting " +" mainly affected by 'model' in engine settings. The 'opening_moves' setting " "affects how many moves in the opening are more random." msgid "ai:p:weighted" @@ -802,10 +813,10 @@ msgstr "Policy Weighted" msgid "aihelp:p:weighted" msgstr "" -"Plays moves according to policy probability, with `weaken_fac` influencing " +"Plays moves according to policy probability, with 'weaken_fac' influencing " "how much more likely weaker moves are played. With a very low value it plays" -" like the `Policy` AI. `pick_override` determines when top move is chosen " -"without randomness, and `lower_bound` determines the lower bound policy " +" like the 'Policy' AI. 'pick_override' determines when top move is chosen " +"without randomness, and 'lower_bound' determines the lower bound policy " "value that is allowed." msgid "ai:p:pick" @@ -813,27 +824,27 @@ msgstr "Blinded Policy" msgid "aihelp:p:pick" msgstr "" -"Picks `pick_n + pick_frac * ` at random and plays the" -" best one. For `pick_frac=1` plays like the `Policy` AI. Plays top move if " -"policy value is above `pick_override` to avoid obvious mistakes." +"Picks 'pick_n + pick_frac * ' at random and plays the" +" best one. For 'pick_frac=1' plays like the 'Policy' AI. Plays top move if " +"policy value is above 'pick_override' to avoid obvious mistakes." msgid "ai:p:local" msgstr "Local Style" msgid "aihelp:p:local" msgstr "" -"Picks `pick_n + pick_frac * ` weighted towards the " +"Picks 'pick_n + pick_frac * ' weighted towards the " "last move and plays the best one. Plays top move if policy value is above " -"`pick_override` to avoid obvious mistakes." +"'pick_override' to avoid obvious mistakes." msgid "ai:p:tenuki" msgstr "Tenuki Style" msgid "aihelp:p:tenuki" msgstr "" -"Picks `pick_n + pick_frac * ` weighted away from the " +"Picks 'pick_n + pick_frac * ' weighted away from the " "last move and plays the best one. Plays top move if policy value is above " -"`pick_override` to avoid obvious mistakes. A higher `stddev` makes it play " +"'pick_override' to avoid obvious mistakes. A higher 'stddev' makes it play " "further away." msgid "ai:p:influence" @@ -841,8 +852,8 @@ msgstr "Influential Style" msgid "aihelp:p:influence" msgstr "" -"Picks moves biased above the `threshold` line and plays the best one. " -"Increase `line_weight` to penalize moves near the edge more. Stops strategy " +"Picks moves biased above the 'threshold' line and plays the best one. " +"Increase 'line_weight' to penalize moves near the edge more. Stops strategy " "after the 'endgame' fraction of the board is filled." msgid "ai:p:territory" @@ -850,8 +861,8 @@ msgstr "Territorial Style" msgid "aihelp:p:territory" msgstr "" -"Picks moves biased below the `threshold` line and plays the best one. " -"Increase `line_weight` to penalize moves near the center more. Stops " +"Picks moves biased below the 'threshold' line and plays the best one. " +"Increase 'line_weight' to penalize moves near the center more. Stops " "strategy after the 'endgame' fraction of the board is filled." msgid "ai:p:rank" @@ -915,6 +926,11 @@ msgstr "Expand/Collapse" msgid "Make Main Branch" msgstr "Make Main Branch" +#. on move tree editing, deletes all other branches splitting off from the +#. path UP TO this node +msgid "Prune Branch" +msgstr "Prune Branch" + #. theme label msgid "theme" msgstr "Colour Theme" @@ -1000,3 +1016,11 @@ msgstr "Target score for Black:" #. Description for how many moves msgid "setup position move number" msgstr "Generate game until move:" + +#. distance of wall to existing stones +msgid "tsumego:walldistance" +msgstr "Distance of wall" + +#. tsumego: ko is good enough? +msgid "tsumego:ko" +msgstr "Ko allowed?" diff --git a/katrain/i18n/locales/es/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/es/LC_MESSAGES/katrain.mo index d6096a613..6a4c79ae7 100644 Binary files a/katrain/i18n/locales/es/LC_MESSAGES/katrain.mo and b/katrain/i18n/locales/es/LC_MESSAGES/katrain.mo differ diff --git a/katrain/i18n/locales/es/LC_MESSAGES/katrain.po b/katrain/i18n/locales/es/LC_MESSAGES/katrain.po index 8dc381230..00839486d 100644 --- a/katrain/i18n/locales/es/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/es/LC_MESSAGES/katrain.po @@ -455,8 +455,8 @@ msgstr "KataGo" msgid "aihelp:default" msgstr "" -"Fuerza máxima de KataGo IA. La fuerza es afectada por el número `máximo " -"visitas` y `modelo` en conf general del `motor` y el archivo de conf del " +"Fuerza máxima de KataGo IA. La fuerza es afectada por el número 'máximo " +"visitas' y 'modelo' en conf general del 'motor' y el archivo de conf del " "motor. No hay opciones disponibles acá." msgid "ai:jigo" @@ -481,7 +481,7 @@ msgstr "Jugadas intuitivas" msgid "aihelp:policy" msgstr "" "Juega la jugada que se considera la más intuitvda sin leer. La fuerza esta " -"dada por el `model` en la conf del motor. El parámetro `opening_moves` " +"dada por el 'model' en la conf del motor. El parámetro 'opening_moves' " "afecta cuantas jugadas en la apertura son al azar." msgid "ai:p:weighted" @@ -490,19 +490,19 @@ msgstr "Parcial" msgid "aihelp:p:weighted" msgstr "" "Hace jugadas deacuerdo a las jugadas más intuitivas y sus probabilidades, " -"con `weaken_fac` influenciando que tan probable es que jugadas debiles sean " +"con 'weaken_fac' influenciando que tan probable es que jugadas debiles sean " "jugadas. Un valor más pequeño se acerca a jugadas más intuitivas según " -"IA.`pick_override` determina que tan frecuente una la mejor jugada es " -"ecogida sin azar, y `lower_bound` determina el rango bajopermitido." +"IA.'pick_override' determina que tan frecuente una la mejor jugada es " +"ecogida sin azar, y 'lower_bound' determina el rango bajopermitido." msgid "ai:p:pick" msgstr "Politica Ciega" msgid "aihelp:p:pick" msgstr "" -"Escoge `pick_n + pick_frac * <#jugadas legales>` al azar y juega la mejor.El" -" `pick_frac=1` juega como la politica intuitiva del IA. Juega la mejor " -"jugada si la probabilidad del IA es por encima de `pick_override`. Esto con " +"Escoge 'pick_n + pick_frac * <#jugadas legales>' al azar y juega la mejor.El" +" 'pick_frac=1' juega como la politica intuitiva del IA. Juega la mejor " +"jugada si la probabilidad del IA es por encima de 'pick_override'. Esto con " "el fin de prevenir errores obvios." msgid "ai:p:local" @@ -510,9 +510,9 @@ msgstr "Estilo Local" msgid "aihelp:p:local" msgstr "" -"Escoge `pick_n + pick_frac * <#jugadas legales>` con un peso superior a " +"Escoge 'pick_n + pick_frac * <#jugadas legales>' con un peso superior a " "jugadas alrededor de la última jugada y escoge la mejor. Juega la mejor " -"jugada si el valor de la politica está por encima `pick_override` con el fin" +"jugada si el valor de la politica está por encima 'pick_override' con el fin" " de prevenir errores obvios." msgid "ai:p:tenuki" @@ -520,18 +520,18 @@ msgstr "Estilo Tenuki" msgid "aihelp:p:tenuki" msgstr "" -"Escoge `pick_n + pick_frac * <#jugadas legales>` con un peso en contra de la" +"Escoge 'pick_n + pick_frac * <#jugadas legales>' con un peso en contra de la" " última jugada y escoge la mejor. Juega la mejor jugada si el valor de la " -"politica esta por encima `pick_override` con el fin de prevenir errores " -"obvios. Un `stddev` más grande hace que juegue más lejos." +"politica esta por encima 'pick_override' con el fin de prevenir errores " +"obvios. Un 'stddev' más grande hace que juegue más lejos." msgid "ai:p:influence" msgstr "Estilo Influencia" msgid "aihelp:p:influence" msgstr "" -"Escoje jugadas preferiendo aquellas por encima de la linea `threshold` y " -"juega la mejor. Incrementar `line_weight` para penalizar más jugadas cerca " +"Escoje jugadas preferiendo aquellas por encima de la linea 'threshold' y " +"juega la mejor. Incrementar 'line_weight' para penalizar más jugadas cerca " "al borde. Para estrategia cuando la fase 'endgame' del tablero ha llegado." msgid "ai:p:territory" @@ -539,8 +539,8 @@ msgstr "Estilo Territorial" msgid "aihelp:p:territory" msgstr "" -"Escoje jugadas preferiendo aquellas por debajo de la linea `threshold` y " -"juega la mejor. Incrementar `line_weight` para penalizar más jugadas cerca " +"Escoje jugadas preferiendo aquellas por debajo de la linea 'threshold' y " +"juega la mejor. Incrementar 'line_weight' para penalizar más jugadas cerca " "al centro. Para estrategia cuando la fase 'endgame' del tablero ha llegado." msgid "aihelp:p:rank" @@ -557,7 +557,7 @@ msgstr "Ecualizar análsis de jugadas candidatas a {visits} visitas" msgid "Kata exe not found in path" msgstr "" -"El binario de KataGo `{exe}` no se encuentra en la 'PATH', revisar variables" +"El binario de KataGo '{exe}' no se encuentra en la 'PATH', revisar variables" " ambiente o usar la ruta completa en la conf general. Si estas en MacOS, ve " "el manual de como usar homebrew para instalar KataGo primero" @@ -609,9 +609,9 @@ msgstr "KataVentaja" msgid "aihelp:handicap" msgstr "" -"KataGo optimizado para jugar con ventaja al oponente. El parámetro `pda` " -"corresponde a `playoutDoublingAdvantage` en KataGo, desde la perspectiva de " -"negro.Cuando `automatic` está establecido, KaTrain encontrará un valor " +"KataGo optimizado para jugar con ventaja al oponente. El parámetro 'pda' " +"corresponde a 'playoutDoublingAdvantage' en KataGo, desde la perspectiva de " +"negro.Cuando 'automatic' está establecido, KaTrain encontrará un valor " "adecuado automáticamente." msgid "estimated strength" @@ -740,6 +740,10 @@ msgstr "Change in score" msgid "show stats if" msgstr "Show stats if more than ... visits" +#. TODO - point loss precision options +msgid "show two digits for point loss near zero" +msgstr "Show two digits for point loss near zero" + #. TODO - analysis option msgid "cache analysis to sgf" msgstr "Cache analysis in SGF" @@ -1003,3 +1007,25 @@ msgstr "Entire Game" #. TODO msgid "ai:antimirror" msgstr "KataAntiMirror" + +#. TODO - on move tree editing, deletes all other branches splitting off from +#. the +#. path UP TO this node +msgid "Prune Branch" +msgstr "Prune Branch" + +#. TODO +msgid "aihelp:antimirror" +msgstr "Anti Mirror-go Mode of KataGo." + +#. TODO - distance of wall to existing stones +msgid "tsumego:walldistance" +msgstr "Distance of wall" + +#. TODO - tsumego: ko is good enough? +msgid "tsumego:ko" +msgstr "Ko allowed?" + +#. TODO - Menu option for tsumego frame around position +msgid "analysis:tsumegoframe" +msgstr "Tsumego Frame" diff --git a/katrain/i18n/locales/fr/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/fr/LC_MESSAGES/katrain.mo index ed0bb0eec..a79d1cc28 100644 Binary files a/katrain/i18n/locales/fr/LC_MESSAGES/katrain.mo and b/katrain/i18n/locales/fr/LC_MESSAGES/katrain.mo differ diff --git a/katrain/i18n/locales/fr/LC_MESSAGES/katrain.po b/katrain/i18n/locales/fr/LC_MESSAGES/katrain.po index 74d0bf509..2d59fc4ab 100644 --- a/katrain/i18n/locales/fr/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/fr/LC_MESSAGES/katrain.po @@ -495,7 +495,7 @@ msgstr "" msgid "Kata exe not found" msgstr "" -"L'exécutable `{exe}` est introuvable. \n" +"L'exécutable '{exe}' est introuvable. \n" "Veuillez vérifier son chemin d'accès dans les paramètres généraux." msgid "Starting Kata failed" @@ -757,6 +757,10 @@ msgstr "Variation du score" msgid "show stats if" msgstr "Nombre de visites minimum requis pour afficher les données :" +#. TODO - point loss precision options +msgid "show two digits for point loss near zero" +msgstr "Show two digits for point loss near zero" + msgid "cache analysis to sgf" msgstr "Sauvegarder un cache SGF de l'analyse" @@ -961,6 +965,22 @@ msgstr "Ce que jouerait KataGo" msgid "Entire Game" msgstr "Partie entière" -#. TODO msgid "ai:antimirror" -msgstr "AntiMirrorGo" +msgstr "Anti-symétrique" + +msgid "Prune Branch" +msgstr "Élaguer les autres branches" + +msgid "aihelp:antimirror" +msgstr "" +"Mode dans lequel Katago cherche à déjouer la stratégie de Go symétrique \n" +"(en d'autres termes, quand l'adversaire imite systématiquement ses coups)." + +msgid "tsumego:walldistance" +msgstr "Distance du mur :" + +msgid "tsumego:ko" +msgstr "Permettre les kos" + +msgid "analysis:tsumegoframe" +msgstr "Composer un problème" diff --git a/katrain/i18n/locales/jp/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/jp/LC_MESSAGES/katrain.mo index 8508b7a1a..14c3c598c 100644 Binary files a/katrain/i18n/locales/jp/LC_MESSAGES/katrain.mo and b/katrain/i18n/locales/jp/LC_MESSAGES/katrain.mo differ diff --git a/katrain/i18n/locales/jp/LC_MESSAGES/katrain.po b/katrain/i18n/locales/jp/LC_MESSAGES/katrain.po index 224a60929..2730b7ca4 100644 --- a/katrain/i18n/locales/jp/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/jp/LC_MESSAGES/katrain.po @@ -459,7 +459,7 @@ msgstr "KataGoの実行ファイル {exe} がありません。一般設定を msgid "Kata exe not found in path" msgstr "" -"KataGoの実行ファイル `{exe}` " +"KataGoの実行ファイル '{exe}' " "がPATH内にありません。環境変数を確認するか、もしくは一般設定でフルパスを記入してください。MacOSの場合は、まずbrewを使ってkatagoをインストールする方法について、マニュアルを参照ください。" msgid "Kata model not found" @@ -482,7 +482,7 @@ msgid "strength:dan" msgstr "段" msgid "ai:default" -msgstr "KataGo" +msgstr "手加減なし" msgid "aihelp:default" msgstr "" @@ -496,7 +496,7 @@ msgstr "Kata置碁" msgid "aihelp:handicap" msgstr "" "置き石が多い場合向けに最適化されたKataGo. " -"`pda`設定は黒側から見たKataGoの`playoutDoublingAdvantage`に対応します. `automatic`を設定しておけば, " +"'pda'設定は黒側から見たKataGoの'playoutDoublingAdvantage'に対応します. 'automatic'を設定しておけば, " "適切な値をKaTrainが自動的にみつけます." msgid "ai:jigo" @@ -518,52 +518,52 @@ msgstr "第一感" msgid "aihelp:policy" msgstr "" "一手も読まずに第一感での最有力手を打ちます. 強さは主にエンジン設定のモデルしだいです. " -"`opening_moves`は序盤の何手目までをよりランダムにするかの設定です." +"'opening_moves'は序盤の何手目までをよりランダムにするかの設定です." msgid "ai:p:weighted" msgstr "第一感(比重)" msgid "aihelp:p:weighted" msgstr "" -"第一感での確率にしたがって手を選びます. `weaken_fac`は弱そうな手を選ぶ度合を調整します. これを非常に小さな値にすれば, " +"第一感での確率にしたがって手を選びます. 'weaken_fac'は弱そうな手を選ぶ度合を調整します. これを非常に小さな値にすれば, " "本来の「第一感」と似たような打ち方になります. なお, " -"最有力手の第一感での確率が`pick_override`より大きい場合はその手が無条件で選ばれます. 逆に, " -"第一感での確率が`lower_bound`より小さい手は決して選ばれません." +"最有力手の第一感での確率が'pick_override'より大きい場合はその手が無条件で選ばれます. 逆に, " +"第一感での確率が'lower_bound'より小さい手は決して選ばれません." msgid "ai:p:pick" msgstr "第一感(盲点)" msgid "aihelp:p:pick" msgstr "" -"`pick_n + pick_frac * <合法手の個数>`個の手をランダムに選んだ上で, その中での最善手を打ちます. " -"`pick_frac=1`にすれば, 本来の「第一感」と同じような打ち方になります. なお, 明らかなミスを避けるために, " -"最有力手の第一感での確率が`pick_override`より大きい場合は無条件でその手を打ちます." +"'pick_n + pick_frac * <合法手の個数>'個の手をランダムに選んだ上で, その中での最善手を打ちます. " +"'pick_frac=1'にすれば, 本来の「第一感」と同じような打ち方になります. なお, 明らかなミスを避けるために, " +"最有力手の第一感での確率が'pick_override'より大きい場合は無条件でその手を打ちます." msgid "ai:p:local" msgstr "おつきあい派" msgid "aihelp:p:local" msgstr "" -"直前の着手に近い位置ほど重みをつけて`pick_n + pick_frac * <合法手の個数>`個の手をランダムに選び, その中での最善手を打ちます." -" ただし, 明らかなミスを避けるために, 最有力手の第一感での確率が`pick_override`より大きい場合は無条件でその手を打ちます." +"直前の着手に近い位置ほど重みをつけて'pick_n + pick_frac * <合法手の個数>'個の手をランダムに選び, その中での最善手を打ちます." +" ただし, 明らかなミスを避けるために, 最有力手の第一感での確率が'pick_override'より大きい場合は無条件でその手を打ちます." msgid "ai:p:tenuki" msgstr "手抜き派" msgid "aihelp:p:tenuki" msgstr "" -"直前の着手から遠い位置ほど重みをつけて`pick_n + pick_frac * <合法手の個数>`個の手をランダムに選び, " +"直前の着手から遠い位置ほど重みをつけて'pick_n + pick_frac * <合法手の個数>'個の手をランダムに選び, " "その中での最善手を打ちます. ただし, 明らかなミスを避けるために, " -"最有力手の第一感での確率が`pick_override`より大きい場合は無条件でその手を打ちます. " -"`stddev`を大きくするほどより遠くの手を打ちます." +"最有力手の第一感での確率が'pick_override'より大きい場合は無条件でその手を打ちます. " +"'stddev'を大きくするほどより遠くの手を打ちます." msgid "ai:p:influence" msgstr "勢力派" msgid "aihelp:p:influence" msgstr "" -"`threshold`線より高い(天元寄りの)手に重みをつけて何個かの手を選び, その中での最善手を打ちます. " -"`line_weight`を大きくするほど, 盤端に近い手をより避けるようになります. なお, " +"'threshold'線より高い(天元寄りの)手に重みをつけて何個かの手を選び, その中での最善手を打ちます. " +"'line_weight'を大きくするほど, 盤端に近い手をより避けるようになります. なお, " "盤全体のうち'endgame'の割合が埋まったあとにはこの重みづけは適用しません." msgid "ai:p:territory" @@ -571,8 +571,8 @@ msgstr "実利派" msgid "aihelp:p:territory" msgstr "" -"`threshold`線より低い(盤端寄りの)手に重みをつけて何個かの手を選び, その中での最善手を打ちます. " -"`line_weight`を大きくするほど, 天元に近い手をより避けるようになります. なお, " +"'threshold'線より低い(盤端寄りの)手に重みをつけて何個かの手を選び, その中での最善手を打ちます. " +"'line_weight'を大きくするほど, 天元に近い手をより避けるようになります. なお, " "盤全体のうち'endgame'の割合が埋まったあとにはこの重みづけは適用しません." msgid "ai:p:rank" @@ -580,8 +580,8 @@ msgstr "段級位相応" msgid "aihelp:p:rank" msgstr "" -"すべての合法手の中からランダムに何個かの候補手を選んで, その中での再有力手を打ちます. " -"強い設定にするほどより多くの候補手の中から再有力手を選ぶようになります. なお, 3段は-2 kyuに対応します(0級/段はないので数字がずれる). " +"すべての合法手の中からランダムに何個かの候補手を選んで, その中での最有力手を打ちます. " +"強い設定にするほどより多くの候補手の中から最有力手を選ぶようになります. なお, 3段は-2 kyuに対応します(0級/段はないので数字がずれる). " #. in AI settings msgid "estimated strength" @@ -726,6 +726,10 @@ msgstr "損失目数" msgid "show stats if" msgstr "表示候補の最低探索数" +#. point loss precision options +msgid "show two digits for point loss near zero" +msgstr "損失目数の高精度表示(絶対値1以下の場合)" + #. analysis option msgid "cache analysis to sgf" msgstr "分析結果をSGFに保存" @@ -960,6 +964,25 @@ msgstr "AIの最善手との一致率" msgid "Entire Game" msgstr "全局" -#. TODO msgid "ai:antimirror" -msgstr "KataAntiMirror" +msgstr "Kataマネ碁破り" + +#. on move tree editing, deletes all other branches splitting off from +#. the path UP TO this node +msgid "Prune Branch" +msgstr "この枝だけ残して他を削除" + +msgid "aihelp:antimirror" +msgstr "KataGoの「マネ碁破りモード」" + +#. distance of wall to existing stones +msgid "tsumego:walldistance" +msgstr "壁までの距離" + +#. tsumego: ko is good enough? +msgid "tsumego:ko" +msgstr "劫でもOK" + +#. Menu option for tsumego frame around position +msgid "analysis:tsumegoframe" +msgstr "詰碁用の外枠" diff --git a/katrain/i18n/locales/ko/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/ko/LC_MESSAGES/katrain.mo index a81fc83db..9926e21b2 100644 Binary files a/katrain/i18n/locales/ko/LC_MESSAGES/katrain.mo and b/katrain/i18n/locales/ko/LC_MESSAGES/katrain.mo differ diff --git a/katrain/i18n/locales/ko/LC_MESSAGES/katrain.po b/katrain/i18n/locales/ko/LC_MESSAGES/katrain.po index 6734514f4..3424cd74f 100644 --- a/katrain/i18n/locales/ko/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/ko/LC_MESSAGES/katrain.po @@ -437,7 +437,7 @@ msgstr "KataGo 가중치 {model}이 존재하지 않습니다. 일반 설정을 msgid "Kata exe not found in path" msgstr "" -"KataGo 실행 파일 `{exe}`이 PATH에 없습니다. 환경 변수를 확인해 보시거나, 혹은 일반 설정에서 실행 파일의 절대경로를 " +"KataGo 실행 파일 '{exe}'이 PATH에 없습니다. 환경 변수를 확인해 보시거나, 혹은 일반 설정에서 실행 파일의 절대경로를 " "지정해 주십시오. MacOS를 사용하고 계시다면, 어떻게 brew를 이용해 KataGo를 설치하는지 설명서에서 확인하세요." msgid "Starting Kata failed" @@ -460,7 +460,7 @@ msgstr "KataGo" msgid "aihelp:default" msgstr "" -"최대 기력의 KataGo입니다. 기력은 일반 설정-엔진의 `max visits`와 `model` 및 엔진 설정 파일에 영향을 받습니다. " +"최대 기력의 KataGo입니다. 기력은 일반 설정-엔진의 'max visits'와 'model' 및 엔진 설정 파일에 영향을 받습니다. " "별도의 설정은 없습니다." msgid "ai:jigo" @@ -480,16 +480,16 @@ msgstr "정책망" msgid "aihelp:policy" msgstr "" -"수읽기를 하지 않고 정책망에서 가장 높은 확률의 수를 둡니다. 엔진 설정의 `model`이 기력에 영향을 줍니다. " -"`opening_moves` 설정에 따라 초반에 무작위적으로 두는 수가 늘어납니다." +"수읽기를 하지 않고 정책망에서 가장 높은 확률의 수를 둡니다. 엔진 설정의 'model'이 기력에 영향을 줍니다. " +"'opening_moves' 설정에 따라 초반에 무작위적으로 두는 수가 늘어납니다." msgid "ai:p:weighted" msgstr "정책망 확률에 따라" msgid "aihelp:p:weighted" msgstr "" -"정책망 확률에 따라 착수합니다. `weaken_fac`은 약한 수를 둘 확률을 증가시키며, 낮은 값일수록 `정책망` 인공지능과 비슷하게 " -"둡니다. `pick_override`는 언제 무작위성 없이 가장 확률이 높은 수를 둘지, `lower_bound`는 정책 확률의 하한값을" +"정책망 확률에 따라 착수합니다. 'weaken_fac'은 약한 수를 둘 확률을 증가시키며, 낮은 값일수록 '정책망' 인공지능과 비슷하게 " +"둡니다. 'pick_override'는 언제 무작위성 없이 가장 확률이 높은 수를 둘지, 'lower_bound'는 정책 확률의 하한값을" " 결정합니다." msgid "ai:p:pick" @@ -497,42 +497,42 @@ msgstr "구멍난 정책망" msgid "aihelp:p:pick" msgstr "" -"`pick_n + pick_frac * <착수 허용점>`개의 수를 무작위로 뽑아 그 중 최선의 수를 둡니다. `pick_frac=1`일 " -"때는 `정책망` 인공지능과 같이 둡니다. 지나치게 명백한 실수를 방지하기 위해 정책값이 가장 높은 수의 정책값이 " -"`pick_override`보다 높을 때는 그 수를 둡니다." +"'pick_n + pick_frac * <착수 허용점>'개의 수를 무작위로 뽑아 그 중 최선의 수를 둡니다. 'pick_frac=1'일 " +"때는 '정책망' 인공지능과 같이 둡니다. 지나치게 명백한 실수를 방지하기 위해 정책값이 가장 높은 수의 정책값이 " +"'pick_override'보다 높을 때는 그 수를 둡니다." msgid "ai:p:local" msgstr "손따라 두기" msgid "aihelp:p:local" msgstr "" -"마지막으로 둔 수 근처의 `pick_n + pick_frac * <착수 허용점>`개의 수를 뽑아 그 중 최선의 수를 둡니다. 지나치게 " -"명백한 실수를 방지하기 위해 정책값이 가장 높은 수의 정책값이 `pick_override`보다 높을 때는 그 수를 둡니다." +"마지막으로 둔 수 근처의 'pick_n + pick_frac * <착수 허용점>'개의 수를 뽑아 그 중 최선의 수를 둡니다. 지나치게 " +"명백한 실수를 방지하기 위해 정책값이 가장 높은 수의 정책값이 'pick_override'보다 높을 때는 그 수를 둡니다." msgid "ai:p:tenuki" msgstr "손빼며 두기" msgid "aihelp:p:tenuki" msgstr "" -"마지막으로 둔 수에서 먼 `pick_n + pick_frac * <착수 허용점>`개의 수를 뽑아 그 중 최선의 수를 둡니다. 지나치게 " -"명백한 실수를 방지하기 위해 정책값이 가장 높은 수의 정책값이 `pick_override`보다 높을 때는 그 수를 둡니다. " -"`stddev` 값이 크면 더 멀리 두게 됩니다." +"마지막으로 둔 수에서 먼 'pick_n + pick_frac * <착수 허용점>'개의 수를 뽑아 그 중 최선의 수를 둡니다. 지나치게 " +"명백한 실수를 방지하기 위해 정책값이 가장 높은 수의 정책값이 'pick_override'보다 높을 때는 그 수를 둡니다. " +"'stddev' 값이 크면 더 멀리 두게 됩니다." msgid "ai:p:influence" msgstr "세력지향" msgid "aihelp:p:influence" msgstr "" -"`threshold`선 위의 수를 더 많이 뽑은 후 그 중 최선의 수를 둡니다. `line_weight`을 증가시키면 판 가장자리에 있는" -" 수를 더욱 꺼리게 됩니다. 판이 `endgame` 비율만큼 차면 평범하게 둡니다." +"'threshold'선 위의 수를 더 많이 뽑은 후 그 중 최선의 수를 둡니다. 'line_weight'을 증가시키면 판 가장자리에 있는" +" 수를 더욱 꺼리게 됩니다. 판이 'endgame' 비율만큼 차면 평범하게 둡니다." msgid "ai:p:territory" msgstr "실리지향" msgid "aihelp:p:territory" msgstr "" -"`threshold`선 밑의 수를 더 많이 뽑은 후 그 중 최선의 수를 둡니다. `line_weight`을 증가시키면 바둑판 중앙에 있는" -" 수를 더욱 꺼리게 됩니다. 판이 `endgame` 비율만큼 차면 평범하게 둡니다." +"'threshold'선 밑의 수를 더 많이 뽑은 후 그 중 최선의 수를 둡니다. 'line_weight'을 증가시키면 바둑판 중앙에 있는" +" 수를 더욱 꺼리게 됩니다. 판이 'endgame' 비율만큼 차면 평범하게 둡니다." msgid "aihelp:p:rank" msgstr "" @@ -582,8 +582,8 @@ msgstr "접바둑 KataGo" msgid "aihelp:handicap" msgstr "" -"치석이 많은 접바둑에 더 적합한 KataGo입니다. `pda` 설정은 흑 시점에서 KataGo의 " -"`playoutDoublingAdvantage`에 해당합니다. `automatic`으로 설정하면, KaTrain이 알맞는 값을 자동으로 " +"치석이 많은 접바둑에 더 적합한 KataGo입니다. 'pda' 설정은 흑 시점에서 KataGo의 " +"'playoutDoublingAdvantage'에 해당합니다. 'automatic'으로 설정하면, KaTrain이 알맞는 값을 자동으로 " "설정할 것입니다." msgid "estimated strength" @@ -697,6 +697,9 @@ msgstr "집 변동" msgid "show stats if" msgstr "... visit 이상일 때만 정보 보이기" +msgid "show two digits for point loss near zero" +msgstr "Show two digits for point loss near zero" + #. analysis option msgid "cache analysis to sgf" msgstr "분석 결과 SGF 파일에 캐싱" @@ -899,6 +902,20 @@ msgstr "인공지능 최선수 일치율(%)" msgid "Entire Game" msgstr "모두" -#. TODO +msgid "Prune Branch" +msgstr "변화 잘라내기" + msgid "ai:antimirror" -msgstr "KataAntiMirror" +msgstr "흉내바둑 타파" + +msgid "aihelp:antimirror" +msgstr "흉내바둑을 타파하는 KataGo 모드입니다." + +msgid "tsumego:walldistance" +msgstr "벽까지의 거리" + +msgid "tsumego:ko" +msgstr "패로 충분?" + +msgid "analysis:tsumegoframe" +msgstr "묘수풀이 틀" diff --git a/katrain/i18n/locales/ru/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/ru/LC_MESSAGES/katrain.mo index 25d0f48d9..45ac6d260 100644 Binary files a/katrain/i18n/locales/ru/LC_MESSAGES/katrain.mo and b/katrain/i18n/locales/ru/LC_MESSAGES/katrain.mo differ diff --git a/katrain/i18n/locales/ru/LC_MESSAGES/katrain.po b/katrain/i18n/locales/ru/LC_MESSAGES/katrain.po index b8b19228f..ce3b10491 100644 --- a/katrain/i18n/locales/ru/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/ru/LC_MESSAGES/katrain.po @@ -457,7 +457,7 @@ msgstr "" msgid "Kata exe not found in path" msgstr "" -"Исполняемый файл KataGo `{exe}` не найден в PATH, проверьте переменные " +"Исполняемый файл KataGo '{exe}' не найден в PATH, проверьте переменные " "окружения или используйте полный путь в основных настройках. Для MacOS " "посмотрите сначала инструкцию по установке katago с использованием brew" @@ -489,7 +489,7 @@ msgstr "KataGo" msgid "aihelp:default" msgstr "" -"Полная сила ИИ KataGo. Сила зависит от настроек `max visits` и `model` в " +"Полная сила ИИ KataGo. Сила зависит от настроек 'max visits' и 'model' в " "общих настройках и файле конфигурации." msgid "ai:jigo" @@ -514,7 +514,7 @@ msgstr "Политика сети" msgid "aihelp:policy" msgstr "" "Играет лучший ход согласно политике сети, без просчёта вариантов. Сила в " -"основном зависит от `model` в настройках движка. Настройка `opening_moves` " +"основном зависит от 'model' в настройках движка. Настройка 'opening_moves' " "влияет на то, сколько начальных ходов будут более случайными." msgid "ai:p:weighted" @@ -522,10 +522,10 @@ msgstr "Слабая политика" msgid "aihelp:p:weighted" msgstr "" -"Делает ходы согласно вероятности политики сети, при этом `weaken_fac` влияет" +"Делает ходы согласно вероятности политики сети, при этом 'weaken_fac' влияет" " на то, как часто более слабые ходы будут сыграны. Малые значения играют " -"аналогично `Политика сети` ИИ. `pick_override` определяет когда лучший ход " -"будет выбран без случайности, и `lower_bound` определяет нижнюю границу " +"аналогично 'Политика сети' ИИ. 'pick_override' определяет когда лучший ход " +"будет выбран без случайности, и 'lower_bound' определяет нижнюю границу " "допустимого значения." msgid "ai:p:pick" @@ -533,9 +533,9 @@ msgstr "Слепая политика" msgid "aihelp:p:pick" msgstr "" -"Выбирает `pick_n + pick_frac * <количество допустимых ходов>` случайных " -"ходов и играет лучший из них. При `pick_frac=1` играет как `Политика сети` " -"ИИ. Играет лучший ход, если значение политики сети выше `pick_override` для " +"Выбирает 'pick_n + pick_frac * <количество допустимых ходов>' случайных " +"ходов и играет лучший из них. При 'pick_frac=1' играет как 'Политика сети' " +"ИИ. Играет лучший ход, если значение политики сети выше 'pick_override' для " "избежания очевидных ошибок." msgid "ai:p:local" @@ -543,27 +543,27 @@ msgstr "Локальный стиль" msgid "aihelp:p:local" msgstr "" -"Выбирает `pick_n + pick_frac * <количество допустимых ходов>` ходов в " +"Выбирает 'pick_n + pick_frac * <количество допустимых ходов>' ходов в " "окрестностях последнего хода и играет лучший из них. Играет лучший ход, если" -" значение политики сети выше `pick_override` для избежания очевидных ошибок." +" значение политики сети выше 'pick_override' для избежания очевидных ошибок." msgid "ai:p:tenuki" msgstr "Стиль тэнуки" msgid "aihelp:p:tenuki" msgstr "" -"Выбирает `pick_n + pick_frac * <количество допустимых ходов>` ходов вдалеке " +"Выбирает 'pick_n + pick_frac * <количество допустимых ходов>' ходов вдалеке " "от последнего хода и играет лучший из них. Играет лучший ход, если значение " -"политики сети выше `pick_override` для избежания очевидных ошибок. Более " -"высокое значение `stddev` заставляет ИИ играть более далеко." +"политики сети выше 'pick_override' для избежания очевидных ошибок. Более " +"высокое значение 'stddev' заставляет ИИ играть более далеко." msgid "ai:p:influence" msgstr "Влияние" msgid "aihelp:p:influence" msgstr "" -"Выбирает ходы с оценкой выше `threshold` и играет лучший из них. " -"Увеличивайте `line_weight` для штрафования ходов, близких к краю доски. " +"Выбирает ходы с оценкой выше 'threshold' и играет лучший из них. " +"Увеличивайте 'line_weight' для штрафования ходов, близких к краю доски. " "Прекращает такую стратегию после того, как 'endgame' часть доски была " "заполнена." @@ -572,8 +572,8 @@ msgstr "Территория" msgid "aihelp:p:territory" msgstr "" -"Выбирает ходы с оценкой выше `threshold` и играет лучший из них. " -"Увеличивайте `line_weight` для штрафования ходов, близких к центру доски. " +"Выбирает ходы с оценкой выше 'threshold' и играет лучший из них. " +"Увеличивайте 'line_weight' для штрафования ходов, близких к центру доски. " "Прекращает такую стратегию после того, как 'endgame' часть доски была " "заполнена." @@ -612,9 +612,9 @@ msgstr "KataHandicap" msgid "aihelp:handicap" msgstr "" -"KataGo оптимизированный под игры с большой форой. Настройка `pda` " -"соответствует `playoutDoublingAdvantage` в KataGo, с точки зрения чёрных. " -"При установке `automatic`, KaTrain выберет значение автоматически." +"KataGo оптимизированный под игры с большой форой. Настройка 'pda' " +"соответствует 'playoutDoublingAdvantage' в KataGo, с точки зрения чёрных. " +"При установке 'automatic', KaTrain выберет значение автоматически." msgid "estimated strength" msgstr "Оценка силы" @@ -722,6 +722,10 @@ msgstr "Изменение счёта" msgid "show stats if" msgstr "Числа только если посещений больше чем" +#. TODO - point loss precision options +msgid "show two digits for point loss near zero" +msgstr "Show two digits for point loss near zero" + msgid "cache analysis to sgf" msgstr "Кэшировать анализ в SGF" @@ -928,3 +932,25 @@ msgstr "Полная игра" #. TODO msgid "ai:antimirror" msgstr "KataAntiMirror" + +#. TODO - on move tree editing, deletes all other branches splitting off from +#. the +#. path UP TO this node +msgid "Prune Branch" +msgstr "Prune Branch" + +#. TODO +msgid "aihelp:antimirror" +msgstr "Anti Mirror-go Mode of KataGo." + +#. TODO - distance of wall to existing stones +msgid "tsumego:walldistance" +msgstr "Distance of wall" + +#. TODO - tsumego: ko is good enough? +msgid "tsumego:ko" +msgstr "Ko allowed?" + +#. TODO - Menu option for tsumego frame around position +msgid "analysis:tsumegoframe" +msgstr "Tsumego Frame" diff --git a/katrain/i18n/locales/tr/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/tr/LC_MESSAGES/katrain.mo new file mode 100644 index 000000000..4db22074c Binary files /dev/null and b/katrain/i18n/locales/tr/LC_MESSAGES/katrain.mo differ diff --git a/katrain/i18n/locales/tr/LC_MESSAGES/katrain.po b/katrain/i18n/locales/tr/LC_MESSAGES/katrain.po new file mode 100644 index 000000000..c6a1eae10 --- /dev/null +++ b/katrain/i18n/locales/tr/LC_MESSAGES/katrain.po @@ -0,0 +1,1051 @@ +# KaTrain localization file +msgid "" +msgstr "" +"Language: Turkish\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#. main hamburger menu +msgid "menu:playersetup" +msgstr "Oyuncu Ayarları" + +msgid "menu:newgame" +msgstr "Yeni Oyun/Kuralları Değiştir" + +msgid "menu:save" +msgstr "Oyunu Kaydet" + +msgid "menu:save-as" +msgstr "Oyunu Farklı Kaydet..." + +msgid "menu:load" +msgstr "Oyun Yükle" + +msgid "menu:settings" +msgstr "Genel ve Motor Ayarları" + +msgid "menu:clocksettings" +msgstr "Saat Ayarları" + +msgid "menu:teachsettings" +msgstr "Eğitim/Analiz Ayarları" + +msgid "menu:aisettings" +msgstr "AI Ayarları" + +msgid "menu:lang" +msgstr "Dil" + +msgid "menu:support" +msgstr "Katkı" + +msgid "menu:manual" +msgstr "Kılavuz (EN)" + +#. player options in the setup and on the right +msgid "player:type" +msgstr "Oyuncu" + +msgid "player:human" +msgstr "İnsan" + +msgid "player:ai" +msgstr "AI" + +msgid "aistrategy" +msgstr "AI Stratejisi" + +msgid "gametype" +msgstr "Oyun Türü" + +msgid "game:normal" +msgstr "Normal Oyun" + +msgid "game:teach" +msgstr "Eğitici Oyun" + +#. buttons at the top - should all include a line break +msgid "analysis:nextmoves" +msgstr "" +"Sonraki\n" +"Hamleler" + +msgid "analysis:dots" +msgstr "" +"Renkli\n" +"Ölçek" + +msgid "analysis:topmoves" +msgstr "" +"En İyi\n" +"Hamleler" + +msgid "analysis:policy" +msgstr "" +"İlke\n" +"Hamleleri" + +msgid "analysis:territory" +msgstr "" +"Tahmini\n" +"Bölge" + +#. analysis menu items +msgid "analysis:extra" +msgstr "Derin analiz" + +msgid "analysis:equalize" +msgstr "Olası hamlelere ait ziyaretleri eşitle" + +msgid "analysis:sweep" +msgstr "Tüm hamleleri hızlıca analiz et" + +#. Analyze every node in the game more deeply +msgid "analysis:game" +msgstr "Tüm oyununun derin analizi" + +#. View a player performance report +msgid "analysis:report" +msgstr "Performans Raporu" + +#. game filter in performance report +msgid "Entire Game" +msgstr "Tüm Oyun" + +#. opening of the game filter in performance report +msgid "Opening" +msgstr "Açılış" + +#. middle of the game filter in performance report +msgid "Midgame" +msgstr "Oyun Ortası" + +#. end of the game filter in performance report +msgid "Endgame" +msgstr "Oyun Sonu" + +#. header in performance report +msgid "header:keystats" +msgstr "Temel İstatistikler" + +#. statistic in performance report +msgid "stat:accuracy" +msgstr "Doğruluk Derecesi" + +#. statistic in performance report +msgid "stat:meanpointloss" +msgstr "Ortalama Puan Kaybı" + +#. statistic in performance report +msgid "stat:aitopmove" +msgstr "AI En İyi Hamle Eşleşme Oranı" + +#. statistic in performance report +msgid "stat:aitop5" +msgstr "AI En İyi 5 Hamle Eşleşme Oranı" + +#. header in performance report +msgid "header:num moves" +msgstr "Hamle Sayısı" + +#. Analyze again but exclude all currently considered moves +msgid "analysis:alternatives" +msgstr "Alternatif hamleleri bul" + +#. Clear all results and reset to normal query +msgid "analysis:reset" +msgstr "Analizi sıfırla" + +#. Restrict analysis to a specific region +msgid "analysis:region" +msgstr "İlgi bölgesi ayarla" + +#. Status message +msgid "analysis:region:start" +msgstr "" +"İlgi bölgesi seçmek için sürükleyin. Bölgeyi iptal etmek için bir nokta " +"seçin." + +#. Menu option +msgid "analysis:playtoend" +msgstr "Oyun sonuna kadar hızlıca oyna" + +#. Keep improving current position analysis when there is nothing else to do +msgid "analysis:continuous" +msgstr "Sürekli analizi başlat/sonlandır" + +msgid "analysis:aimove" +msgstr "AI Hamlesi Yap" + +#. Option in dropdown to insert some moves between the current and next +msgid "analysis:insert" +msgstr "Hamle ekle" + +#. status message +msgid "extra analysis" +msgstr "{visits} ziyaret kadar ek analiz gerçekleştiriyor" + +#. status message +msgid "sweep analysis" +msgstr "" +"Hamle başına {visits} ziyaret olacak şekilde tüm tahtayı analiz ediyor" + +#. status message +msgid "alternative analysis" +msgstr "Alternatif hamleler arıyor" + +#. status message +msgid "local analysis" +msgstr "Yerel yanıtlar arıyor" + +#. status message +msgid "equalizing analysis" +msgstr "Aday hamlelerin analizini {visits} ziyarete eşitliyor" + +#. status message +msgid "game re-analysis" +msgstr "Tüm oyunu {visits} ziyaret kadar yeniden analiz ediyor" + +#. right panel buttons and below board +msgid "pass-button-text" +msgstr "Pas" + +#. resign the game +msgid "resign" +msgstr "Terk Et" + +#. Shown when a move is undone in teaching mode. +msgid "teaching undo message" +msgstr "" +"{points_lost:.1f} puan kaybettirdiğinden {move}. hamleyi geri alın. Lütfen " +"tekrar deneyin. İpucu için karşı analizi görmek amacıyla fare imlecini hamle" +" üzerine getirin veya puan kaybının beklendiği tahtabölgelerini görmek " +"amacıyla tahmini bölgeyi (t) kontrol edin." + +msgid "ai-ponder" +msgstr "" +"Bu işaret basitçe yeşil (boşta) renkten turuncu (sorguları işliyor) renge " +"değişerek Motor durumunu gösterir. Motor kilitlenirse ya da başlatılmazsa " +"kırmızı renkte yanar." + +#. undo button on the right +msgid "undo-button-text" +msgstr "Geri Al" + +#. tabs and labels on the right panel +msgid "tab:score" +msgstr "Puan" + +msgid "tab:winrate" +msgstr "Kazanma Oranı" + +#. shown on a graph tab +msgid "tab:rank_est" +msgstr "Seviye Tahmini" + +msgid "tab:points" +msgstr "Puan Kaybı" + +msgid "tab:info" +msgstr "Hamle Bilgisi" + +msgid "tab:info-details" +msgstr "Ayrıntılar" + +msgid "tab:notes" +msgstr "Notlar" + +msgid "closedlabel:scoregraph" +msgstr "Skor Grafiği" + +#. on the graph +msgid "Jigo" +msgstr "Jigo" + +msgid "closedlabel:movestats" +msgstr "Hamle İstatistikleri" + +msgid "closedlabel:info¬es" +msgstr "Hamle Bilgileri ve Notlar" + +#. on the board after passing once/twice +msgid "board-pass" +msgstr "pas" + +msgid "board-game-end" +msgstr "" +"oyun\n" +"sonu" + +#. Select mode +msgid "btn:Play" +msgstr "Oyna" + +msgid "btn:Analysis" +msgstr "Analiz" + +msgid "btn:Analyze" +msgstr "Analiz Seçenekleri" + +msgid "stats:winrate" +msgstr "Kazanma Oranı" + +msgid "stats:score" +msgstr "Tahmini Skor" + +msgid "stats:pointslost" +msgstr "Kaybedilen Puan" + +#. better than expected best move +msgid "stats:pointsgained" +msgstr "Kazanılan Puan" + +#. SGF and move comment messages +msgid "SGF start message" +msgstr "" +"'X' ile işaretlenen hamleler KataGo’ya göre en iyi hamleleri gösterir, " +"kareyle işaretlenenler 0,5 puandan daha az kaybettiren hamlelerdir" + +msgid "Info:score" +msgstr "Skor: {score}" + +msgid "Info:winrate" +msgstr "Kazanma oranı: {winrate}" + +msgid "Info:point loss" +msgstr "Tahmini puan kaybı: {points_lost:.1f}" + +#. as in 'Move 125: B5' +msgid "move" +msgstr "Hamle {number}" + +msgid "Info:top move" +msgstr "Ön görülen en iyi hamle: {top_move} ({score})." + +msgid "Info:best move" +msgstr "Bu hamle en iyi hamle olarak ön görüldü" + +msgid "Info:PV" +msgstr "Devam yolu: {pv}" + +msgid "Info:policy rank" +msgstr "Hamle AI ilkesine göre {rank}. sıradadır ({probability:.2%})." + +msgid "Info:policy best" +msgstr "En iyi AI ilkesi hamlesi: {move} ({probability:.1%})." + +msgid "Info:teaching undo" +msgstr "Hamle eğitim modunda otomatik olarak geri alındı." + +msgid "Info:undo predicted PV" +msgstr "Ön görülen devam yolu: {pv}" + +msgid "Info:AI thoughts" +msgstr "AI analiz süreci: {thoughts}" + +msgid "No analysis available" +msgstr "Analiz mevcut değil" + +msgid "Analyzing move..." +msgstr "Hamle analiz ediliyor..." + +msgid "SGF Notes Hint" +msgstr "Bu pozisyonla ilgili SGF notlarınızı yazın." + +# sgf load popup +msgid "load sgf title" +msgstr "Analiz Edilecek SGF Dosyasını Yükle" + +# sgf load button +msgid "Load File" +msgstr "Dosya Yükle" + +# sgf save as button +msgid "Save File" +msgstr "Dosyayı Kaydet" + +# sgf save popup +msgid "save sgf title" +msgstr "SGF Dosyasını Kaydet" + +msgid "load sgf fast analysis" +msgstr "Hızlı analizi kullan" + +msgid "load sgf rewind" +msgstr "İlk hamleye git" + +# timer settings from here +msgid "timer settings" +msgstr "Saat Ayarlarını Belirle" + +msgid "byoyomi length" +msgstr "Byo-yomi periyodu süresi (sn)" + +msgid "byoyomi periods" +msgstr "Periyot sayısı" + +msgid "count down sound" +msgstr "Ses açık" + +#. in minutes +msgid "main time" +msgstr "Ana süre (dak.)" + +#. ignore moves if timer is on and less than this is used +msgid "minimal time use" +msgstr "Byo-yomi için geçerli en kısa süre (sn)" + +msgid "move too fast" +msgstr "Hamle yapmadan önce en az {num} saniye düşün." + +#. submit button +msgid "update timer" +msgstr "Saati Güncelle" + +# new game settings from here +msgid "New Game title" +msgstr "Yeni Oyun Ayarla / Oyun Bilgisi ve Kuralları Düzenle" + +#. in new game options +msgid "player names" +msgstr "Oyuncu Adları" + +#. hint on player name input +msgid "black player name hint" +msgstr "Siyah oyuncu adı" + +#. hint on player name input +msgid "white player name hint" +msgstr "Beyaz oyuncu adı" + +msgid "board size" +msgstr "Tahta boyutu" + +msgid "handicap" +msgstr "Handikap" + +msgid "komi" +msgstr "Komi" + +msgid "ruleset" +msgstr "Kurallar" + +#. ruleset names +msgid "japanese" +msgstr "Japonya" + +msgid "chinese" +msgstr "Çin" + +msgid "korean" +msgstr "Kore" + +msgid "aga" +msgstr "AGA" + +msgid "tromp-taylor" +msgstr "Tromp-Taylor" + +msgid "new zealand" +msgstr "Yeni Zelanda" + +msgid "stone_scoring" +msgstr "Eski Çin" + +msgid "clear cache" +msgstr "Önbelleği temizle" + +#. clear cache help +msgid "avoids replaying" +msgstr "" +"Benzer oyunların\n" +"oynamasını önler" + +#. hints on new game +msgid "non square board hint" +msgstr "Kare olmayan tahtalar için x:y (ör. 19:9) formatını kullan" + +#. submit new game +msgid "newgame" +msgstr "Yeni Oyun Başlat" + +#. change komi etc in current game +msgid "editgame" +msgstr "Oyun Bilgisi Düzenle" + +#. generate position alongside starting new game +msgid "setupposition" +msgstr "Pozisyon Ayarla" + +# teacher settings from here +msgid "teacher settings" +msgstr "Eğitim/Analiz Ayarlarını Düzenle" + +msgid "point loss threshold" +msgstr "Puan kaybı eşiği" + +msgid "num undos" +msgstr "" +"Geri alma sayısı\n" +"(eğitici oyun)" + +msgid "dot color" +msgstr "Renk" + +msgid "show dots" +msgstr "Renkli Ölçek" + +msgid "save dots" +msgstr "SGF’ye Kaydet" + +msgid "show last n dots" +msgstr "Son <...> hamle için renkli ölçek" + +msgid "show ai dots" +msgstr "AI oyuncusu için renkli ölçeği/SGF açıklaması göster" + +#. analysis option +msgid "cache analysis to sgf" +msgstr "SGF’de önbellek analizi" + +#. submit button +msgid "update teacher" +msgstr "Geri Bildrm Ayarlrnı Güncelle" + +# main config settings +msgid "restarting engine" +msgstr "Ayarların Değişiminden Sonra Motoru Yeniden Başlatıyor." + +#. contribute settings popup +msgid "contribute settings title" +msgstr "KataGo Dağıtılmış Eğitimine Katkıda Bulun" + +#. title +msgid "contribute:viewer settings" +msgstr "Görüntüleyici Ayarları" + +#. title +msgid "contribute:login" +msgstr "Katagotraining.org için oturum açma bilgisi" + +#. description for input +msgid "contribute:maxgames" +msgstr "Eş Zamanlı Oyun Sayısı" + +#. hint for max games +msgid "contribute:maxgames:hint" +msgstr "" +"Orta seviye GPU’lar için yaklaşık 8 olan optimum numSearchThreads değerinize" +" eşittir. Yarım kalmış oyunların yüklenmemesi nedeniyle daha kısa işlem için" +" bu değeri biraz daha düşük ayarlayabilirsiniz." + +msgid "contribute:ownership" +msgstr "Bölge Sahipliği Etkinleştir" + +#. hint for ownership +msgid "contribute:ownership:hint" +msgstr "" +"Eğitim modunu biraz yavaşlatır, ancak bölge sahipliğinin " +"görselleştirilmesine izin verir." + +#. description +msgid "contribute:movespeed" +msgstr "Hamle hızı" + +#. hint for move speed +msgid "contribute:movespeed:hint" +msgstr "Saniye/hamle cinsinden hamle gecikme değeri" + +#. description +msgid "contribute:savesgf" +msgstr "SGF’leri Kaydet" + +#. hint for save +msgid "contribute:savesgf:hint" +msgstr "" +"./dist_sgf altında gösterilen bitmiş oyunlara ait SGF dosyalarını kaydet" + +msgid "contribute:username" +msgstr "Kullanıcı Adı" + +msgid "contribute:password" +msgstr "Şifre" + +msgid "contribute:register" +msgstr "Kaydol" + +msgid "contribute:start" +msgstr "Katkı Yapmaya Başla!" + +# title +msgid "general settings title" +msgstr "Genel ve Motor Ayarları" + +msgid "file not found" +msgstr "Dosya yolu yok" + +msgid "general settings" +msgstr "Genel Ayarlar" + +msgid "katago settings" +msgstr "KataGo ayarları" + +msgid "engine settings" +msgstr "Motor Ayarları" + +msgid "config file path" +msgstr "Tüm ayarlar şuraya kaydedilir:" + +msgid "engine:katago" +msgstr "KataGo yürütülebilir dosya yolu" + +msgid "engine:katago:hint" +msgstr "Dahil edilmiş yürütme dosyasını kullanmak için boş bırakın" + +msgid "engine:model" +msgstr "KataGo model dosyası yolu" + +msgid "engine:config" +msgstr "KataGo yapılandırma dosyası yolu" + +msgid "engine:altcommand" +msgstr "Motor Komutunu Geçersiz Kıl" + +msgid "engine:altcommand:hint" +msgstr "" +"Motoru başlatmak için kullanılan komut satırının tamamı. Diğer tüm model " +"ayarları yok sayılacaktır." + +msgid "engine:max_visits" +msgstr "Analizdeki maksimum ziyaret sayısı" + +msgid "engine:fast_visits" +msgstr "Hızlı analizdeki maksimum ziyaret sayısı" + +msgid "engine:max_time" +msgstr "Analiz için maksimum süre" + +msgid "engine:wide_root_noise" +msgstr "" +"Genişletilmiş kök etkisi (değerlendirilen hamle çeşitliliğini arttırır)" + +msgid "engine:wide_root_noise:hint" +msgstr "" +"Daha fazla olası hamle göstermek\n" +"için 0,02-0,1 arası bir değer kullanın" + +msgid "engine:time:hint" +msgstr "Saniye cinsinden süre" + +msgid "general:anim_pv_time" +msgstr "Varyasyon animasyonunda hamleler arasındaki süre" + +msgid "general:debug_level" +msgstr "Konsoldaki hata ayıklama düzeyi" + +msgid "general:debug_level:hint" +msgstr "Hataları bildirirken 1 olarak ayarla" + +msgid "update settings" +msgstr "Ayarları Güncelle" + +# ai settings from here +msgid "ai settings" +msgstr "Gelişmiş AI Ayarları" + +msgid "Select AI" +msgstr "Yapılandırılacak AI stratejisi seç" + +msgid "update ai settings" +msgstr "AI Ayarlarını Güncelle" + +#. misc errors and info messages +msgid "sgf written" +msgstr "Analiz içeren SGF {file_name} dosyasına kaydedildi" + +msgid "wait-before-extra-analysis" +msgstr "" +"Düzeltme talebinde bulunmadan önce ilk analizin tamamlanmasını bekleyin." + +msgid "Copied SGF to clipboard." +msgstr "SGF panoya kopyalandı." + +msgid "Failed to import from clipboard" +msgstr "" +"Oyun panodan içeri aktarılmadı: {error}\n" +"Pano içeriği: {contents}..." + +msgid "Failed to load SGF" +msgstr "SGF yüklenemedi: {error}" + +msgid "Kata exe not found" +msgstr "" +"KataGo ikili dosyası {exe} mevcut değil, lütfen genel ayarları kontrol edin." + +msgid "Kata exe not found in path" +msgstr "" +"KataGo ikili dosyası {exe}' YOLDA bulunamadı, ortam değişkenlerinizi kontrol" +" edin veya bunun yerine genel ayarlardaki tam yolu kullanın. MacOS " +"kullanıyorsanız, ilk önce katago’yu yüklemek için brew’in nasıl " +"kullanıldığını görmek amacıyla kılavuza bakın" + +msgid "Kata model not found" +msgstr "" +"KataGo modeli {model} mevcut değil, lütfen genel ayarları kontrol edin." + +msgid "Kata config not found" +msgstr "" +"KataGo yapılandırma dosyası {config} mevcut değil, lütfen genel ayarları " +"kontrol edin." + +msgid "Starting Kata failed" +msgstr "" +"'{command}' komutuyla KataGo’nun başlatılması {error} hatasıyla sonlandı." + +msgid "Engine died unexpectedly" +msgstr "Motor şu çıktıyı göndererek beklenmedik bir şekilde sonlandı: {error}" + +msgid "Engine missing DLL" +msgstr "" +"Eksik DLL nedeniyle KataGo başlatılamadı. Ayrıntılar için KataGo " +"belgelerindeki gereksinimlere bakın ya da ikili dosyayı tek başına " +"çalıştırmayı deneyin." + +#. popup title +msgid "engine recovery" +msgstr "KataGo kurulumu yardımı" + +msgid "engine died popup opening message" +msgstr "" +"KataGo Motoru başlatılamadı veya kilitlendi.\n" +"\n" +"Hata açıklaması: [color=#CC2222]{error_message}[/color]\n" +"\n" +"Hata kodu: [color=#CC2222]{code}[/color]." + +#. Link in tags should not be touched. +msgid "change engine suggestion" +msgstr "" +"İlk önce, KataGo sürümlerini indirmeyi deneyin ve {link} bağlantısındaki " +"farklı yürütme dosyalarını kullanmayı deneyin." + +#. Link in tags should not be touched (uses link_here msgid) +msgid "go to engine help page" +msgstr "" +"Sorun halen devam ediyorsa, güncel sorun giderme sayfası için {link} " +"bağlantısına gidin." + +#. as in "click here" to go to this page, +msgid "link_here" +msgstr "buraya tıklayın" + +#. AI names, help etc +msgid "strength:kyu" +msgstr "k" + +msgid "strength:dan" +msgstr "d" + +msgid "ai:default" +msgstr "KataGo" + +msgid "aihelp:default" +msgstr "" +"En üst seviye KataGo AI. Seviye, genel ayarlarda 'motor' bölümündeki 'maks " +"ziyaret' ve 'model' değeriyle ve motor yapılandırma dosyasıyl belirlenir. " +"Burada herhangi bir seçenek verilmez." + +#. ai which handles handicap games better +msgid "ai:handicap" +msgstr "KataHandikap" + +msgid "aihelp:handicap" +msgstr "" +"KataGo üst seviye handikap oyunları oynamak için optimize edilmiştir. 'pda' " +"ayarı KataGo’da 'playoutDoublingAdvantage' ayarına karşılık gelir. " +"'automatic' işaretlendiğinde, KaTrain uygun bir değeri otomatik olarak " +"bulacaktır." + +msgid "ai:simple" +msgstr "Basit Stil" + +msgid "aihelp:simple" +msgstr "" +"Tahta konumunu basitleştiren hamleler yapar. Bu hamlelerle en fazla " +"'max_points_lost' puan kaybedilir ve en az 'min_visits’ ziyaret yapılır, " +"daha az puan kaybettiren hamle tercih edilir, kendi bölgesine daha fazla " +"odaklanır (settled_weight önem derecesine bağlı olarak), rakibin bölgesine " +"daha fazla odaklanır (settled_weight * opponent_fac önem derecesine bağlı " +"olarak), tenuki hamlesinden kaçınır (5 boşluktan daha fazlası, " +"tenuki_penalty önem derecesine bağlı olarak) ve bitişik hamlelerden kaçınır " +"(attachment_penalty önem derecesine bağlı olarak). Aynı zamanda oyunu " +"güçleştirmek için ağırlıklar negatif olabilir ve genişletilmiş kök etkisi " +"(genel ayarlardaki) seviyeden ödün verilerek bu stile daha çok odaklanılması" +" için kullanılabilir." + +msgid "ai:antimirror" +msgstr "KataAntiSimetri" + +msgid "aihelp:antimirror" +msgstr "KataGo'nun Simetri Karşıtı Go Modu" + +msgid "ai:jigo" +msgstr "KataJigo" + +msgid "aihelp:jigo" +msgstr "" +"Ek sınırlama olmaksızın belirli bir miktarda puan (varsayılan 0,5) farkla " +"kazanmayı deneyecektir." + +msgid "ai:scoreloss" +msgstr "Puan Kaybı" + +msgid "aihelp:scoreloss" +msgstr "" +"Daha düşük olasılığa sahip daha yüksek puan kaybına neden olacak hamleler " +"oynar. Daha yüksek ziyaret ayarlarıyla çok çeşitli/daha düşük seviyede hamle" +" yapacaktır." + +msgid "ai:policy" +msgstr "İlke" + +msgid "aihelp:policy" +msgstr "" +"Herhangi derin analiz olmadan ilke ağına göre en iyi hamleyi oynar. Seviye, " +"daha çok motor ayarlarındaki 'model' değeriyle belirlenir. 'opening_moves' " +"ayarı açılışta kaç tane hamlenin rastgele yapılacağına etki eder." + +msgid "ai:p:weighted" +msgstr "İlke Ağırlıklı" + +msgid "aihelp:p:weighted" +msgstr "" +"Daha zayıf hamlelerin oynanma olasılığına etki eden 'weaken_fac' değerine " +"bağlı olarak ilke olasılığına göre hamle yapar. Çok düşük değer durumunda " +"'İlke' AI’sı gibi oynar. 'pick_override' rastlantısallık olmadan en iyi " +"hamlenin ne zaman seçileceğini belirler ve 'lower_bound' izin verilen alt " +"sınır ilkesi değerini belirler." + +msgid "ai:p:pick" +msgstr "Zayıf İlke" + +msgid "aihelp:p:pick" +msgstr "" +"Rastgele 'pick_n + pick_frac * ' değeri kadar hamle " +"seçer ve en iyi hamleyi oynar. 'pick_frac=1' ise 'İlke' AI’sı gibi oynar. " +"Bariz hatalardan kaçınmak için ilke değeri 'pick_override' değerinin " +"üzerindeyse en iyi hamleyi oynar." + +msgid "ai:p:local" +msgstr "Yerel Stil" + +msgid "aihelp:p:local" +msgstr "" +"En son hamleye kadar ağırlıklandırılmış 'pick_n + pick_frac * ' değeri kadar hamle seçer ve en iyi hamleyi oynar. Bariz " +"hatalardan kaçınmak için ilke değeri 'pick_override' değerinin üzerindeyse " +"en iyi hamleyi oynar." + +msgid "ai:p:tenuki" +msgstr "Tenuki Stili" + +msgid "aihelp:p:tenuki" +msgstr "" +"En son hamle sonrasında ağırlıklandırılmış 'pick_n + pick_frac * ' kadar hamle seçer ve en iyi hamleyi oynar. Bariz hatalardan " +"kaçınmak için ilke değeri 'pick_override' değerinin üzerindeyse en iyi " +"hamleyi oynar. Daha yüksek 'stddev' değeri en son hamleden daha fazla " +"sapmaya neden olur." + +msgid "ai:p:influence" +msgstr "Yüksek Stil" + +msgid "aihelp:p:influence" +msgstr "" +"'Eşik değeri' hattının üstünde kalan hamleleri seçer ve en iyi hamleyi " +"oynar. Tahta kenarına daha yakın hamleleri geri plana almak için " +"'line_weight' değerini arttırın. Tahtada 'oyun sonu’ bölümü tamamlandığından" +" stratejiyi durdurur." + +msgid "ai:p:territory" +msgstr "Alçak Stil" + +msgid "aihelp:p:territory" +msgstr "" +"'Eşik değeri' hattının altında kalan hamleleri seçer ve en iyi hamleyi " +"oynar. Merkeze daha yakın hamleleri geri plana almak için 'line_weight' " +"değerini arttırın. Tahtada 'oyun sonu’ bölümü tamamlandığından stratejiyi " +"durdurur." + +msgid "ai:p:rank" +msgstr "Ayarlı Seviye" + +msgid "aihelp:p:rank" +msgstr "" +"Rastgele sınırlı sayıda geçerli hamle seçer ve en iyi hamleyi oynar. Daha " +"yüksek seviye ayarları, daha geniş bir seçimden en iyi hamleyi seçer. 0 " +"kyu/dan eşitliği mümkün olmadığından, 3 dan = -2 kyu’dur." + +#. in AI settings +msgid "estimated strength" +msgstr "Tahmini Seviye" + +#. button in general settings for downloading models +msgid "download models button" +msgstr "Modelleri İndir" + +#. button in general settings for downloading katago executables +msgid "download katago button" +msgstr "KataGo sürümlerini indir" + +#. shown on on the model select dropdown +msgid "models available" +msgstr "Mevcut {num} model bulundu" + +#. shown on on the katago binary select dropdown +msgid "default katago option" +msgstr "Platformu tespit et ve verilen OpenCL KataGo ikili dosyasını kullan" + +#. shown on on the binaries select dropdown +msgid "katago binaries available" +msgstr "Mevcut {num} katago sürümü bulundu" + +#. error message on trying to download models when already done +msgid "All models downloaded" +msgstr "Mevcut tüm modeller zaten indirildi" + +#. error message on trying to download models when already done +msgid "All binaries downloaded" +msgstr "Mevcut tüm iki dosyalar önceden indirildi" + +#. label in little popup for analyzing entire game +msgid "reanalyze max visits" +msgstr "Hamle başına ziyaret sayısı" + +#. label in little popup for analyzing entire game +msgid "reanalyze mistakes only" +msgstr "Yalnızca hatalı hamle analizi yap" + +#. on move tree editing +msgid "Delete Node" +msgstr "Düğümü Sil" + +#. on move tree editing +msgid "Toggle Collapse Branch" +msgstr "Genişlet/Daralt" + +#. on move tree editing +msgid "Make Main Branch" +msgstr "Ana Varyasyon Yap" + +#. theme label +msgid "theme" +msgstr "Renk Teması" + +#. theme name +msgid "theme:normal" +msgstr "Varsayılan Tema" + +#. theme name +msgid "theme:red-green-colourblind" +msgstr "Kırmızı-Yeşil Renk Körü" + +#. setting: what to show on top move (e.g. point loss, visits, ...) +msgid "stats on top move" +msgstr "En iyi hamle istatistikleri" + +#. Dropdown menu option +msgid "top_move_delta_score" +msgstr "Skor değişimi" + +#. Dropdown menu option +msgid "top_move_score" +msgstr "Skor" + +#. Dropdown menu option +msgid "top_move_delta_winrate" +msgstr "Kaz. oranı değişimi" + +#. Dropdown menu option +msgid "top_move_winrate" +msgstr "Kazanma oranı" + +#. Dropdown menu option +msgid "top_move_visits" +msgstr "Ziyaret" + +#. Dropdown menu option +msgid "top_move_nothing" +msgstr "(yok)" + +#. top move stats show threshold description +msgid "show stats if" +msgstr "... ziyaretten daha fazlası yapıldıysa istatistikleri göster" + +#. status message on starting insert mode +msgid "starting insert mode" +msgstr "" +"Ekleme modu başlatılıyor, Ekleme modundan çıkmak için 'i' tuşuna basın." + +#. status message on ending insert mode and copying the moves +msgid "ending insert mode" +msgstr "Hamlelerin eklenmesi bitti, takip eden {num_copied} hamle kopyalandı." + +#. when a user tries to go to a different move/node while in insert mode +msgid "finish inserting before navigating" +msgstr "" +"Ekleme modununda navigasyon devre dışı bırakıldı, 'i’ tuşuna basarak ekleme " +"modunu sonlandırın." + +#. menu item +msgid "menu:distributed" +msgstr "Dağıtılmış Öz Oyun Eğitimi" + +#. in self-play mode +msgid "gui-locked" +msgstr "" +"Dağıtılmış kendi kendine oyun eğitimi modunda {action} eylemine izin " +"verilmez.Bu moddan çıkmak için KaTrain’i yeniden başlatın." + +#. Progress message +msgid "setup game status message" +msgstr "" +"AI öz oyun özelliğiyle oyun üretiyor: {move}/{until_move} hamle yapıldı." + +#. Popup for generating position: top explanation +msgid "setup position explanation" +msgstr "" +"Devam edebileceğiniz yarım kalmış bir oyun üretir. Örneğin, çeşitli oyun " +"ortası veya oyun sonu pozisyonlarından başlayıp daha yüksek seviye yapay " +"zekaya karşı avantajlı olduğunuz oyunlar oynamak için bu özelliği " +"kullanabilirsiniz." + +#. Description for black target score +msgid "setup position black score" +msgstr "Siyah için hedef puan:" + +#. Description for how many moves +msgid "setup position move number" +msgstr "Şu hamleye kadar oyun üret:" + +#. on move tree editing, deletes all other branches splitting off from the +#. path UP TO this node +msgid "Prune Branch" +msgstr "Varyasyonu Buda" + +#. distance of wall to existing stones +msgid "tsumego:walldistance" +msgstr "Duvar mesafesi" + +#. tsumego: ko is good enough? +msgid "tsumego:ko" +msgstr "Ko'ya izin veriliyor mu?" + +#. Menu option for tsumego frame around position +msgid "analysis:tsumegoframe" +msgstr "Tsumego Çerçevesi" + +#. TODO - point loss precision options +msgid "show two digits for point loss near zero" +msgstr "Show two digits for point loss near zero" diff --git a/katrain/i18n/locales/tw/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/tw/LC_MESSAGES/katrain.mo index 801b4effa..e124d13c6 100644 Binary files a/katrain/i18n/locales/tw/LC_MESSAGES/katrain.mo and b/katrain/i18n/locales/tw/LC_MESSAGES/katrain.mo differ diff --git a/katrain/i18n/locales/tw/LC_MESSAGES/katrain.po b/katrain/i18n/locales/tw/LC_MESSAGES/katrain.po index 4c4464f87..d8664bd46 100644 --- a/katrain/i18n/locales/tw/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/tw/LC_MESSAGES/katrain.po @@ -428,6 +428,10 @@ msgstr "顯示最後幾手棋的選點" msgid "show ai dots" msgstr "顯示AI的選點/SGF評論" +#. TODO - point loss precision options +msgid "show two digits for point loss near zero" +msgstr "Show two digits for point loss near zero" + #. analysis option msgid "cache analysis to sgf" msgstr "儲存分析到SGF中" @@ -542,7 +546,7 @@ msgstr "KataGo執行檔 {exe} 不存在,請檢查一般設定。" msgid "Kata exe not found in path" msgstr "" -"在 PATH 中找不到KataGo執行檔 `{exe}`,請檢查環境變數或在一般設定中使用完整路徑代替。若是在 MacOS " +"在 PATH 中找不到KataGo執行檔 '{exe}',請檢查環境變數或在一般設定中使用完整路徑代替。若是在 MacOS " "上,請先閱讀使用手冊中的如何使用brew安裝KataGo。" msgid "Kata model not found" @@ -572,7 +576,7 @@ msgstr "KataGo" msgid "aihelp:default" msgstr "" -"最強的KataGo AI。其棋力由在一般設定中 `引擎` 區塊中的 `最大走訪數` 和 `模型` 以及引擎組態文件決定。此處沒有可供調整的選項。" +"最強的KataGo AI。其棋力由在一般設定中 '引擎' 區塊中的 '最大走訪數' 和 '模型' 以及引擎組態文件決定。此處沒有可供調整的選項。" #. ai which handles handicap games better msgid "ai:handicap" @@ -580,8 +584,8 @@ msgstr "Kata讓子棋" msgid "aihelp:handicap" msgstr "" -"KataGo 對讓子棋做了最佳化的對局版本。以黑棋的觀點來看,KataGo 中的 `pda` 設定對應到的是 " -"`playoutDoublingAdvantage`。當被設定為 `自動` 時,KaTrain 將會找自動找到適合的值。" +"KataGo 對讓子棋做了最佳化的對局版本。以黑棋的觀點來看,KataGo 中的 'pda' 設定對應到的是 " +"'playoutDoublingAdvantage'。當被設定為 '自動' 時,KaTrain 將會找自動找到適合的值。" msgid "ai:simple" msgstr "單純模式" @@ -609,46 +613,46 @@ msgid "ai:policy" msgstr "直覺" msgid "aihelp:policy" -msgstr "按最佳直覺行棋,沒有任何計算。棋力主要由引擎設定中的 `模型` 決定。布局落點設定影響布局中隨機落點的數量。" +msgstr "按最佳直覺行棋,沒有任何計算。棋力主要由引擎設定中的 '模型' 決定。布局落點設定影響布局中隨機落點的數量。" msgid "ai:p:weighted" msgstr "直覺權重" msgid "aihelp:p:weighted" msgstr "" -"按直覺機率行棋, `weaken_fac` 影響較弱選點的多寡。當機率極低時,它的下棋風格變得很像直覺AI。 `pick_override` " -"決定在選擇最佳選點時的無隨機性;而 `lower_bound` 決定了允許的直覺值的下限。" +"按直覺機率行棋, 'weaken_fac' 影響較弱選點的多寡。當機率極低時,它的下棋風格變得很像直覺AI。 'pick_override' " +"決定在選擇最佳選點時的無隨機性;而 'lower_bound' 決定了允許的直覺值的下限。" msgid "ai:p:pick" msgstr "盲選直覺" msgid "aihelp:p:pick" msgstr "" -"隨機選擇 `pick_n + pick_frac * ` 並採用最佳的一手。 當 " -"`pick_frac=1` 時,下棋風格像是直覺AI。 如果直覺值高於 `pick_override`,則採用最佳的一手以避免明顯錯誤。" +"隨機選擇 'pick_n + pick_frac * ' 並採用最佳的一手。 當 " +"'pick_frac=1' 時,下棋風格像是直覺AI。 如果直覺值高於 'pick_override',則採用最佳的一手以避免明顯錯誤。" msgid "ai:p:local" msgstr "局部模式" msgid "aihelp:p:local" msgstr "" -"使加權 `pick_n + pick_frac * ` 接近最後一手並選出最好的一手。如果直覺值大於 " -"`pick_override`則採用最佳的一手以避免明顯錯誤。" +"使加權 'pick_n + pick_frac * ' 接近最後一手並選出最好的一手。如果直覺值大於 " +"'pick_override'則採用最佳的一手以避免明顯錯誤。" msgid "ai:p:tenuki" msgstr "脫先模式" msgid "aihelp:p:tenuki" msgstr "" -"使加權 `pick_n + pick_frac * ` 遠離最後一手並選出最好的一手。如果直覺值大於 " -"`pick_override` 則採用最佳的一手以避免明顯錯誤。更高的 `stddev` 使其偏離更多。" +"使加權 'pick_n + pick_frac * ' 遠離最後一手並選出最好的一手。如果直覺值大於 " +"'pick_override' 則採用最佳的一手以避免明顯錯誤。更高的 'stddev' 使其偏離更多。" msgid "ai:p:influence" msgstr "取勢模式" msgid "aihelp:p:influence" msgstr "" -"在偏移值高於 `threshold` 線的點中選出最好的一手。增加 `line_weight` 以加重對靠近邊緣選點的懲罰。在 '終局' " +"在偏移值高於 'threshold' 線的點中選出最好的一手。增加 'line_weight' 以加重對靠近邊緣選點的懲罰。在 '終局' " "部分結束後停止。" msgid "ai:p:territory" @@ -656,7 +660,7 @@ msgstr "取地模式" msgid "aihelp:p:territory" msgstr "" -"在偏移值低於 `threshold` 線的點中選出最好的一手。增加 `line_weight` 以加重對靠近中央選點的懲罰。在 '終局' " +"在偏移值低於 'threshold' 線的點中選出最好的一手。增加 'line_weight' 以加重對靠近中央選點的懲罰。在 '終局' " "部分結束後停止。" msgid "ai:p:rank" @@ -942,6 +946,25 @@ msgstr "AI最佳選點重合度 %" msgid "Entire Game" msgstr "全局" -#. TODO msgid "ai:antimirror" -msgstr "KataAntiMirror" +msgstr "Kata反鏡射" + +#. on move tree editing, deletes all other branches splitting off from +#. the path UP TO this node +msgid "Prune Branch" +msgstr "修剪分支" + +msgid "aihelp:antimirror" +msgstr "KataGo的反鏡射模式。" + +#. distance of wall to existing stones +msgid "tsumego:walldistance" +msgstr "邊界距離" + +#. tsumego: ko is good enough? +msgid "tsumego:ko" +msgstr "允許打劫?" + +#. Menu option for tsumego frame around position +msgid "analysis:tsumegoframe" +msgstr "詰碁框" diff --git a/katrain/img/Deeper all.png b/katrain/img/Deeper all.png new file mode 100644 index 000000000..082aae1a4 Binary files /dev/null and b/katrain/img/Deeper all.png differ diff --git a/katrain/img/Prune.png b/katrain/img/Prune.png new file mode 100644 index 000000000..79228c61c Binary files /dev/null and b/katrain/img/Prune.png differ diff --git a/katrain/img/flags/flag-tr.png b/katrain/img/flags/flag-tr.png new file mode 100644 index 000000000..2b6e4e5c3 Binary files /dev/null and b/katrain/img/flags/flag-tr.png differ diff --git a/katrain/popups.kv b/katrain/popups.kv index 4bf48e031..4eb7a529e 100644 --- a/katrain/popups.kv +++ b/katrain/popups.kv @@ -493,6 +493,12 @@ AnchorLayout: LabelledCheckBox: input_property: "trainer/eval_show_ai" + DescriptionLabel: + font_size: sp(Theme.DESC_FONT_SIZE) * 0.8 + text: i18n._("show two digits for point loss near zero") + AnchorLayout: + LabelledCheckBox: + input_property: "trainer/extra_precision" DescriptionLabel: font_size: sp(Theme.DESC_FONT_SIZE) * 0.8 text: i18n._("cache analysis to sgf") @@ -837,6 +843,39 @@ root.katrain("analyze-extra", "game", visits=visits.input_value, mistakes_only=mistakes.input_value) root.popup.dismiss() +: + ko: ko + margin: margin + orientation: 'vertical' + button: button + BoxLayout: + size_hint: 1, 1.5 + orientation: 'horizontal' + DescriptionLabel: + text: i18n._('tsumego:walldistance') + AnchorLayout: + LabelledIntInput: + id: margin + text: '4' + BoxLayout: + size_hint: 1, 1.5 + orientation: 'horizontal' + DescriptionLabel: + text: i18n._('tsumego:ko') + AnchorLayout: + LabelledCheckBox: + id: ko + AnchorLayout: + size_hint: 1, 1 + AutoSizedRoundedRectangleButton: + id: button + padding_x: 15 + size_hint: None,0.66 + text: i18n._("analysis:tsumegoframe") # re-use string + on_press: + root.katrain("tsumego-frame", ko=ko.input_value, margin=margin.input_value) + root.popup.dismiss() + : fast: fast rewind: rewind @@ -929,4 +968,4 @@ alignment: 'left' BoxLayout: id: stats - size_hint_y: 10 \ No newline at end of file + size_hint_y: 10 diff --git a/requirements.txt b/requirements.txt index cd95b38e1..0a69d6c23 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,10 +3,10 @@ chardet==3.0.4 docutils==0.16 ffpyplayer==4.3.2 idna==2.10 -Kivy==2.0.0 +Kivy==2.1.0 Kivy-Garden==0.1.4 kivymd==0.104.1 -Pillow==9.0.0 +Pillow==9.0.1 Pygments==2.7.4 requests==2.25.0 urllib3==1.26.5 \ No newline at end of file diff --git a/setup.py b/setup.py index 56fc6f00d..cca2f5cbc 100644 --- a/setup.py +++ b/setup.py @@ -41,17 +41,16 @@ def include_data_files(directory): install_requires=[ "wheel", "setuptools", - "kivy[full]>=2.0.0", + "kivy[full]>=2.1.0", "kivymd==0.104.1", # 0.104.2 was breaking MRO "ffpyplayer", - "importlib_resources ;python_version<'3.7'", "urllib3", "pygame;platform_system=='Darwin'", # some mac versions need this for kivy "screeninfo;platform_system!='Darwin'", # for screen resolution, has problems on macos "chardet", # for automatic encoding detection ], dependency_links=["https://kivy.org/downloads/simple/"], - python_requires=">=3.6, <4", + python_requires=">=3.7, <3.10", entry_points={"console_scripts": ["katrain=katrain.__main__:run_app"]}, classifiers=[ "Development Status :: 5 - Production/Stable",