diff --git a/pythonturtle/application.py b/pythonturtle/application.py
index 3eed35e..540251d 100644
--- a/pythonturtle/application.py
+++ b/pythonturtle/application.py
@@ -33,8 +33,37 @@ class ApplicationWindow(wx.Frame):
The main window of PythonTurtle.
"""
+ def init_locale(self):
+
+ self.languages = {
+ "System default" : wx.LANGUAGE_DEFAULT,
+ "English" : wx.LANGUAGE_ENGLISH,
+ "French" : wx.LANGUAGE_FRENCH,
+ }
+ self.locale = wx.Locale()
+ self.locale.AddCatalogLookupPathPrefix("./pythonturtle/locale")
+
+ #asked_lang = "French" # TODO implement config file + settings
+ #lang = self.languages[asked_lang]
+ lang = self.languages["System default"]
+
+ if lang == wx.LANGUAGE_ENGLISH:
+ return
+
+ if not self.locale.Init(lang):
+ wx.LogWarning("This language is not supported by the system, falls back to English.")
+ return
+
+ if not self.locale.AddCatalog("turtle"):
+ wx.LogError("Couldn't find the catalog for locale '" + self.locale.GetCanonicalName() + "', falls back to English.")
+ return
+
+
def __init__(self, *args, **keywords):
wx.Frame.__init__(self, *args, **keywords)
+
+ self.init_locale()
+
self.SetDoubleBuffered(True)
self.SetIcon(wx.Icon(resource_filename("icon.ico"),
wx.BITMAP_TYPE_ICO))
@@ -105,28 +134,30 @@ def init_menu_bar(self):
"""
Initialize the menu bar.
"""
+ _ = wx.GetTranslation
+
self.menu_bar = wx.MenuBar()
self.file_menu = wx.Menu()
- self.exit_menu_item = wx.MenuItem(self.file_menu, -1, 'E&xit')
+ self.exit_menu_item = wx.MenuItem(self.file_menu, -1, _('E&xit'))
self.file_menu.Append(self.exit_menu_item)
self.Bind(wx.EVT_MENU, self.on_exit, source=self.exit_menu_item)
self.help_menu = wx.Menu()
self.help_menu_item = \
- wx.MenuItem(self.help_menu, -1, '&Help\tF1', kind=wx.ITEM_CHECK)
+ wx.MenuItem(self.help_menu, -1, _('&Help\tF1'), kind=wx.ITEM_CHECK)
self.help_menu.Append(self.help_menu_item)
self.Bind(wx.EVT_MENU, self.toggle_help, source=self.help_menu_item)
self.help_menu.AppendSeparator()
- self.about_menu_item = wx.MenuItem(self.help_menu, -1, "&About...")
+ self.about_menu_item = wx.MenuItem(self.help_menu, -1, _("&About..."))
self.help_menu.Append(self.about_menu_item)
self.Bind(wx.EVT_MENU, self.on_about, source=self.about_menu_item)
- self.menu_bar.Append(self.file_menu, '&File')
- self.menu_bar.Append(self.help_menu, '&Help')
+ self.menu_bar.Append(self.file_menu, _('&Turtle'))
+ self.menu_bar.Append(self.help_menu, _('&Help'))
self.SetMenuBar(self.menu_bar)
diff --git a/pythonturtle/locale/fr_FR/LC_MESSAGES/turtle.po b/pythonturtle/locale/fr_FR/LC_MESSAGES/turtle.po
new file mode 100644
index 0000000..7d80794
--- /dev/null
+++ b/pythonturtle/locale/fr_FR/LC_MESSAGES/turtle.po
@@ -0,0 +1,136 @@
+# PythonTurtle internationalization
+# Copyright (C) 2022 nojhan
+# nojhan 2022
+msgid ""
+msgstr ""
+"Project-Id-Version: PythonTurtle\n"
+"POT-Creation-Date: 2022-01-09 17:20+0100\n"
+"PO-Revision-Date: 2022-01-09 17:20+0100\n"
+"Last-Translator: nojhan \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: pygettext.py 1.5\n"
+"Language-Team: French\n"
+"Language: fr\n"
+
+msgid "E&xit"
+msgstr "&Quitter"
+
+msgid "&Help\tF1"
+msgstr "&Aide\tF1"
+
+msgid "&Help"
+msgstr "&Aide"
+
+msgid "&About..."
+msgstr "Ã &Propos..."
+
+msgid "&Turtle"
+msgstr "&Tortue"
+
+msgid "go"
+msgstr "avance"
+
+msgid "turn"
+msgstr "tourne"
+
+msgid "color"
+msgstr "couleur"
+
+msgid "width"
+msgstr "largeur"
+
+msgid "visible"
+msgstr "visible"
+
+msgid "invisible"
+msgstr "invisible"
+
+msgid "pen_down"
+msgstr "stylo_bas"
+
+msgid "pen_up"
+msgstr "stylo_haut"
+
+msgid "is_visible"
+msgstr "est_visible"
+
+msgid "is_pen_down"
+msgstr "stylo_est_bas"
+
+msgid "sin"
+msgstr "sin"
+
+msgid "cos"
+msgstr "cos"
+
+msgid "turtle"
+msgstr "tortue"
+
+msgid "clear"
+msgstr "efface"
+
+msgid "reset"
+msgstr "reset"
+
+msgid "do"
+msgstr "fait"
+
+msgid "repeat"
+msgstr "répéte"
+
+# go(40)
+msgid "G"
+msgstr "A"
+# Avance
+
+# go(20)
+msgid "g"
+msgstr "a"
+# avance
+
+# turn(-90)
+msgid "L"
+msgstr "G"
+# Gauche
+
+# turn(-45)
+msgid "l"
+msgstr "g"
+# gauche
+
+# turn(90)
+msgid "R"
+msgstr "D"
+# Droite
+
+# turn(45)
+msgid "r"
+msgstr "d"
+# droite
+
+# pen_up()
+msgid "U"
+msgstr "L"
+# lever
+
+# pen_down()
+msgid "D"
+msgstr "B"
+# baisser
+
+# reset() (clear)
+msgid "C"
+msgstr "E"
+# efface
+
+# repeat
+msgid "P"
+msgstr "R"
+# Répète
+
+# do
+msgid "O"
+msgstr "F"
+# fait
diff --git a/pythonturtle/turtleprocess.py b/pythonturtle/turtleprocess.py
index 91a8f70..9a320dd 100644
--- a/pythonturtle/turtleprocess.py
+++ b/pythonturtle/turtleprocess.py
@@ -8,6 +8,7 @@
import sys
import time
import builtins
+import wx
from . import shelltoprocess
from .misc import smartsleep
@@ -84,6 +85,14 @@ def go(distance):
self.turtle.pos += last_step
self.send_report()
+ def g():
+ """Walk of a reasonable distance."""
+ go(20)
+
+ def G():
+ """Walk of a diagonal's distance."""
+ go(20*math.sqrt(2))
+
def turn(angle):
"""
Makes the turtle turn. Specify angle in degrees. A positive
@@ -110,6 +119,21 @@ def turn(angle):
self.turtle.orientation += last_step
self.send_report()
+ def t(a):
+ turn(a)
+
+ def R():
+ t(90)
+
+ def r():
+ t(45)
+
+ def L():
+ t(-90)
+
+ def l():
+ t(-45)
+
def color(color):
"""
Sets the color of the turtle's pen. Specify a color as a string.
@@ -156,6 +180,9 @@ def pen_down(down=True):
self.turtle.pen_down = down
self.send_report()
+ def D():
+ pen_down()
+
def pen_up():
"""
Puts the pen in the "up" position, making the turtle not leave a
@@ -164,6 +191,9 @@ def pen_up():
self.turtle.pen_down = False
self.send_report()
+ def U():
+ pen_up()
+
def is_visible():
"""
Returns whether the turtle is visible.
@@ -221,26 +251,57 @@ def reset():
self.turtle = Turtle()
clear()
+ def C():
+ reset()
+
+ def do(cmd):
+ for c in cmd:
+ locals_for_console[c]()
+
+ def repeat(cmd,times=2):
+ for i in range(times):
+ do(cmd)
+
+ def P(cmd,times=2):
+ repeat(cmd,times)
+
+ _ = wx.GetTranslation
+
locals_for_console = {
- "go": go,
- "turn": turn,
- "color": color,
- "width": width,
- "visible": visible,
- "invisible": invisible,
- "pen_down": pen_down,
- "pen_up": pen_up,
- "is_visible": is_visible,
- "is_pen_down": is_pen_down,
- "sin": sin,
- "cos": cos,
- "turtle": self.turtle,
- "clear": clear,
- "reset": reset,
+ _("go"): go,
+ _("turn"): turn,
+ _("color"): color,
+ _("width"): width,
+ _("visible"): visible,
+ _("invisible"): invisible,
+ _("pen_down"): pen_down,
+ _("pen_up"): pen_up,
+ _("is_visible"): is_visible,
+ _("is_pen_down"): is_pen_down,
+ _("sin"): sin,
+ _("cos"): cos,
+ _("turtle"): self.turtle,
+ _("clear"): clear,
+ _("reset"): reset,
+ _("do") : do,
+ _("repeat"): repeat,
+ _("do") : do,
+ _("O") : do,
+ _("g") : g, # go(20)
+ _("G") : G, # go(20â2) [for diagonals]
+ _("L") : L, # turn(-90)
+ _("l") : l, # turn(-45)
+ _("R") : R, # turn(90)
+ _("r") : r, # turn(45)
+ _("U") : U, # pen_up
+ _("D") : D, # pen_down
+ _("C") : C, # reset (clear)
+ _("P") : P, # repeat(cmd,times=2)
+
}
# A little thing I tried doing for checking if a color is
- # valid before setting it to the turtle. Didn't work.
+ # valid before setting itPto the turtle. Didn't work.
# import wx; app=wx.App();
# def valid_color(color):
# return not wx.Pen(color).GetColour() == \