From 495f8898ac64a8f92f0d001ac86694d79f641161 Mon Sep 17 00:00:00 2001
From: Pierre-Antoine Rouby <pierre-antoine.rouby@inrae.fr>
Date: Mon, 27 Mar 2023 17:27:03 +0200
Subject: [PATCH] ui: Set language at starup and change during execution (don't
 works).

---
 src/lang/create_ts.sh          |  2 +-
 src/pamhyr.py                  |  5 ++++-
 src/view/MainWindow.py         | 29 +++++++++++++++++++++++++++++
 src/view/ui/ConfigureDialog.ui | 17 ++++++++++-------
 src/view/ui/MainWindow.ui      | 21 +++++++++++++++++++++
 5 files changed, 65 insertions(+), 9 deletions(-)

diff --git a/src/lang/create_ts.sh b/src/lang/create_ts.sh
index c617d22a..c3019916 100755
--- a/src/lang/create_ts.sh
+++ b/src/lang/create_ts.sh
@@ -3,7 +3,7 @@
 SOURCES=$(find ../ -name "*.py")
 FROM=$(find ../ -name "*.ui")
 
-LANG="fr de"
+LANG="fr"
 
 for l in $LANG
 do
diff --git a/src/pamhyr.py b/src/pamhyr.py
index 439872a8..3c02c327 100755
--- a/src/pamhyr.py
+++ b/src/pamhyr.py
@@ -2,6 +2,7 @@
 # -*- coding: utf-8 -*-
 
 import sys, os
+import locale
 
 from PyQt5.QtCore import QTranslator
 from PyQt5.QtWidgets import QApplication
@@ -15,7 +16,9 @@ def main():
     app = QApplication(sys.argv)
 
     translator = QTranslator()
-    translator.load(os.path.dirname(__file__) + "/lang/fr.qm")
+    lang = locale.getdefaultlocale()
+    if "fr" not in lang[0]:
+        translator.load(os.path.dirname(__file__) + "/lang/fr.qm")
     app.installTranslator(translator)
 
     application = ApplicationWindow(conf=conf)
diff --git a/src/view/MainWindow.py b/src/view/MainWindow.py
index 24a70235..222415d6 100644
--- a/src/view/MainWindow.py
+++ b/src/view/MainWindow.py
@@ -3,6 +3,9 @@
 import os
 
 from PyQt5 import QtGui
+from PyQt5.QtCore import (
+    QTranslator, QEvent
+)
 from PyQt5.QtWidgets import (
     QMainWindow, QApplication, QAction,
     QFileDialog,
@@ -61,6 +64,8 @@ class ApplicationWindow(QMainWindow, ListedSubWindow):
 
         self.init_callback()
         self.default_style()
+
+        self.trans = QTranslator(self)
         #self.ui.retranslateUi()
 
     def enable_actions(self, action:str, enable:bool):
@@ -110,12 +115,36 @@ class ApplicationWindow(QMainWindow, ListedSubWindow):
             "action_toolBar_sections": lambda: self.open_dummy("Tronçons"),
             "action_toolBar_frictions": lambda: self.open_dummy("Frottements"),
             "action_toolBar_building": lambda: self.open_dummy("Ouvrages"),
+            ## Language
+            "action_english": lambda: self.set_language(""),
+            "action_french": lambda: self.set_language("fr"),
         }
 
         for action in actions:
             self.ui.findChild(QAction, action)\
                    .triggered.connect(actions[action])
 
