This commit is contained in:
Sander Land committed 2020-05-30 13:30:51 +02:00
1 parent 22ea8604ca
commit 2d20196dda
15 files changed
+1177 -38

No files matched your search

+3 -3
View File
@@ -108,15 +108,16 @@ def get_drives():
return drives return drives
class I18NFileChooserListView(FileChooserListView): class I18NFileChooserListView(FileChooserListView):
font_name = StringProperty("") font_name = StringProperty("")
class I18NFileChooserListLayout(FileChooserListLayout): class I18NFileChooserListLayout(FileChooserListLayout):
_ENTRY_TEMPLATE = "I18NFileListEntry" _ENTRY_TEMPLATE = "I18NFileListEntry"
Builder.load_string(""" Builder.load_string(
"""
#:kivy 1.0 #:kivy 1.0
[I18NFileListEntry@FloatLayout+TreeViewNode]: [I18NFileListEntry@FloatLayout+TreeViewNode]:
locked: False locked: False
@@ -156,7 +157,6 @@ Builder.load_string("""
) )
Builder.load_string( Builder.load_string(
""" """
#:kivy 1.2.0 #:kivy 1.2.0
+5 -1
View File
@@ -1,6 +1,7 @@
import os import os
import polib import polib
import sys import sys
import re
from collections import defaultdict from collections import defaultdict
localedir = "katrain/i18n/locales" localedir = "katrain/i18n/locales"
@@ -34,7 +35,10 @@ for lang in locales:
errors = True errors = True
elif DEFAULT_LANG in strings_to_langs[msgid]: elif DEFAULT_LANG in strings_to_langs[msgid]:
print("Message id", msgid, "missing in ", lang, "-> Adding it from", DEFAULT_LANG) print("Message id", msgid, "missing in ", lang, "-> Adding it from", DEFAULT_LANG)
entry = polib.POEntry(msgid=msgid, msgstr=strings_to_langs[msgid][DEFAULT_LANG], comment="TODO") copied_msg = strings_to_langs[msgid][DEFAULT_LANG]
if lang == "haha":
copied_msg = re.sub(r"[a-zA-Z]{1,2}", "ㅋ", copied_msg)
entry = polib.POEntry(msgid=msgid, msgstr=copied_msg, comment="TODO")
po[lang].append(entry) po[lang].append(entry)
errors = True errors = True
else: else:
+7 -4
View File
@@ -33,6 +33,7 @@ from katrain.core.game import Game, IllegalMoveException, KaTrainSGF
from katrain.core.sgf_parser import Move, ParseError from katrain.core.sgf_parser import Move, ParseError
from katrain.gui.kivyutils import * from katrain.gui.kivyutils import *
from katrain.gui.widgets.graph import ScoreGraph from katrain.gui.widgets.graph import ScoreGraph
from katrain.gui.widgets.filebrowser import I18NFileChooserListView
from katrain.gui.badukpan import AnalysisControls, BadukPanControls, BadukPanWidget from katrain.gui.badukpan import AnalysisControls, BadukPanControls, BadukPanWidget
from katrain.gui.controlspanel import ControlsPanel from katrain.gui.controlspanel import ControlsPanel
from katrain.gui.popups import ConfigPopup, LoadSGFPopup, NewGamePopup, AIPopup from katrain.gui.popups import ConfigPopup, LoadSGFPopup, NewGamePopup, AIPopup
@@ -246,10 +247,9 @@ class KaTrainGui(Screen, KaTrainBase):
def _do_analyze_sgf_popup(self): def _do_analyze_sgf_popup(self):
if not self.fileselect_popup: if not self.fileselect_popup:
self.fileselect_popup = Popup(title="Double Click SGF file to analyze", size_hint=(0.8, 0.8)).__self__
popup_contents = LoadSGFPopup() popup_contents = LoadSGFPopup()
self.fileselect_popup.add_widget(popup_contents) popup_contents.filesel.path = os.path.abspath(os.path.expanduser(self.config("general/sgf_load", ".")))
popup_contents.filesel.path = os.path.abspath(os.path.expanduser(self.config("sgf/sgf_load"))) self.fileselect_popup = I18NPopup(title_key="load sgf title", size=[1200, 800], content=popup_contents).__self__
def readfile(files, _mouse): def readfile(files, _mouse):
self.fileselect_popup.dismiss() self.fileselect_popup.dismiss()
@@ -323,7 +323,8 @@ class KaTrainGui(Screen, KaTrainBase):
def _on_keyboard_down(self, _keyboard, keycode, _text, modifiers): def _on_keyboard_down(self, _keyboard, keycode, _text, modifiers):
if self.controls.note.focus: if self.controls.note.focus:
return # when making notes, don't allow keyboard shortcuts return # when making notes, don't allow keyboard shortcuts
first_child = App.get_running_app().root_window.children[0] app = App.get_running_app()
first_child = app.root_window.children[0]
if isinstance(first_child, Popup): if isinstance(first_child, Popup):
if keycode[1] not in ["f5", "f6", "f7", "f8"]: if keycode[1] not in ["f5", "f6", "f7", "f8"]:
return return
@@ -352,6 +353,8 @@ class KaTrainGui(Screen, KaTrainBase):
self("new-game-popup") self("new-game-popup")
elif keycode[1] == "l" and "ctrl" in modifiers: elif keycode[1] == "l" and "ctrl" in modifiers:
self("analyze-sgf-popup") self("analyze-sgf-popup")
elif keycode[1] == "f12" and "ctrl" in modifiers:
app.language = "haha"
elif keycode[1] == "s" and "ctrl" in modifiers: elif keycode[1] == "s" and "ctrl" in modifiers:
self("output-sgf") self("output-sgf")
elif keycode[1] == "c" and "ctrl" in modifiers: elif keycode[1] == "c" and "ctrl" in modifiers:
+2 -2
View File
@@ -46,7 +46,7 @@ def find_package_resource(path):
class Lang(Observable): class Lang(Observable):
observers = [] observers = []
callbacks = [] callbacks = []
FONTS = {"ko": "fonts/NotoSansKR-Regular.otf"} FONTS = {"ko": "fonts/NotoSansKR-Regular.otf", "haha": "fonts/NotoSansKR-Regular.otf"}
def __init__(self, lang): def __init__(self, lang):
super(Lang, self).__init__() super(Lang, self).__init__()
@@ -88,7 +88,7 @@ class Lang(Observable):
for widget, func, args in self.observers: for widget, func, args in self.observers:
try: try:
func(args[0], None, None) func(args[0], None, None)
print('setting',widget,widget.font_name,'->',self.font_name) print("setting", widget, widget.font_name, "->", self.font_name)
widget.font_name = self.font_name widget.font_name = self.font_name
for sub_widget in [getattr(widget, "_hint_lbl", None), getattr(widget, "_msg_lbl", None)]: # MDText for sub_widget in [getattr(widget, "_hint_lbl", None), getattr(widget, "_msg_lbl", None)]: # MDText
if sub_widget: if sub_widget:
+1 -1
View File
@@ -822,7 +822,7 @@
size_hint_y: 0.5 size_hint_y: 0.5
id: analysis_button id: analysis_button
on_press: root.open_analysis_menu() on_press: root.open_analysis_menu()
text: 'Analysis' text: i18n._("btn:Analyze")
pos_hint: {'center_y':0.5} pos_hint: {'center_y':0.5}
<MainMenuItem> <MainMenuItem>
+465
View File
@@ -0,0 +1,465 @@
# Adapted from https://github.com/kivy-garden/filebrowser
"""
FileBrowser
===========
The :class:`FileBrowser` widget is an advanced file browser. You use it
similarly to FileChooser usage.
It provides a shortcut bar with links to special and system directories.
When touching next to a shortcut in the links bar, it'll expand and show
all the directories within that directory. It also facilitates specifying
custom paths to be added to the shortcuts list.
It provides a icon and list view to choose files from. And it also accepts
filter and filename inputs.
To create a FileBrowser which prints the currently selected file as well as
the current text in the filename field when 'Select' is pressed, with
a shortcut to the Documents directory added to the favorites bar::
import os
from kivy.app import App
class TestApp(App):
def build(self):
user_path = os.path.join(get_home_directory(), 'Documents')
browser = FileBrowser(select_string='Select',
favorites=[(user_path, 'Documents')])
browser.bind(on_success=self._fbrowser_success,
on_submit=self._fbrowser_submit)
return browser
def _fbrowser_success(self, instance):
print(instance.selection)
def _fbrowser_submit(self, instance):
print(instance.selection)
TestApp().run()
:Events:
`on_success`:
Fired when the `Select` buttons `on_release` event is called.
`on_submit`:
Fired when a file has been selected with a double-tap.
.. image:: _static/filebrowser.png
:align: right
"""
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.treeview import TreeViewLabel, TreeView
from kivy.uix.filechooser import FileChooserListView, FileChooserListLayout
from kivy.properties import ObjectProperty, StringProperty, OptionProperty, ListProperty, BooleanProperty
from kivy.lang import Builder
from kivy.utils import platform
from kivy.clock import Clock
import string
from os.path import sep, dirname, expanduser, isdir, join
from os import walk
from functools import partial
from katrain.gui.style import DEFAULT_FONT
if platform == "win":
from ctypes import windll, create_unicode_buffer
def last_modified_first(files, filesystem):
return sorted(f for f in files if filesystem.is_dir(f)) + sorted([f for f in files if not filesystem.is_dir(f)], key=lambda f: -os.path.getmtime(f))
def get_home_directory():
if platform == "win":
user_path = expanduser("~")
if not isdir(join(user_path, "Desktop")):
user_path = dirname(user_path)
else:
user_path = expanduser("~")
return user_path
def get_drives():
drives = []
if platform == "win":
bitmask = windll.kernel32.GetLogicalDrives()
GetVolumeInformationW = windll.kernel32.GetVolumeInformationW
for letter in string.ascii_uppercase:
if bitmask & 1:
name = create_unicode_buffer(64)
# get name of the drive
drive = letter + u":"
res = GetVolumeInformationW(drive + sep, name, 64, None, None, None, None, 0)
if isdir(drive):
drives.append((drive, name.value))
bitmask >>= 1
elif platform == "linux":
drives.append((sep, sep))
drives.append((expanduser(u"~"), "~/"))
places = (sep + u"mnt", sep + u"media")
for place in places:
if isdir(place):
for directory in next(walk(place))[1]:
drives.append((place + sep + directory, directory))
elif platform == "macosx" or platform == "ios":
drives.append((expanduser(u"~"), "~/"))
vol = sep + u"Volume"
if isdir(vol):
for drive in next(walk(vol))[1]:
drives.append((vol + sep + drive, drive))
return drives
class I18NFileChooserListView(FileChooserListView):
font_name = StringProperty(DEFAULT_FONT)
show_hidden = BooleanProperty(True) # avoid errors
class I18NFileChooserListLayout(FileChooserListLayout):
_ENTRY_TEMPLATE = "I18NFileListEntry"
Builder.load_string(
"""
#:kivy 1.0
[I18NFileListEntry@FloatLayout+TreeViewNode]:
locked: False
entries: []
path: ctx.path
is_selected: self.path in ctx.controller().selection
orientation: 'horizontal'
size_hint_y: None
height: '24dp'
# Don't allow expansion of the ../ node
is_leaf: not ctx.isdir or ctx.name.endswith('..' + ctx.sep) or self.locked
on_touch_down: self.collide_point(*args[1].pos) and ctx.controller().entry_touched(self, args[1])
on_touch_up: self.collide_point(*args[1].pos) and ctx.controller().entry_released(self, args[1])
BoxLayout:
pos: root.pos
size_hint_x: None
width: root.width - dp(10)
Label:
id: filename
text_size: self.width, None
halign: 'left'
shorten: True
text: ctx.name
font_name: ctx.controller().font_name
Label:
text_size: self.width, None
size_hint_x: None
halign: 'right'
text: '{}'.format(ctx.get_nice_size())
<I18NFileChooserListView>:
layout: layout
I18NFileChooserListLayout:
id: layout
controller: root
"""
)
Builder.load_string(
"""
#:kivy 1.2.0
#:import metrics kivy.metrics
#:import abspath os.path.abspath
#:import i18n katrain.core.utils.i18n
<Button>:
track_lang: i18n._('')
<TreeLabel>:
on_touch_down:
self.parent.browser.path = self.path if self.collide_point(*args[1].pos) and self.path else self.parent.browser.path
on_is_open: self.is_open and self.parent.trigger_populate(self)
<FileBrowser>:
orientation: 'vertical'
spacing: 5
padding: [6, 6, 6, 6]
select_state: select_button.state
filename: file_text.text
browser: list_view
on_favorites: link_tree.reload_favs(self.favorites)
BoxLayout:
orientation: 'horizontal'
spacing: 5
Splitter:
sizable_from: 'right'
min_size: '153sp'
size_hint: (.2, 1)
id: splitter
ScrollView:
LinkTree:
id: link_tree
browser: root.browser
size_hint_y: None
height: self.minimum_height
on_parent: self.fill_tree(root.favorites)
root_options: {'text': 'Locations', 'no_selection':True}
BoxLayout:
size_hint_x: .8
orientation: 'vertical'
Label:
size_hint_y: None
height: '22dp'
text_size: self.size
padding_x: '10dp'
text: abspath(root.path)
track_lang: i18n._('')
valign: 'middle'
I18NFileChooserListView:
id: list_view
path: root.path
sort_func: root.sort_func
filters: root.filters
filter_dirs: root.filter_dirs
show_hidden: root.show_hidden
multiselect: root.multiselect
dirselect: root.dirselect
rootpath: root.rootpath
on_submit: root.dispatch('on_submit')
track_lang: i18n._('')
GridLayout:
size_hint: (1, None)
height: file_text.line_height * 2
cols: 2
rows: 2
spacing: [5]
TextInput:
id: file_text
text: (root.selection and (root._shorten_filenames(root.selection) if root.multiselect else root.selection[0])) or ''
hint_text: 'Filename'
multiline: False
Button:
id: select_button
size_hint_x: None
width: metrics.dp(100)
text: root.select_string
on_release: root.dispatch('on_success')
"""
)
class TreeLabel(TreeViewLabel):
path = StringProperty("")
"""Full path to the location this node points to.
:class:`~kivy.properties.StringProperty`, defaults to ''
"""
class LinkTree(TreeView):
# link to the favorites section of link bar
_favs = ObjectProperty(None)
_computer_node = None
def fill_tree(self, fav_list):
user_path = get_home_directory()
self._favs = self.add_node(TreeLabel(text="Favorites", is_open=True, no_selection=True))
self.reload_favs(fav_list)
libs = self.add_node(TreeLabel(text="Libraries", is_open=True, no_selection=True))
places = ("Documents", "Music", "Pictures", "Videos")
for place in places:
if isdir(join(user_path, place)):
self.add_node(TreeLabel(text=place, path=join(user_path, place)), libs)
self._computer_node = self.add_node(TreeLabel(text="Computer", is_open=True, no_selection=True))
self._computer_node.bind(on_touch_down=self._drives_touch)
self.reload_drives()
def _drives_touch(self, obj, touch):
if obj.collide_point(*touch.pos):
self.reload_drives()
def reload_drives(self):
nodes = [(node, node.text + node.path) for node in self._computer_node.nodes if isinstance(node, TreeLabel)]
sigs = [s[1] for s in nodes]
nodes_new = []
sig_new = []
for path, name in get_drives():
if platform == "win":
text = u"{}({})".format((name + " ") if name else "", path)
else:
text = name
nodes_new.append((text, path))
sig_new.append(text + path + sep)
for node, sig in nodes:
if sig not in sig_new:
self.remove_node(node)
for text, path in nodes_new:
if text + path + sep not in sigs:
self.add_node(TreeLabel(text=text, path=path + sep), self._computer_node)
def reload_favs(self, fav_list):
user_path = get_home_directory()
favs = self._favs
remove = []
for node in self.iterate_all_nodes(favs):
if node != favs:
remove.append(node)
for node in remove:
self.remove_node(node)
places = ("Desktop", "Downloads")
for place in places:
if isdir(join(user_path, place)):
self.add_node(TreeLabel(text=place, path=join(user_path, place)), favs)
for path, name in fav_list:
if isdir(path):
self.add_node(TreeLabel(text=name, path=path), favs)
def trigger_populate(self, node):
if not node.path or node.nodes:
return
parent = node.path
_next = next(walk(parent))
if _next:
for path in _next[1]:
self.add_node(TreeLabel(text=path, path=parent + sep + path), node)
class FileBrowser(BoxLayout):
"""FileBrowser class, see module documentation for more information.
"""
__events__ = ("on_success", "on_submit")
select_state = OptionProperty("normal", options=("normal", "down"))
"""State of the 'select' button, must be one of 'normal' or 'down'.
The state is 'down' only when the button is currently touched/clicked,
otherwise 'normal'. This button functions as the typical Ok/Select/Save
button.
:data:`select_state` is an :class:`~kivy.properties.OptionProperty`.
"""
select_string = StringProperty("Ok")
"""Label of the 'select' button.
:data:`select_string` is an :class:`~kivy.properties.StringProperty`,
defaults to 'Ok'.
"""
filename = StringProperty("")
"""The current text in the filename field. Read only. When multiselect is
True, the list of selected filenames is shortened. If shortened, filename
will contain an ellipsis.
:data:`filename` is an :class:`~kivy.properties.StringProperty`,
defaults to ''.
.. versionchanged:: 1.1
"""
selection = ListProperty([])
"""Read-only :class:`~kivy.properties.ListProperty`.
Contains the list of files that are currently selected in the current tab.
See :kivy_fchooser:`kivy.uix.filechooser.FileChooserController.selection`.
.. versionchanged:: 1.1
"""
path = StringProperty(u"/")
"""
:class:`~kivy.properties.StringProperty`, defaults to the current working
directory as a unicode string. It specifies the path on the filesystem that
browser should refer to.
See :kivy_fchooser:`kivy.uix.filechooser.FileChooserController.path`.
.. versionadded:: 1.1
"""
filters = ListProperty([])
""":class:`~kivy.properties.ListProperty`, defaults to [], equal to
``'*'``.
Specifies the filters to be applied to the files in the directory.
See :kivy_fchooser:`kivy.uix.filechooser.FileChooserController.filters`.
Filering keywords that the user types into the filter field as a comma
separated list will be reflected here.
.. versionadded:: 1.1
"""
filter_dirs = BooleanProperty(False)
"""
:class:`~kivy.properties.BooleanProperty`, defaults to False.
Indicates whether filters should also apply to directories.
See
:kivy_fchooser:`kivy.uix.filechooser.FileChooserController.filter_dirs`.
.. versionadded:: 1.1
"""
show_hidden = BooleanProperty(False)
"""
:class:`~kivy.properties.BooleanProperty`, defaults to False.
Determines whether hidden files and folders should be shown.
See
:kivy_fchooser:`kivy.uix.filechooser.FileChooserController.show_hidden`.
.. versionadded:: 1.1
"""
multiselect = BooleanProperty(False)
"""
:class:`~kivy.properties.BooleanProperty`, defaults to False.
Determines whether the user is able to select multiple files or not.
See
:kivy_fchooser:`kivy.uix.filechooser.FileChooserController.multiselect`.
.. versionadded:: 1.1
"""
dirselect = BooleanProperty(False)
"""
:class:`~kivy.properties.BooleanProperty`, defaults to False.
Determines whether directories are valid selections or not.
See
:kivy_fchooser:`kivy.uix.filechooser.FileChooserController.dirselect`.
.. versionadded:: 1.1
"""
rootpath = StringProperty(None, allownone=True)
"""
Root path to use instead of the system root path. If set, it will not show
a ".." directory to go up to the root path. For example, if you set
rootpath to /users/foo, the user will be unable to go to /users or to any
other directory not starting with /users/foo.
:class:`~kivy.properties.StringProperty`, defaults to None.
See :kivy_fchooser:`kivy.uix.filechooser.FileChooserController.rootpath`.
.. versionadded:: 1.1
"""
favorites = ListProperty([])
"""A list of the paths added to the favorites link bar. Each element
is a tuple where the first element is a string containing the full path
to the location, while the second element is a string with the name of
path to be displayed.
:data:`favorites` is an :class:`~kivy.properties.ListProperty`,
defaults to '[]'.
"""
sort_func = ObjectProperty(last_modified_first)
"""
Provides a function to be called with a list of filenames as the first
argument and the filesystem implementation as the second argument. It
returns a list of filenames sorted for display in the view."""
def on_success(self):
pass
def on_submit(self):
pass
def __init__(self, **kwargs):
super(FileBrowser, self).__init__(**kwargs)
Clock.schedule_once(self._post_init)
def _post_init(self, *largs):
self.ids.list_view.bind(
selection=partial(self._attr_callback, "selection"),
path=partial(self._attr_callback, "path"),
filters=partial(self._attr_callback, "filters"),
filter_dirs=partial(self._attr_callback, "filter_dirs"),
show_hidden=partial(self._attr_callback, "show_hidden"),
multiselect=partial(self._attr_callback, "multiselect"),
dirselect=partial(self._attr_callback, "dirselect"),
rootpath=partial(self._attr_callback, "rootpath"),
)
def _shorten_filenames(self, filenames):
if not len(filenames):
return ""
elif len(filenames) == 1:
return filenames[0]
elif len(filenames) == 2:
return filenames[0] + ", " + filenames[1]
else:
return filenames[0] + ", _..._, " + filenames[-1]
def _attr_callback(self, attr, obj, value):
setattr(self, attr, getattr(obj, attr))
Binary file not shown.
+13 -1
View File
@@ -153,6 +153,9 @@ msgstr "Play"
msgid "btn:Analysis" msgid "btn:Analysis"
msgstr "Analysis" msgstr "Analysis"
msgid "btn:Analyze"
msgstr "Analyze"
msgid "stats:winrate" msgid "stats:winrate"
msgstr "Win Rate" msgstr "Win Rate"
@@ -214,7 +217,16 @@ msgstr "Analyzing move..."
msgid "SGF Notes Hint" msgid "SGF Notes Hint"
msgstr "Your SGF notes for this position here." msgstr "Your SGF notes for this position here."
#. popup title # sgf load popup
msgid "load sgf title"
msgstr "Load SGF File to Analyze"
msgid "load sgf fast analysis"
msgstr "Use fast analysis"
msgid "load sgf rewind"
msgstr "Rewind to start"
# timer settings from here # timer settings from here
msgid "timer settings" msgid "timer settings"
msgstr "Adjust Timer Settings" msgstr "Adjust Timer Settings"
Binary file not shown.
@@ -0,0 +1,634 @@
# KaTrain i18n file
msgid ""
msgstr ""
"Language: ㅋㅋㅋ\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
#. TODO
msgid "ruleset"
msgstr "ㅋㅋㅋ"
#. TODO
msgid "pass-button-text"
msgstr "ㅋㅋ"
#. TODO
msgid "Analyzing move..."
msgstr "ㅋㅋㅋㅋㅋ ㅋㅋ..."
#. TODO
msgid "chinese"
msgstr "ㅋㅋㅋㅋ"
#. TODO
msgid "menu:aisettings"
msgstr "ㅋ ㅋㅋㅋㅋ"
#. TODO
msgid "ai:scoreloss"
msgstr "ㅋㅋㅋ ㅋㅋ"
#. TODO
msgid "Select AI"
msgstr "ㅋㅋㅋ ㅋ ㅋㅋㅋㅋ ㅋ ㅋㅋㅋㅋㅋ"
#. TODO
msgid "engine:katago"
msgstr "ㅋㅋ ㅋ ㅋㅋㅋ ㅋㅋㅋㅋㅋ"
#. TODO
msgid "aihelp:scoreloss"
msgstr ""
"ㅋㅋㅋ ㅋㅋㅋ ㅋㅋ ㅋㅋ ㅋ ㅋㅋ ㅋㅋㅋ ㅋㅋ ㅋㅋ ㅋㅋㅋ ㅋㅋㅋㅋㅋㅋ. ㅋㅋㅋ ㅋ ㅋㅋ ㅋㅋ ㅋㅋㅋ/ㅋㅋㅋ ㅋㅋ ㅋㅋㅋ ㅋㅋㅋ "
"ㅋㅋㅋㅋ."
#. TODO
msgid "general settings title"
msgstr "ㅋㅋㅋㅋ ㅋㅋ ㅋㅋㅋ ㅋㅋㅋㅋ"
#. TODO
msgid "general:sgf_load"
msgstr "ㅋㅋ ㅋㅋ ㅋㅋㅋㅋ ㅋㅋ ㅋㅋㅋ"
#. TODO
msgid "engine:fast_visits"
msgstr "ㅋㅋㅋㅋ ㅋㅋㅋ ㅋ ㅋㅋㅋ ㅋ ㅋㅋ ㅋㅋㅋㅋ"
#. TODO
msgid "ai:p:weighted"
msgstr "ㅋㅋㅋ ㅋㅋㅋㅋ"
#. TODO
msgid "wait-before-equalize"
msgstr "ㅋㅋ ㅋㅋ ㅋㅋㅋㅋ ㅋㅋㅋㅋ ㅋ ㅋㅋㅋㅋ ㅋㅋㅋ ㅋㅋㅋㅋㅋ ㅋ ㅋㅋㅋㅋㅋ."
#. TODO
msgid "save dots"
msgstr "ㅋㅋ ㅋ ㅋㅋ"
#. TODO
msgid "menu:clocksettings"
msgstr "ㅋㅋㅋ ㅋㅋㅋㅋ"
#. TODO
msgid "Starting default Kata failed"
msgstr ""
"ㅋㅋㅋㅋ ㅋㅋㅋ ㅋㅋ ㅋㅋㅋㅋ '{ㅋㅋㅋㅋ}' ㅋㅋㅋ ㅋㅋ ㅋㅋㅋ {ㅋㅋㅋ}. ㅋ ㅋ ㅋㅋㅋ, ㅋㅋ ㅋㅋ ㅋㅋㅋ ㅋ ㅋㅋ ㅋ ㅋㅋ ㅋㅋ "
"ㅋ ㅋㅋㅋㅋ ㅋㅋㅋ ㅋㅋㅋ, ㅋㅋ ㅋㅋ ㅋ ㅋ ㅋㅋ ㅋㅋ ㅋ 'ㅋㅋㅋ/ㅋㅋㅋ' ㅋㅋㅋㅋ."
#. TODO
msgid "teacher settings"
msgstr "ㅋㅋ ㅋㅋㅋㅋ ㅋㅋㅋㅋ"
#. TODO
msgid "gametype"
msgstr "ㅋㅋ ㅋㅋ"
#. TODO
msgid "dot color"
msgstr "ㅋㅋㅋ (ㅋㅋㅋ)"
#. TODO
msgid "tab:notes"
msgstr "ㅋㅋㅋ"
#. TODO
msgid "komi"
msgstr "ㅋㅋ"
#. TODO
msgid "menu:settings"
msgstr "ㅋㅋㅋㅋ & ㅋㅋㅋ ㅋㅋㅋㅋ"
#. TODO
msgid "general:debug_level"
msgstr "ㅋㅋㅋ ㅋㅋㅋ ㅋ ㅋㅋ ㅋㅋㅋㅋ"
#. TODO
msgid "korean"
msgstr "ㅋㅋㅋ"
#. TODO
msgid "ai:policy"
msgstr "ㅋㅋㅋ"
#. TODO
msgid "ai:p:pick"
msgstr "ㅋㅋㅋㅋ ㅋㅋㅋ"
#. TODO
msgid "handicap"
msgstr "ㅋㅋㅋㅋ"
#. TODO
msgid "engine:wide_root_noise:hint"
msgstr ""
"ㅋㅋ 0.02-0.1 ㅋ ㅋㅋ\n"
"ㅋㅋ ㅋㅋㅋㅋ ㅋㅋㅋ"
#. TODO
msgid "player:type"
msgstr "ㅋㅋㅋ"
#. TODO
msgid "general:debug_level:hint"
msgstr "ㅋㅋ ㅋ 1 ㅋㅋ ㅋㅋㅋㅋㅋ ㅋㅋㅋ"
#. TODO
msgid "engine:config"
msgstr "ㅋㅋ ㅋ ㅋㅋㅋ ㅋㅋㅋ ㅋㅋ"
#. TODO
msgid "Info:score"
msgstr "ㅋㅋㅋ: {ㅋㅋㅋ}"
#. TODO
msgid "Info:AI thoughts"
msgstr "ㅋ ㅋㅋㅋㅋ ㅋㅋㅋㅋ: {ㅋㅋㅋㅋ}"
#. TODO
msgid "update ai settings"
msgstr "ㅋㅋㅋ ㅋ ㅋㅋㅋㅋ"
#. TODO
msgid "num undos"
msgstr "ㅋㅋㅋ ㅋ ㅋㅋㅋ"
#. TODO
msgid "ai:default"
msgstr "ㅋㅋㅋ"
#. TODO
msgid "Info:point loss"
msgstr "ㅋㅋㅋㅋㅋ ㅋㅋㅋ ㅋㅋ: {ㅋㅋㅋ_ㅋㅋ:.1ㅋ}"
#. TODO
msgid "ai:p:tenuki"
msgstr "ㅋㅋㅋ ㅋㅋㅋ"
#. TODO
msgid "menu:save"
msgstr "ㅋㅋ ㅋㅋ"
#. TODO
msgid "analysis:sweep"
msgstr "ㅋㅋ ㅋㅋㅋㅋ ㅋ ㅋㅋ ㅋㅋㅋ"
#. TODO
msgid "update settings"
msgstr "ㅋㅋㅋ ㅋㅋㅋㅋ"
#. TODO
msgid "board size"
msgstr "ㅋㅋㅋ ㅋㅋ"
#. TODO
msgid "tab:points"
msgstr "ㅋㅋㅋ ㅋㅋ"
#. TODO
msgid "aihelp:p:weighted"
msgstr ""
"ㅋㅋㅋ ㅋㅋㅋ ㅋㅋㅋㅋㅋ ㅋ ㅋㅋㅋ ㅋㅋㅋㅋㅋㅋ, ㅋㅋ `ㅋㅋㅋ_ㅋㅋ` ㅋㅋㅋㅋㅋㅋ ㅋㅋ ㅋㅋ ㅋㅋ ㅋㅋㅋ ㅋㅋㅋ ㅋㅋㅋ ㅋㅋ ㅋㅋㅋ. "
"ㅋ ㅋㅋ ㅋㅋㅋㅋ ㅋㅋㅋ ㅋㅋㅋ ㅋㅋ ㅋㅋ `ㅋㅋㅋ` ㅋ.`ㅋㅋ_ㅋㅋㅋㅋ` ㅋㅋㅋㅋㅋ ㅋㅋ ㅋㅋ ㅋㅋ ㅋ ㅋㅋㅋ ㅋㅋㅋㅋ ㅋㅋㅋㅋㅋ, "
"ㅋㅋ `ㅋㅋㅋ_ㅋㅋㅋ` ㅋㅋㅋㅋㅋ ㅋㅋ ㅋㅋㅋ ㅋㅋㅋ ㅋㅋㅋ ㅋㅋㅋ ㅋㅋ ㅋ ㅋㅋㅋㅋ."
#. TODO
msgid "engine:katago:hint"
msgstr "ㅋㅋㅋ ㅋㅋㅋ ㅋ ㅋㅋ ㅋㅋㅋㅋ ㅋㅋㅋㅋㅋ"
#. TODO
msgid "Info:best move"
msgstr "ㅋㅋ ㅋㅋ ㅋㅋㅋㅋㅋ ㅋㅋ ㅋㅋ"
#. TODO
msgid "menu:support"
msgstr "ㅋㅋㅋㅋ ㅋ ㅋㅋㅋㅋㅋ"
#. TODO
msgid "menu:lang"
msgstr "ㅋㅋㅋㅋ"
#. TODO
msgid "aistrategy"
msgstr "ㅋ ㅋㅋㅋㅋ"
#. TODO
msgid "load sgf title"
msgstr "ㅋㅋ ㅋㅋ ㅋㅋ ㅋ ㅋㅋㅋㅋ"
#. TODO
msgid "aihelp:p:local"
msgstr ""
"ㅋㅋㅋ `ㅋㅋ_ㅋ + ㅋㅋ_ㅋㅋ * <ㅋㅋㅋ ㅋ ㅋㅋㅋ ㅋㅋㅋ>` ㅋㅋㅋㅋ ㅋㅋㅋㅋ ㅋㅋ ㅋㅋ ㅋㅋ ㅋㅋ ㅋㅋㅋ ㅋㅋ ㅋㅋ ㅋㅋ. ㅋㅋㅋ"
" ㅋㅋ ㅋㅋ ㅋ ㅋㅋㅋ ㅋㅋㅋ ㅋ ㅋㅋㅋ `ㅋㅋ_ㅋㅋㅋㅋ` ㅋ ㅋㅋㅋ ㅋㅋㅋㅋ ㅋㅋㅋㅋ."
#. TODO
msgid "analysis:policy"
msgstr ""
"ㅋㅋㅋ\n"
"ㅋㅋㅋ"
#. TODO
msgid "Info:top move"
msgstr "ㅋㅋㅋㅋㅋ ㅋㅋ ㅋㅋ ㅋㅋ {ㅋㅋ_ㅋㅋ} ({ㅋㅋㅋ})."
#. TODO
msgid "Info:policy rank"
msgstr "ㅋㅋ ㅋㅋ #{ㅋㅋ} ㅋㅋㅋㅋㅋ ㅋ ㅋㅋㅋ ({ㅋㅋㅋㅋㅋㅋ:.2%})."
#. TODO
msgid "analysis:equalize"
msgstr "ㅋㅋㅋㅋ ㅋㅋㅋ ㅋ ㅋㅋㅋㅋㅋ ㅋㅋㅋ"
#. TODO
msgid "No analysis available"
msgstr "ㅋ ㅋㅋㅋㅋ ㅋㅋㅋㅋㅋ"
#. TODO
msgid "show last n dots"
msgstr ""
"ㅋㅋ ㅋㅋ ㅋㅋ ㅋㅋ ㅋㅋ\n"
"<ㅋㅋ ㅋㅋ> ㅋㅋㅋ"
#. TODO
msgid "stats:pointsgained"
msgstr "ㅋㅋㅋ ㅋㅋㅋ"
#. TODO
msgid "Info:policy best"
msgstr "ㅋㅋ ㅋㅋㅋ ㅋㅋ ㅋㅋ {ㅋㅋ} ({ㅋㅋㅋㅋㅋㅋ:.1%})."
#. TODO
msgid "tab:score"
msgstr "ㅋㅋㅋ"
#. TODO
msgid "Copied SGF to clipboard."
msgstr "ㅋㅋㅋ ㅋㅋ ㅋ ㅋㅋㅋㅋㅋ."
#. TODO
msgid "ai:p:territory"
msgstr "ㅋㅋㅋㅋ ㅋㅋㅋㅋ"
#. TODO
msgid "btn:Play"
msgstr "ㅋㅋ"
#. TODO
msgid "Failed to load SGF"
msgstr "ㅋㅋㅋ ㅋ ㅋㅋ ㅋㅋ. ㅋㅋㅋ ㅋㅋㅋ: {ㅋㅋㅋ}"
#. TODO
msgid "sgf written"
msgstr "ㅋㅋ ㅋㅋ ㅋㅋㅋㅋ ㅋㅋㅋㅋ ㅋ {ㅋㅋ_ㅋㅋ}"
#. TODO
msgid "tab:winrate"
msgstr "ㅋㅋ ㅋㅋ"
#. TODO
msgid "point loss threshold"
msgstr "ㅋㅋㅋ ㅋㅋ ㅋㅋㅋㅋ ㅋㅋ"
#. TODO
msgid "player:human"
msgstr "ㅋㅋㅋ"
#. TODO
msgid "ai:jigo"
msgstr "ㅋㅋㅋㅋ"
#. TODO
msgid "closedlabel:info&notes"
msgstr "ㅋㅋ ㅋㅋ & ㅋㅋㅋ"
#. TODO
msgid "SGF start message"
msgstr ""
"ㅋㅋㅋ ㅋㅋㅋ 'ㅋ' ㅋㅋㅋㅋ ㅋㅋ ㅋㅋ ㅋㅋ ㅋㅋㅋㅋㅋ ㅋ ㅋㅋㅋ, ㅋㅋㅋ ㅋㅋ ㅋ ㅋㅋㅋ ㅋㅋ ㅋㅋㅋ ㅋㅋ ㅋㅋ ㅋㅋ ㅋㅋ 0.5 "
"ㅋㅋㅋ"
#. TODO
msgid "engine:max_time"
msgstr "ㅋㅋㅋㅋ ㅋㅋ ㅋㅋ ㅋㅋㅋㅋ"
#. TODO
msgid "aga"
msgstr "ㅋㅋ"
#. TODO
msgid "engine:time:hint"
msgstr "ㅋㅋ ㅋ ㅋㅋㅋㅋ"
#. TODO
msgid "update timer"
msgstr "ㅋㅋㅋ ㅋㅋㅋ"
#. TODO
msgid "game:teach"
msgstr "ㅋㅋㅋㅋ ㅋㅋ"
#. TODO
msgid "byoyomi length"
msgstr "ㅋㅋ ㅋㅋ ㅋㅋ-ㅋㅋ ㅋㅋㅋ"
#. TODO
msgid "new game"
msgstr "ㅋㅋㅋ ㅋㅋ ㅋㅋ"
#. TODO
msgid "japanese"
msgstr "ㅋㅋㅋㅋ"
#. TODO
msgid "menu:teachsettings"
msgstr "ㅋㅋㅋㅋ ㅋㅋ ㅋㅋㅋㅋ"
#. TODO
msgid "closedlabel:scoregraph"
msgstr "ㅋㅋㅋ ㅋㅋㅋ"
#. TODO
msgid "engine settings"
msgstr "ㅋㅋㅋ ㅋㅋㅋ ㅋㅋㅋㅋ"
#. TODO
msgid "stats:score"
msgstr "ㅋㅋㅋㅋㅋ ㅋㅋㅋ"
#. TODO
msgid "engine:wide_root_noise"
msgstr "ㅋㅋ ㅋㅋ ㅋㅋㅋ (ㅋㅋㅋㅋㅋ ㅋㅋㅋㅋ ㅋ ㅋㅋㅋ ㅋㅋㅋㅋㅋ)"
#. TODO
msgid "btn:Analysis"
msgstr "ㅋㅋㅋㅋ"
#. TODO
msgid "Info:PV"
msgstr "ㅋ: {ㅋ}"
#. TODO
msgid "ai:p:local"
msgstr "ㅋㅋㅋ ㅋㅋㅋㅋ ㅋㅋㅋ"
#. TODO
msgid "analysis:dots"
msgstr ""
"ㅋㅋ\n"
"ㅋㅋ"
#. TODO
msgid "show ai dots"
msgstr ""
"ㅋㅋ ㅋㅋ/ㅋㅋ ㅋㅋㅋㅋ\n"
" ㅋㅋ ㅋ ㅋㅋㅋㅋ"
#. TODO
msgid "board-game-end"
msgstr ""
"ㅋㅋ\n"
"ㅋㅋ"
#. TODO
msgid "SGF Notes Hint"
msgstr "ㅋㅋ ㅋㅋ ㅋㅋㅋ ㅋㅋ ㅋㅋ ㅋㅋㅋㅋ ㅋㅋ."
#. TODO
msgid "file not found"
msgstr "ㅋㅋ ㅋㅋ ㅋㅋ ㅋㅋㅋ"
#. TODO
msgid "general:anim_pv_time"
msgstr "ㅋㅋ ㅋㅋㅋㅋ ㅋㅋㅋ ㅋㅋ ㅋㅋㅋㅋㅋ ㅋ ㅋㅋㅋㅋ"
#. TODO
msgid "menu:newgame"
msgstr "ㅋㅋ ㅋㅋ"
#. TODO
msgid "analysis:topmoves"
msgstr ""
"ㅋㅋ\n"
"ㅋㅋㅋ"
#. TODO
msgid "menu:playersetup"
msgstr "ㅋㅋㅋ ㅋㅋㅋ"
#. TODO
msgid "restarting engine"
msgstr "ㅋㅋㅋㅋㅋ ㅋㅋㅋ ㅋㅋㅋ ㅋㅋㅋㅋ ㅋㅋㅋ."
#. TODO
msgid "ai-ponder"
msgstr ""
"ㅋㅋ ㅋㅋㅋ ㅋㅋㅋㅋㅋ ㅋㅋ ㅋㅋㅋ ㅋㅋㅋ, ㅋㅋㅋ ㅋㅋ ㅋㅋㅋ (ㅋㅋ) ㅋ ㅋㅋㅋ (ㅋㅋㅋㅋㅋ ㅋㅋㅋㅋ). ㅋ ㅋㅋㅋ ㅋㅋ ㅋㅋ ㅋㅋ "
"ㅋㅋㅋ ㅋㅋ ㅋㅋㅋㅋ ㅋ ㅋㅋㅋ ㅋ ㅋㅋㅋ."
#. TODO
msgid "stats:pointslost"
msgstr "ㅋㅋㅋ ㅋㅋ"
#. TODO
msgid "byoyomi periods"
msgstr "ㅋㅋㅋ ㅋ ㅋㅋㅋㅋ"
#. TODO
msgid "closedlabel:movestats"
msgstr "ㅋㅋ ㅋㅋㅋ"
#. TODO
msgid "avoids replaying"
msgstr ""
"ㅋㅋㅋ ㅋㅋㅋㅋㅋ\n"
"ㅋㅋㅋㅋㅋ ㅋㅋㅋ"
#. TODO
msgid "player:ai"
msgstr "ㅋ"
#. TODO
msgid "menu:load"
msgstr "ㅋㅋ ㅋㅋ"
#. TODO
msgid "load sgf fast analysis"
msgstr "ㅋㅋ ㅋㅋ ㅋㅋㅋㅋ"
#. TODO
msgid "analysis:territory"
msgstr ""
"ㅋㅋㅋㅋ\n"
"ㅋㅋㅋㅋㅋ"
#. TODO
msgid "aihelp:p:pick"
msgstr ""
"ㅋㅋㅋ `ㅋㅋ_ㅋ + ㅋㅋ_ㅋㅋ * <ㅋㅋㅋ ㅋ ㅋㅋㅋ ㅋㅋㅋ>` ㅋ ㅋㅋㅋ ㅋㅋ ㅋㅋㅋ ㅋㅋ ㅋㅋ ㅋㅋ. ㅋㅋ `ㅋㅋ_ㅋㅋ=1` ㅋㅋㅋ"
" ㅋㅋ ㅋㅋ `ㅋㅋㅋ` ㅋ. ㅋㅋㅋ ㅋㅋ ㅋㅋ ㅋ ㅋㅋㅋ ㅋㅋㅋ ㅋ ㅋㅋㅋ `ㅋㅋ_ㅋㅋㅋㅋ` ㅋ ㅋㅋㅋ ㅋㅋㅋㅋ ㅋㅋㅋㅋ."
#. TODO
msgid "tab:info"
msgstr "ㅋㅋ"
#. TODO
msgid "engine:model"
msgstr "ㅋㅋ ㅋ ㅋㅋㅋ ㅋㅋㅋ ㅋㅋ"
#. TODO
msgid "board-pass"
msgstr "ㅋㅋ"
#. TODO
msgid "show dots"
msgstr "ㅋㅋ ㅋㅋ"
#. TODO
msgid "aihelp:default"
msgstr ""
"ㅋㅋ ㅋㅋㅋㅋ ㅋㅋㅋ ㅋ. ㅋㅋㅋㅋ ㅋ ㅋㅋㅋ ㅋㅋㅋㅋ ㅋ `ㅋㅋ_ㅋㅋㅋ` ㅋㅋ `ㅋㅋㅋ` ㅋ ㅋㅋ ㅋㅋㅋㅋ ㅋㅋㅋㅋ `ㅋㅋㅋ` "
"ㅋㅋㅋㅋ."
#. TODO
msgid "timer settings"
msgstr "ㅋㅋㅋ ㅋㅋㅋ ㅋㅋㅋㅋ"
#. TODO
msgid "game:normal"
msgstr "ㅋㅋㅋ ㅋㅋ"
#. TODO
msgid "non square board hint"
msgstr "ㅋㅋ ㅋ:ㅋ (ㅋ.ㅋ. 19:9) ㅋㅋ ㅋㅋ-ㅋㅋㅋ ㅋㅋ"
#. TODO
msgid "ai:p:influence"
msgstr "ㅋㅋㅋㅋㅋㅋ ㅋㅋㅋ"
#. TODO
msgid "analysis:aimove"
msgstr "ㅋㅋㅋ ㅋ ㅋㅋ"
#. TODO
msgid "stats:winrate"
msgstr "ㅋㅋ ㅋㅋ"
#. TODO
msgid "analysis:nextmoves"
msgstr ""
"ㅋㅋ\n"
"ㅋㅋㅋ"
#. TODO
msgid "undo-button-text"
msgstr "ㅋㅋ"
#. TODO
msgid "Engine died unexpectedly"
msgstr "ㅋㅋㅋ ㅋㅋ ㅋㅋㅋㅋㅋㅋ ㅋㅋㅋㅋ ㅋㅋㅋㅋ ㅋㅋㅋ, ㅋㅋㅋㅋ ㅋㅋ ㅋ ㅋㅋ ㅋ ㅋㅋㅋ: {ㅋㅋㅋ}"
#. TODO
msgid "Info:winrate"
msgstr "ㅋㅋ ㅋㅋ: {ㅋㅋㅋㅋ}"
#. TODO
msgid "aihelp:policy"
msgstr ""
"ㅋㅋㅋ ㅋㅋ ㅋㅋ ㅋㅋ ㅋㅋ ㅋㅋ ㅋㅋㅋ ㅋㅋㅋㅋ, ㅋㅋㅋㅋ ㅋㅋ ㅋㅋㅋㅋ. ㅋㅋㅋㅋ ㅋ ㅋㅋㅋ ㅋㅋㅋㅋ ㅋ `ㅋㅋㅋ` ㅋ ㅋㅋㅋ "
"ㅋㅋㅋㅋ. ㅋㅋ ㅋㅋㅋㅋ ㅋㅋㅋ ㅋㅋㅋㅋ ㅋㅋㅋㅋ ㅋㅋ ㅋㅋ ㅋㅋㅋ ㅋ ㅋㅋ ㅋㅋㅋㅋ ㅋㅋ ㅋㅋ ㅋㅋㅋ."
#. TODO
msgid "New Game title"
msgstr "ㅋㅋㅋ ㅋㅋ ㅋㅋ"
#. TODO
msgid "aihelp:p:tenuki"
msgstr ""
"ㅋㅋㅋ `ㅋㅋ_ㅋ + ㅋㅋ_ㅋㅋ * <ㅋㅋㅋ ㅋ ㅋㅋㅋ ㅋㅋㅋ>` ㅋㅋㅋㅋ ㅋㅋ ㅋㅋ ㅋㅋ ㅋㅋ ㅋㅋ ㅋㅋ ㅋㅋㅋ ㅋㅋ ㅋㅋ ㅋㅋ. "
"ㅋㅋㅋ ㅋㅋ ㅋㅋ ㅋ ㅋㅋㅋ ㅋㅋㅋ ㅋ ㅋㅋㅋ `ㅋㅋ_ㅋㅋㅋㅋ` ㅋ ㅋㅋㅋ ㅋㅋㅋㅋ ㅋㅋㅋㅋ."
#. TODO
msgid "Info:undo predicted PV"
msgstr "ㅋㅋㅋㅋㅋ ㅋㅋㅋ-ㅋ: {ㅋ}"
#. TODO
msgid "engine:max_visits"
msgstr "ㅋㅋㅋㅋ ㅋㅋㅋ ㅋ ㅋㅋㅋ ㅋ ㅋㅋㅋㅋ"
#. TODO
msgid "general:sgf_save"
msgstr "ㅋㅋ ㅋㅋ ㅋㅋㅋ ㅋㅋ ㅋㅋㅋ"
#. TODO
msgid "strength:kyu"
msgstr "ㅋ"
#. TODO
msgid "general settings"
msgstr "ㅋㅋㅋㅋ ㅋㅋㅋㅋ"
#. TODO
msgid "aihelp:jigo"
msgstr "ㅋㅋ ㅋㅋ ㅋ ㅋㅋ ㅋ ㅋ ㅋㅋ ㅋㅋㅋ ㅋ ㅋㅋㅋ (ㅋㅋㅋㅋ 0.5), ㅋㅋㅋㅋ ㅋㅋㅋㅋ ㅋㅋㅋㅋㅋㅋ."
#. TODO
msgid "Info:teaching undo"
msgstr "ㅋㅋ ㅋㅋ ㅋㅋㅋㅋㅋㅋㅋ ㅋㅋㅋ ㅋ ㅋㅋㅋㅋ ㅋㅋ."
#. TODO
msgid "strength:dan"
msgstr "ㅋ"
#. TODO
msgid "lock ai when playing"
msgstr ""
"ㅋㅋㅋㅋ ㅋㅋㅋㅋ\n"
" ㅋㅋㅋ ㅋ ㅋㅋ ㅋㅋ"
#. TODO
msgid "aihelp:p:influence"
msgstr ""
"ㅋㅋㅋ ㅋㅋㅋ ㅋㅋㅋ ㅋㅋㅋ ㅋㅋ `ㅋㅋㅋㅋㅋ` ㅋㅋ ㅋㅋ ㅋㅋㅋ ㅋㅋ ㅋㅋ ㅋㅋ.ㅋㅋㅋㅋ `ㅋㅋ_ㅋㅋㅋ` ㅋ ㅋㅋㅋㅋ ㅋㅋㅋ ㅋㅋ ㅋㅋ"
" ㅋㅋ ㅋㅋ. ㅋㅋㅋ ㅋㅋㅋㅋ ㅋㅋㅋ ㅋㅋ 'ㅋㅋㅋㅋ' ㅋㅋㅋㅋ ㅋ ㅋㅋ ㅋㅋㅋ ㅋ ㅋㅋㅋ."
#. TODO
msgid "Starting Kata failed"
msgstr ""
"ㅋㅋㅋㅋ ㅋㅋㅋ ㅋㅋ ㅋㅋㅋㅋ '{ㅋㅋㅋㅋ}' ㅋㅋㅋ ㅋㅋ ㅋㅋㅋ {ㅋㅋㅋ}. ㅋㅋㅋ ㅋㅋ ㅋㅋ ㅋㅋ 'ㅋㅋㅋ' ㅋㅋㅋ ㅋㅋㅋ 'ㅋㅋㅋ'"
" ㅋ ㅋㅋㅋㅋ ㅋㅋㅋ ㅋ ㅋㅋ ㅋㅋㅋㅋ ㅋㅋㅋ ㅋㅋㅋㅋㅋ."
#. TODO
msgid "update teacher"
msgstr "ㅋㅋㅋ ㅋㅋㅋㅋ ㅋㅋㅋㅋ"
#. TODO
msgid "clear cache"
msgstr "ㅋㅋㅋ ㅋㅋㅋ"
#. TODO
msgid "Failed to import from clipboard"
msgstr ""
"ㅋㅋㅋ ㅋ ㅋㅋㅋ ㅋㅋ ㅋㅋ ㅋㅋㅋㅋㅋ: {ㅋㅋㅋ}\n"
"ㅋㅋㅋㅋㅋ ㅋㅋㅋㅋ: {ㅋㅋㅋㅋ}..."
#. TODO
msgid "aihelp:p:territory"
msgstr ""
"ㅋㅋㅋ ㅋㅋㅋ ㅋㅋㅋ ㅋㅋㅋ ㅋㅋ `ㅋㅋㅋㅋㅋ` ㅋㅋ ㅋㅋ ㅋㅋㅋ ㅋㅋ ㅋㅋ ㅋㅋ.ㅋㅋㅋㅋ `ㅋㅋ_ㅋㅋㅋ` ㅋ ㅋㅋㅋㅋ ㅋㅋㅋ ㅋㅋ ㅋㅋ"
" ㅋㅋㅋ ㅋㅋ. ㅋㅋㅋ ㅋㅋㅋㅋ ㅋㅋㅋ ㅋㅋ 'ㅋㅋㅋㅋ' ㅋㅋㅋㅋ ㅋ ㅋㅋ ㅋㅋㅋ ㅋ ㅋㅋㅋ."
#. TODO
msgid "analysis:extra"
msgstr "ㅋㅋㅋ ㅋㅋㅋㅋ"
#. TODO
msgid "load sgf rewind"
msgstr "ㅋㅋㅋ ㅋ ㅋㅋㅋ"
#. TODO
msgid "btn:Analyze"
msgstr "ㅋㅋㅋㅋ"
Binary file not shown.
@@ -626,3 +626,19 @@ msgstr "Update AI Settings"
#. TODO #. TODO
msgid "Select AI" msgid "Select AI"
msgstr "Select AI strategy to configure" msgstr "Select AI strategy to configure"
#. TODO
msgid "load sgf rewind"
msgstr "Rewind to start"
#. TODO
msgid "load sgf fast analysis"
msgstr "Use fast analysis"
#. TODO
msgid "load sgf title"
msgstr "Load SGF File to Analyze"
#. TODO
msgid "btn:Analyze"
msgstr "Analyze"
Binary file not shown.
@@ -658,3 +658,19 @@ msgstr "Update AI Settings"
#. TODO #. TODO
msgid "Select AI" msgid "Select AI"
msgstr "Select AI strategy to configure" msgstr "Select AI strategy to configure"
#. TODO
msgid "load sgf rewind"
msgstr "Rewind to start"
#. TODO
msgid "load sgf fast analysis"
msgstr "Use fast analysis"
#. TODO
msgid "load sgf title"
msgstr "Load SGF File to Analyze"
#. TODO
msgid "btn:Analyze"
msgstr "Analyze"
+15 -26
View File
@@ -383,52 +383,41 @@
on_press: root.update_config(True) on_press: root.update_config(True)
<NewLoadSGFPopup>:
FileBrowser:
# old
<LoadSGFPopup>: <LoadSGFPopup>:
fast: fast fast: fast
rewind: rewind rewind: rewind
filesel: filesel filesel: filesel
orientation: 'vertical' orientation: 'vertical'
Label: I18NFileChooserListView:
text: root.filesel.path
size_hint: 1,0.05
halign: 'left'
FileChooserListView:
id: filesel id: filesel
multiselect: False multiselect: False
filters: ["*.sgf"] filters: ["*.sgf"]
path: "." path: "."
size_hint: 1,0.88 size_hint: 1,7
BoxLayout: BoxLayout:
orientation: 'horizontal' orientation: 'horizontal'
size_hint: 1,0.07 size_hint: 1,1
canvas.before: DescriptionLabel:
Color: text: i18n._("load sgf fast analysis")
rgb: 0.4, 0.4, 0.4
Rectangle:
pos: self.pos
size: self.size
Label:
text: "Analyze Extra Fast"
size_hint: 0.45,1 size_hint: 0.45,1
halign: 'right' halign: 'right'
CheckBox: LabelledCheckBox:
id: fast id: fast
color: (0.95, 0.95, 0.95) color: (0.95, 0.95, 0.95)
size_hint: 0.05,1 size_hint: 0.05,1
Label: DescriptionLabel:
text: "Rewind to Start" text: i18n._("load sgf rewind")
halign: 'right' halign: 'right'
size_hint: 0.45,1 size_hint: 0.45,1
CheckBox: LabelledCheckBox:
id: rewind id: rewind
active: True active: True
color: (0.95, 0.95, 0.95) color: (0.95, 0.95, 0.95)
size_hint: 0.05,1 size_hint: 0.05,1
AnchorLayout:
size_hint: 1,1.5
AutoSizedRoundedRectangleButton:
padding_x: 15
size_hint: None,0.5
text: i18n._("Load File")