diff --git a/CONTRIBUTIONS.md b/CONTRIBUTIONS.md index 61e4cbb..417aa06 100644 --- a/CONTRIBUTIONS.md +++ b/CONTRIBUTIONS.md @@ -57,7 +57,7 @@ Many thanks to the following contributors for translations. * French: "Dontbtme" with contributions from "wonderingabout" * Korean: "isty2e" -* German: "nimets123" with contributions from "trohde" +* German: "nimets123", "trohde", and "Harleqin" * Spanish: Sergio Villegas ("serpiente") with contributions from the Spanish OGS community * Russian: Dmitry Ivankov and Alexander Kiselev * Simplified Chinese: Qing Mu with contributions from "Medwin" and Viktor Lin diff --git a/katrain/core/sgf_parser.py b/katrain/core/sgf_parser.py index be07dfd..158d6a8 100644 --- a/katrain/core/sgf_parser.py +++ b/katrain/core/sgf_parser.py @@ -64,10 +64,15 @@ class Move: """Returns True if the move is a pass""" return self.coords is None + @staticmethod + def opponent_player(player): + """Returns the opposing player, i.e. W <-> B""" + return "W" if player == "B" else "B" + @property def opponent(self): """Returns the opposing player, i.e. W <-> B""" - return "W" if self.player == "B" else "B" + return self.opponent_player(self.player) class SGFNode: @@ -288,7 +293,11 @@ class SGFNode: @property def next_player(self): """Returns player to move""" - if "B" in self.properties or ("AB" in self.properties and "W" not in self.properties): # root or black moved + if "PL" in self.properties: # explicit + return "B" if self.get_property("PL").upper().strip() == "B" else "W" + elif "B" in self.properties or ( + "AB" in self.properties and "W" not in self.properties and "AW" not in self.properties + ): # b move or setup with only black moves like root handicap return "W" else: return "B" diff --git a/katrain/gui/badukpan.py b/katrain/gui/badukpan.py index bde7f3e..eacf143 100644 --- a/katrain/gui/badukpan.py +++ b/katrain/gui/badukpan.py @@ -696,7 +696,7 @@ class BadukPanWidget(Widget): def draw_pv(self, pv, node, up_to_move): katrain = self.katrain - next_last_player = [node.next_player, node.player] + next_last_player = [node.next_player, Move.opponent_player(node.next_player)] cn = katrain.game.current_node if node != cn and node.parent != cn: hide_node = cn diff --git a/katrain/i18n/locales/de/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/de/LC_MESSAGES/katrain.mo index fc28904..240981d 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 d3129b5..a54b0f3 100644 --- a/katrain/i18n/locales/de/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/de/LC_MESSAGES/katrain.po @@ -8,16 +8,16 @@ msgstr "" #. main hamburger menu msgid "menu:playersetup" -msgstr "Spieler Setup" +msgstr "Spieler-Setup" msgid "menu:newgame" msgstr "Neue Partie" msgid "menu:save" -msgstr "Partie Speichern" +msgstr "Partie speichern" msgid "menu:load" -msgstr "Partie Laden" +msgstr "Partie laden" msgid "menu:settings" msgstr "Allgemeine Einstellungen" @@ -29,7 +29,7 @@ msgid "menu:teachsettings" msgstr "Einstellungen Übungsspiel" msgid "menu:aisettings" -msgstr "AI Einstellungen" +msgstr "AI-Einstellungen" msgid "menu:lang" msgstr "Spracheinstellungen" @@ -51,7 +51,7 @@ msgid "player:ai" msgstr "AI" msgid "aistrategy" -msgstr "AI Strategie" +msgstr "AI-Strategie" msgid "gametype" msgstr "Partieart" @@ -99,7 +99,7 @@ msgid "analysis:sweep" msgstr "Schnelle Analyse aller Züge" msgid "analysis:aimove" -msgstr "AI Zug erzwingen" +msgstr "AI-Zug erzwingen" #. right panel buttons and below board msgid "pass-button-text" @@ -107,8 +107,8 @@ msgstr "Passen" msgid "ai-ponder" msgstr "" -"Zeigt den Enginestatus an von grün (Leerlauf) bis orange(Zugberechnung). Ist" -" rot, wenn die Engine abgestürzt ist oder nicht starten konnte." +"Zeigt den Enginestatus an von grün (Leerlauf) bis orange (Zugberechnung). " +"Ist rot, wenn die Engine abgestürzt ist oder nicht starten konnte." #. undo button on the right msgid "undo-button-text" @@ -131,17 +131,17 @@ msgid "tab:notes" msgstr "Anmerkungen" msgid "closedlabel:scoregraph" -msgstr "Punkte Graph" +msgstr "Punkte-Graph" #. on the graph msgid "Jigo" msgstr "Jigo" msgid "closedlabel:movestats" -msgstr "Zug Statistik" +msgstr "Zug-Statistik" msgid "closedlabel:info¬es" -msgstr "Zug Info & Anmerkungen" +msgstr "Zug-Info & Anmerkungen" #. on the board after passing once/twice msgid "board-pass" @@ -149,7 +149,7 @@ msgstr "Passen" msgid "board-game-end" msgstr "" -"Partie\n" +"Partie-\n" "Ende" #. Select mode @@ -178,8 +178,8 @@ msgstr "Punkte gewonnen" #. SGF and move comment messages msgid "SGF start message" msgstr "" -"Züge, die mit 'X' markiert sind, sind die besten Züge für KataGo, die " -"miteinem Quadrat sind Züge, die wenige als 0.5 Punkte verlieren." +"Züge, die mit 'X' markiert sind, sind die besten Züge für KataGo; die mit " +"einem Quadrat sind Züge, die weniger als 0.5 Punkte verlieren." msgid "Info:score" msgstr "Ergebnis: {score}" @@ -195,7 +195,7 @@ msgid "move" msgstr "Zug {number}" msgid "Info:top move" -msgstr "Bestvorhergesagte Zug war {top_move} ({score})." +msgstr "Bestvorhergesagter Zug war {top_move} ({score})." msgid "Info:best move" msgstr "Zug war der bestvorhergesagte Zug" @@ -204,7 +204,7 @@ msgid "Info:PV" msgstr "PV: {pv}" msgid "Info:policy rank" -msgstr "Zug war #{rank} gemäss Policy ({probability:.2%})." +msgstr "Zug war #{rank} gemäß Policy ({probability:.2%})." msgid "Info:policy best" msgstr "Bester Policy-Zug war {move} ({probability:.1%})." @@ -225,11 +225,11 @@ msgid "Analyzing move..." msgstr "Zug wird analysiert..." msgid "SGF Notes Hint" -msgstr "Deine SGF Anmerkungen für diese Position." +msgstr "Deine SGF-Anmerkungen für diese Position." # sgf load popup msgid "load sgf title" -msgstr "SGF File für Analyse laden" +msgstr "SGF-Datei für Analyse laden" msgid "load sgf fast analysis" msgstr "Schnelle Analyse verwenden" @@ -239,10 +239,10 @@ msgstr "Am Anfang beginnen" # timer settings from here msgid "timer settings" -msgstr "Timereinstellungen Anpassen" +msgstr "Timereinstellungen anpassen" msgid "byoyomi length" -msgstr "Zeit pro Byo-yomi Periode" +msgstr "Zeit pro Byo-yomi-Periode" msgid "byoyomi periods" msgstr "Anzahl Perioden" @@ -256,10 +256,10 @@ msgstr "Timer aktualisieren" # new game settings from here msgid "New Game title" -msgstr "Neues Spiel Einstellen" +msgstr "Neues Spiel erstellen" msgid "board size" -msgstr "Brettgrösse" +msgstr "Brettgröße" msgid "handicap" msgstr "Vorgabe" @@ -298,14 +298,14 @@ msgstr "Benutze x:y (z.B. 19:9) für nichtquadratische Grössen" #. submit new game msgid "new game" -msgstr "Neues Spiel Starten" +msgstr "Neues Spiel starten" # teacher settings from here msgid "teacher settings" -msgstr "Übungsspieleinstellungen Bearbeiten" +msgstr "Übungsspieleinstellungen bearbeiten" msgid "point loss threshold" -msgstr "Punktverlust grösser als" +msgstr "Punktverlust größer als" msgid "num undos" msgstr "Anzahl der Undos" @@ -326,7 +326,7 @@ msgstr "" msgid "show ai dots" msgstr "" -"Dots/SGF Kommentare \n" +"Dots/SGF-Kommentare \n" " für AI Spieler zeigen" msgid "lock ai when playing" @@ -340,11 +340,11 @@ msgstr "Feedbackeinstellungen aktualisieren" # main config settings msgid "restarting engine" -msgstr "Engine nach Änderunge der Einstellungen neustarten." +msgstr "Engine nach Änderungen der Einstellungen neustarten." # title msgid "general settings title" -msgstr "Allgemeine und Engine Einstellungen" +msgstr "Allgemeine und Engine-Einstellungen" msgid "file not found" msgstr "Pfad existiert nicht" @@ -353,25 +353,25 @@ msgid "general settings" msgstr "Allgemeine Einstellungen" msgid "engine settings" -msgstr "Engine Einstellungen" +msgstr "Engine-Einstellungen" msgid "katago settings" -msgstr "KataGo Einstellungen" +msgstr "KataGo-Einstellungen" msgid "config file path" msgstr "Alle Optionen sind gespeichert in:" msgid "engine:katago" -msgstr "Pfad zur KataGo Datei" +msgstr "Pfad zur KataGo-Datei" msgid "engine:katago:hint" -msgstr "Leer = beigefügte Datei verwenden." +msgstr "Leer = beigefügte Datei verwenden" msgid "engine:model" -msgstr "Pfad zur KataGo Model Datei" +msgstr "Pfad zur KataGo-Model-Datei" msgid "engine:config" -msgstr "Pfad zur KataGo Config Datei" +msgstr "Pfad zur KataGo-Config-Datei" msgid "engine:max_visits" msgstr "Maximale Anzahl der Visits in Analyse" @@ -394,16 +394,16 @@ msgid "engine:time:hint" msgstr "Zeit in Sekunden" msgid "general:sgf_load" -msgstr "Pfad um SGF Dateien zu laden" +msgstr "Pfad um SGF-Dateien zu laden" msgid "general:sgf_save" -msgstr "Pfad um SGF Dateien zu speichern" +msgstr "Pfad um SGF-Dateien zu speichern" msgid "general:anim_pv_time" msgstr "Zeit zwischen Zügen, wenn Sequenz animiert wird" msgid "general:debug_level" -msgstr "Debug level in der Konsole" +msgstr "Debuglevel in der Konsole" msgid "general:debug_level:hint" msgstr "Auf 1 setzen, wenn Fehler gemeldet werden sollen" @@ -413,13 +413,13 @@ msgstr "Einstellungen aktualisieren" # ai settings from here msgid "ai settings" -msgstr "Erweiterte AI Einstellungen" +msgstr "Erweiterte AI-Einstellungen" msgid "Select AI" -msgstr "AI Strategie zum Konfigurieren auswählen" +msgstr "AI-Strategie zum Konfigurieren auswählen" msgid "update ai settings" -msgstr "AI Einstellungen aktualisieren" +msgstr "AI-Einstellungen aktualisieren" #. misc errors and info messages msgid "sgf written" @@ -443,13 +443,13 @@ msgstr "SGF konnte nicht geladen werde: {error}" msgid "Starting Kata failed" msgstr "" "Der Start von KataGo mit Befehl '{command}' ist fehlgeschlagen mit Fehler " -"{error}.Bitte überprüfe, dass der 'katago' Wert in 'engine' bei den " -"Einstellungen aufdas richtige KataGo File zeigt." +"{error}. Bitte überprüfe, dass der Wert 'katago' in 'engine' bei den " +"Einstellungen auf die richtige KataGo-Datei zeigt." msgid "Engine died unexpectedly" msgstr "" -"Engine ist unerwartet abgestürzt ohne Ausgabe zu senden,wahrscheinlich wegen" -" zu wenig Speicher: {error}" +"Engine ist unerwartet abgestürzt, ohne Ausgabe zu senden, wahrscheinlich " +"wegen zu wenig Speicher: {error}" #. AI names, help etc msgid "strength:kyu" @@ -463,8 +463,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" @@ -498,9 +498,9 @@ msgstr "Policy Gewichtet" msgid "aihelp:p:weighted" msgstr "" -"Wählt den Zug gemäss der Policy-Wahrscheinlichkeit, beeinflusst durch " +"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 `Policy` AI. `pick_override` legt fest, wann der" +"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." @@ -510,50 +510,50 @@ msgstr "Blinde Policy" msgid "aihelp:p:pick" msgstr "" "Wählt `pick_n + pick_frac * ` gewichtete Züge " -"zufälligund spielt den Besten. Spielt wie die Policy AI, wenn `pick_frac=1`." -" Spielt besten Zug, wenn Policy-Wert höher als `pick_override` ist, um " -"offensichtliche Fehler zu vermeiden." +"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" msgstr "Lokaler Stil" msgid "aihelp:p:local" msgstr "" -"Wählt `pick_n + pick_frac * ` gewichtete Züge nahedem" -" letzten Zug und spielt den Besten. Spielt besten Zug, wenn Policy-Wert " +"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." msgid "ai:p:tenuki" -msgstr "Tenuki Stil" +msgstr "Tenuki-Stil" msgid "aihelp:p:tenuki" msgstr "" -"Wählt `pick_n + pick_frac * ` gewichtete Züge " -"fernvomletzten 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." +"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." msgid "ai:p:influence" 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 Strategie " -"nach dem der 'endgame' Anteil des Brettes gefüllt ist." +"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 " +"Strategie nachdem der 'endgame'-Anteil des Brettes gefüllt ist." msgid "ai:p:territory" 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 Strategie " -"nach dem der 'endgame' Anteil des Brettes gefüllt ist." +"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 " +"Strategie nachdem der 'endgame'-Anteil des Brettes gefüllt ist." msgid "aihelp:p:rank" msgstr "" -"Wählt eine begrenzte Anzahl zufälliger Züge und spielt den Besten. Stärkere " +"Wählt eine begrenzte Anzahl zufälliger Züge und spielt den besten. Stärkere " "Einstellungen wählen den besten Zug aus einer grösseren Auswahl. Da es " "keinen 0 Kyu/Dan gibt, ist 3 Dan = -2 Kyu." @@ -567,23 +567,23 @@ msgstr "Details" msgid "Kata exe not found" msgstr "" -"KataGo binary {exe} nicht gefunden, bitte prüfe Allgemeine Einstellungen." +"KataGo-Binary {exe} nicht gefunden, bitte prüfe allgemeine Einstellungen." msgid "Kata config not found" msgstr "" -"KataGo config Datei {config} nicht gefunden, bitte prüfe Allgemeine " +"KataGo-Konfigurationsdatei {config} nicht gefunden, bitte prüfe allgemeine " "Einstellungen." msgid "Kata exe not found in path" msgstr "" -"KataGo binary {exe} nicht im PATH gefunden, prüfe deine Umgebungs- variablen" -" oder benutze den vollen Pfad in den Allgemeinen Einstellungen. Wenn unter " -"MacOS, konsultiere das Handbuch wie brew verwendet werden soll, um KataGo zu" -" installieren." +"KataGo-Binary {exe} nicht im PATH gefunden, prüfe deine Umgebungsvariablen " +"oder benutze den vollen Pfad in den allgemeinen Einstellungen. Wenn unter " +"MacOS, konsultiere das Handbuch, wie brew verwendet werden soll, um KataGo " +"zu installieren." msgid "Kata model not found" msgstr "" -"KataGo model {model} nicht gefunden, bitte prüfe Allgemeine Einstellungen." +"KataGo-Modell {model} nicht gefunden, bitte prüfe allgemeine Einstellungen." msgid "extra analysis" msgstr "Erweiterte Analyse wird ausgeführt mit {visits} Visits" @@ -616,13 +616,14 @@ msgid "analysis:continuous" msgstr "Kontinuierliche Analyse ein/aus" msgid "ai:handicap" -msgstr "KataHandicap" +msgstr "Kata-Vorgabesteine" msgid "aihelp:handicap" msgstr "" -"Optimiertes KataGo für höhere Handicap Spiele.Die pda Einstellungentspricht " -"playoutDoublingAdvantage in KataGo, aus Sicht von Schwarz.Wenn automatic " -"eingestellt ist, wird KaTrain automatischeinen geeigneten Wert finden." +"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" msgstr "Geschätzte Spielstärke" @@ -644,7 +645,7 @@ msgstr "Farbschema" msgid "engine:altcommand:hint" msgstr "" -"Kompletter Befehl um die Engine zu starten. Alle anderen Modelloptionen " +"Kompletter Befehl, um die Engine zu starten. Alle anderen Modelloptionen " "werden ignoriert." msgid "engine:altcommand" @@ -664,8 +665,8 @@ msgstr "Alle verfügbaren Programme wurden bereits heruntergeladen" msgid "Engine missing DLL" msgstr "" -"Konnte KataGo wegen fehlender DLL nicht starten. Überprüf die Anforderungen " -"in der KataGo-Dokumentation oder versuch, KataGo alleine zu starten, um " +"Konnte KataGo wegen fehlender DLL nicht starten. Überprüfe die Anforderungen" +" in der KataGo-Dokumentation oder versuche, KataGo alleine zu starten, um " "Einzelheiten zu erfahren." msgid "teaching undo message" @@ -689,20 +690,20 @@ msgstr "Suche nach alternativen Zügen" #. TODO - ignore moves if timer is on and less than this is used msgid "minimal time use" -msgstr "Minimal time use in byo-yomi (s)" +msgstr "Mindest-Zeitnutzung im Byo-Yomi (s)" msgid "move too fast" msgstr "Denke mindestens {num} Sekunden nach, bevor Du setzt." msgid "main time" -msgstr "Hauptbedenkzeit (Min.)" +msgstr "Hauptbedenkzeit (min)" msgid "aihelp:simple" msgstr "" "Spielt Züge, die dazu zu einer Vereinfachung des Brettzustandes führen. Von " -"Zügen,die höchstens 'max_points_lost' Punkte verlieren und mit wenigstens " -"'min_visits' Visits, bevorzuge die Züge, die weniger Punkte verlieren " -"undeigenes Gebiet mehr sichern." +"Zügen, die höchstens 'max_points_lost' Punkte verlieren und mit wenigstens " +"'min_visits' Visits, bevorzuge die Züge, die weniger Punkte verlieren und " +"eigenes Gebiet mehr sichern." msgid "ai:simple" msgstr "Einfacher Stil" @@ -718,105 +719,106 @@ msgstr "" msgid "Make Main Branch" msgstr "Zum Hauptzweig machen" -#. TODO - setting: what to show on top move (e.g. point loss, visits, ...) +#. setting: what to show on top move (e.g. point loss, visits, ...) msgid "stats on top move" -msgstr "Stats on top moves" +msgstr "Anzeige für den besten Zug" #. TODO - Dropdown menu option msgid "top_move_delta_winrate" -msgstr "Change in Win Rate" +msgstr "Änderung der Gewinnrate" -#. TODO - Dropdown menu option +#. Dropdown menu option msgid "top_move_visits" msgstr "Visits" -#. TODO - Dropdown menu option +#. Dropdown menu option msgid "top_move_score" msgstr "Score" -#. TODO - Dropdown menu option +#. Dropdown menu option msgid "top_move_nothing" -msgstr "(nothing)" +msgstr "(nichts)" -#. TODO - Dropdown menu option +#. Dropdown menu option msgid "top_move_winrate" -msgstr "Win Rate" +msgstr "Gewinnrate" -#. TODO - Dropdown menu option +#. Dropdown menu option msgid "top_move_delta_score" -msgstr "Change in Score" +msgstr "Punktänderung" -#. TODO - top move stats show threshold description +#. top move stats show threshold description msgid "show stats if" -msgstr "Show stats if more than ... visits" +msgstr "Zeige Bewertung wenn mehr als ... Visits" -#. TODO - analysis option +#. analysis option msgid "cache analysis to sgf" -msgstr "Cache analysis in SGF" +msgstr "Cache-Analyse in SGF" -#. TODO +#. Speichern als msgid "menu:save-as" -msgstr "Save Game As..." +msgstr "Spiel speichern als..." -#. TODO +#. Laden # sgf load button msgid "Load File" -msgstr "Load File" +msgstr "Spiel laden" -#. TODO +#. Save SGF (Popup) # sgf save popup msgid "save sgf title" -msgstr "Save SGF File" +msgstr "SGF-Datei speichern" -#. TODO -# sgf save as button +#. Save button +# sgf save button msgid "Save File" -msgstr "Save File" +msgstr "Datei speichern" -#. TODO - status message on starting insert mode +#. Status message on starting insert mode msgid "starting insert mode" -msgstr "Starting insert mode, press 'i' to finish inserting." +msgstr "Starte Einfüge-Modus; drücke 'i' zum beenden" -#. TODO - status message on ending insert mode and copying the moves +#. Status message on ending insert mode and copying the moves msgid "ending insert mode" -msgstr "Inserting exchange(s) done, copied {num_copied} following moves." +msgstr "Einfügen beendet, {num_copied} Züge kopiert" -#. TODO - when a user tries to go to a different move/node while in insert +#. When a user tries to go to a different move/node while in insert #. mode msgid "finish inserting before navigating" msgstr "" -"Navigation is disabled in insert mode, finish insert mode by pressing 'i'. " +"Navigation ist im Einfüge-Modus deaktiviert, beende erst Einfüge-Modus durch" +" Drücken von 'i'" -#. TODO - in new game options +#. In new game options msgid "player names" -msgstr "Player Names" +msgstr "Spielernamen" -#. TODO - Option in dropdown to insert some moves between the current and next +#. Option in dropdown to insert some moves between the current and next msgid "analysis:insert" -msgstr "Insert moves" +msgstr "Züge einfügen" -#. TODO - Status message +#. Status message msgid "analysis:region:start" msgstr "" -"Drag to select the region of interest. Select a single point to cancel the " -"region." +"Ziehen, um einen Bereich zu markieren. Wähle einen einzelnen Punkt, um die " +"Bereichsauswahl abzubrechen." -#. TODO - Restrict analysis to a specific region +#. Restrict analysis to a specific region msgid "analysis:region" -msgstr "Set region of interest" +msgstr "Bereich auswählen" -#. TODO - on move tree editing +#. on move tree editing msgid "Toggle Collapse Branch" -msgstr "Expand/Collapse" +msgstr "Aus-/Einklappen" -#. TODO - Menu option +#. Menu option msgid "analysis:playtoend" -msgstr "Fast playout to game end" +msgstr "Schnelles Ausspielen bis Spielende" -#. TODO - hint on player name input +#. Hint on player name input msgid "black player name hint" -msgstr "Black player's name" +msgstr "Name von Schwarz" -#. TODO - hint on player name input +#. Hint on player name input msgid "white player name hint" -msgstr "White player's name" +msgstr "Name von Weiß" diff --git a/katrain/i18n/locales/ru/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/ru/LC_MESSAGES/katrain.mo index 2f30569..b583b4c 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 e4f851b..2a3e83f 100644 --- a/katrain/i18n/locales/ru/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/ru/LC_MESSAGES/katrain.po @@ -26,7 +26,7 @@ msgid "menu:clocksettings" msgstr "Контроль времени" msgid "menu:teachsettings" -msgstr "Настройки обучающей игры" +msgstr "Настройки анализа" msgid "menu:aisettings" msgstr "Настройки ИИ" @@ -325,7 +325,7 @@ msgstr "Начать новую игру" # teacher settings from here msgid "teacher settings" -msgstr "Редактировать настройки учителя" +msgstr "Редактировать настройки анализа" msgid "point loss threshold" msgstr "Потеря очков более" @@ -360,7 +360,7 @@ msgstr "" #. submit button msgid "update teacher" -msgstr "Сохранить настройки обратной связи" +msgstr "Сохранить настройки анализа" # main config settings msgid "restarting engine" @@ -717,105 +717,79 @@ msgstr "" msgid "Make Main Branch" msgstr "Сделать главной веткой" -#. TODO - setting: what to show on top move (e.g. point loss, visits, ...) msgid "stats on top move" -msgstr "Stats on top moves" +msgstr "Показывать числа поверх ходов" -#. TODO - Dropdown menu option msgid "top_move_delta_winrate" -msgstr "Change in win rate" +msgstr "Изменение процента" -#. TODO - Dropdown menu option msgid "top_move_visits" -msgstr "Visits" +msgstr "Посещения" -#. TODO - Dropdown menu option msgid "top_move_score" -msgstr "Score" +msgstr "Счёт" -#. TODO - Dropdown menu option msgid "top_move_nothing" msgstr "-" -#. TODO - Dropdown menu option msgid "top_move_winrate" -msgstr "Win rate" +msgstr "Процент побед" -#. TODO - Dropdown menu option msgid "top_move_delta_score" -msgstr "Change in score" +msgstr "Изменение счёта" -#. TODO - top move stats show threshold description msgid "show stats if" -msgstr "Show stats if more than ... visits" +msgstr "Числа только если посещений больше чем" -#. TODO - analysis option msgid "cache analysis to sgf" -msgstr "Cache analysis in SGF" +msgstr "Кэшировать анализ в SGF" -#. TODO msgid "menu:save-as" -msgstr "Save Game As..." +msgstr "Сохранить игру как..." -#. TODO # sgf load button msgid "Load File" -msgstr "Load File" +msgstr "Загрузить файл" -#. TODO # sgf save popup msgid "save sgf title" -msgstr "Save SGF File" +msgstr "Сохранить SGF файл" -#. TODO # sgf save as button msgid "Save File" -msgstr "Save File" +msgstr "Сохранить файл" -#. TODO - status message on starting insert mode msgid "starting insert mode" -msgstr "Starting insert mode, press 'i' to finish inserting." +msgstr "Активен режим вставки, нажмите 'i' для завершения." -#. TODO - status message on ending insert mode and copying the moves msgid "ending insert mode" -msgstr "Inserting exchange(s) done, copied {num_copied} following moves." +msgstr "Режим вставки завершён, скопировано {num_copied} следующих ходов." -#. TODO - when a user tries to go to a different move/node while in insert -#. mode msgid "finish inserting before navigating" msgstr "" -"Navigation is disabled in insert mode, finish insert mode by pressing 'i'. " +"Навигация отключена в режиме вставки, сначала завершите режим вставки нажав " +"'i'." -#. TODO - in new game options msgid "player names" -msgstr "Player Names" +msgstr "Имена игроков" -#. TODO - Option in dropdown to insert some moves between the current and next msgid "analysis:insert" -msgstr "Insert moves" +msgstr "Вставить ходы" -#. TODO - Status message msgid "analysis:region:start" -msgstr "" -"Drag to select the region of interest. Select a single point to cancel the " -"region." +msgstr "Выберите регион интереса. Выберите одну точку для сброса региона." -#. TODO - Restrict analysis to a specific region msgid "analysis:region" -msgstr "Set region of interest" +msgstr "Выбрать регион интереса" -#. TODO - on move tree editing msgid "Toggle Collapse Branch" -msgstr "Expand/Collapse" +msgstr "Развернуть/Свернуть" -#. TODO - Menu option msgid "analysis:playtoend" -msgstr "Fast playout to game end" +msgstr "Быстро доиграть до конца" -#. TODO - hint on player name input msgid "black player name hint" -msgstr "Black player's name" +msgstr "Имя игрока чёрными" -#. TODO - hint on player name input msgid "white player name hint" -msgstr "White player's name" +msgstr "Имя игрока белыми" diff --git a/tests/test_parser.py b/tests/test_parser.py index 83f0cc6..cdbfcd4 100644 --- a/tests/test_parser.py +++ b/tests/test_parser.py @@ -152,3 +152,16 @@ def test_foxwq(): while game.current_node.children: assert 1 == len(game.current_node.children) game.redo(1) + + +def test_next_player(): + input_sgf = "(;GM[1]FF[4]AB[aa]AW[bb])" + assert "B" == SGF.parse_sgf(input_sgf).next_player + input_sgf = "(;GM[1]FF[4]AB[aa]AW[bb]PL[B])" + assert "B" == SGF.parse_sgf(input_sgf).next_player + input_sgf = "(;GM[1]FF[4]AB[aa]AW[bb]PL[W])" + assert "W" == SGF.parse_sgf(input_sgf).next_player + input_sgf = "(;GM[1]FF[4]AB[aa])" + assert "W" == SGF.parse_sgf(input_sgf).next_player + input_sgf = "(;GM[1]FF[4]AB[aa]PL[B])" + assert "B" == SGF.parse_sgf(input_sgf).next_player