+    def set_language(self, lang):
+        if lang != "":
+            translator = QTranslator()
+            translator.load(os.path.dirname(__file__) + f"/lang/{lang}.qm")
+            QApplication.instance().installTranslator(translator)
+            self.trans = translator
+        else:
+            QApplication.instance().removeTranslator(self.trans)
+
+        self.retranslateUi()
+
+    def retranslateUi(self):
+        for action in self.menubar.children():
+            if isinstance(action, QAction):
+                action.setText(self.trans("MainWindow", action.getText()))
+
+    def changeEvent(self, event):
+        if event.type() == QEvent.LanguageChange:
+            self.retranslateUi()
+        super(ApplicationWindow, self).changeEvent(event)
+
     def default_style(self):
         """Set default window style
 
diff --git a/src/view/ui/ConfigureDialog.ui b/src/view/ui/ConfigureDialog.ui
index cc461673..77a43e43 100644
--- a/src/view/ui/ConfigureDialog.ui
+++ b/src/view/ui/ConfigureDialog.ui
@@ -13,6 +13,9 @@
   <property name="windowTitle">
    <string>Dialog</string>
   </property>
+  <property name="locale">
+   <locale language="English" country="Europe"/>
+  </property>
   <layout class="QGridLayout" name="gridLayout">
    <item row="0" column="0">
     <layout class="QVBoxLayout" name="verticalLayout">
@@ -106,7 +109,7 @@
        </widget>
        <widget class="QWidget" name="tab_mailleur">
         <attribute name="title">
-         <string>Mailleur</string>
+         <string>Meshing tool</string>
         </attribute>
         <widget class="QWidget" name="layoutWidget">
          <property name="geometry">
@@ -121,7 +124,7 @@
           <item>
            <widget class="QLabel" name="label">
             <property name="text">
-             <string>Mailleur path</string>
+             <string>Meshing tool path</string>
             </property>
            </widget>
           </item>
@@ -161,14 +164,14 @@
             <item>
              <widget class="QLabel" name="label_2">
               <property name="text">
-               <string>Nombre de segment</string>
+               <string>Segment number</string>
               </property>
              </widget>
             </item>
             <item>
              <widget class="QLabel" name="label_3">
               <property name="text">
-               <string>Taille max. du listing</string>
+               <string>Listing maximum size</string>
               </property>
              </widget>
             </item>
@@ -214,14 +217,14 @@
             <item>
              <widget class="QLabel" name="label_7">
               <property name="text">
-               <string>Sauvegarde automatique</string>
+               <string>Auto save</string>
               </property>
              </widget>
             </item>
             <item>
              <widget class="QLabel" name="label_8">
               <property name="text">
-               <string>Chemin</string>
+               <string>Path</string>
               </property>
              </widget>
             </item>
@@ -246,7 +249,7 @@
             <item>
              <widget class="QCheckBox" name="checkBox_backup">
               <property name="text">
-               <string>Activé</string>
+               <string>Enable</string>
               </property>
               <property name="tristate">
                <bool>false</bool>
diff --git a/src/view/ui/MainWindow.ui b/src/view/ui/MainWindow.ui
index 8ccb78f6..41ce2ca6 100644
--- a/src/view/ui/MainWindow.ui
+++ b/src/view/ui/MainWindow.ui
@@ -201,6 +201,16 @@
     <addaction name="action_menu_help_mage"/>
     <addaction name="action_menu_about"/>
    </widget>
+   <widget class="QMenu" name="menu_language">
+    <property name="locale">
+     <locale language="English" country="Europe"/>
+    </property>
+    <property name="title">
+     <string>&amp;Language</string>
+    </property>
+    <addaction name="action_english"/>
+    <addaction name="action_french"/>
+   </widget>
    <addaction name="menu_File"/>
    <addaction name="menu_network"/>
    <addaction name="menu_geometry"/>
@@ -208,6 +218,7 @@
    <addaction name="menu_run"/>
    <addaction name="menu_plot"/>
    <addaction name="menu_cartography"/>
+   <addaction name="menu_language"/>
    <addaction name="menu_help"/>
   </widget>
   <widget class="QStatusBar" name="statusbar"/>
@@ -851,6 +862,16 @@
     <string>Edit study</string>
    </property>
   </action>
+  <action name="action_english">
+   <property name="text">
+    <string>English</string>
+   </property>
+  </action>
+  <action name="action_french">
+   <property name="text">
+    <string>French</string>
+   </property>
+  </action>
  </widget>
  <resources/>
  <connections>
-- 
GitLab