Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. Qt for Python
  4. [PyQt5]Problem with translation using tr or translate

[PyQt5]Problem with translation using tr or translate

Scheduled Pinned Locked Moved Unsolved Qt for Python
3 Posts 2 Posters 4.3k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • D Offline
    D Offline
    dancaer69
    wrote on last edited by dancaer69
    #1

    I have a problem with the translation I'm trying to implement with sertain places. The translation works in most places except on a QMessageBox(also on a notify2 implemetation I used before that) and on Tooltip in QSystemTrayIcon.
    I've searched in every place I found for qt and pyqt related forums etc, I've tried many different appraches based on info I found, I've update and recreate .ts/.qm file many times but nothing works.
    I have installed the translator like this:

    def run():
        app = QtWidgets.QApplication(sys.argv)
        app.setStyle("adwaita")
        app.setQuitOnLastWindowClosed(False)
    
        defaultLocale = QLocale.system().name()
        print(defaultLocale)
    
        translator = QTranslator(app)
        if defaultLocale == "el_GR":
            translator.load(":ui/resources/translations/el_GR")
            app.installTranslator(translator)
        app.setApplicationName("Snooze Shutdown")
        app.setApplicationDisplayName("Snooze Shutdown")
        
    
        ui = MainWindow()
        ui.retranslateUi(ui)
        ui.show()
        return app.exec_()
    

    I don't use qt' s .ts files(it doesn't exist for the language I use), but I haven't translation problems with any of the ui items, at least with self(tr), except the places I mentioned above.
    I tried also to use QCoreApplication.translate instead of self(tr), but with this I have more untranslated items.
    The problematic are:
    qmessagebox:
    ```

    def timerDialog(self):
            font = QFont()
            font.setFamily("Ubuntu")
            font.setPointSize(14)
            msg = QMessageBox()
            msg.setIconPixmap(QtGui.QPixmap(":ui/resources/images/snooze.png"))
            msg.setText(self.tr("The countdown timer finished!"))
            msg.setWindowTitle(self.tr("Notification"))
            msg.setStandardButtons(QMessageBox.Close)
            button = msg.button(QMessageBox.Close)
            button.setText(self.tr("Dismiss"))
            msg.setFont(font)
            msg.setStyleSheet("QMessageBox { background-image: url(:ui/resources/images/back.jpg) }");
            QTimer.singleShot(5000, lambda: msg.done(1))
            msg.exec()
    

    nothing get translated in this widget
    QSystemTrayIcon:

    tray_menu = QMenu()
    
            show_action = QAction(restimg, self.tr("Restore"), self)
            logout_action = QAction(logimg, self.tr("Logout now"), self)
            reb_action = QAction(rebimg, self.tr("Reboot now"), self)
            shut_action = QAction(shutimg, self.tr("Shutdown now"), self)
            susp_action = QAction(suspimg, self.tr("Suspend now"), self)
            hide_action = QAction(self.tr("Hide"), self)
            quit_action = QAction(exitimg, self.tr("Exit"), self)
            show_action.triggered.connect(self.show)
            logout_action.triggered.connect(Actions.Logoutcmd)
            reb_action.triggered.connect(Actions.Rebcmd)
            shut_action.triggered.connect(Actions.Shutcmd)
            susp_action.triggered.connect(Actions.Suspcmd)
            hide_action.triggered.connect(self.hide)
            quit_action.triggered.connect(QApplication.instance().quit)
    
            tray_menu.addAction(show_action)
            tray_menu.addSeparator()
            tray_menu.addAction(logout_action)
            tray_menu.addAction(reb_action)
            tray_menu.addAction(shut_action)
            tray_menu.addAction(susp_action)
            tray_menu.addAction(hide_action)
            tray_menu.addSeparator()
            tray_menu.addAction(quit_action)
    
            self.trayicon.activated.connect(self.on_systray_activated)
            self.trayicon.setContextMenu(tray_menu)
            self.trayicon.setToolTip(self.tr("No action have set. Right click to access the menu."))
            self.trayicon.show()
            self.snoozedlg = SnoozeDialog(self)
    

    Here only the Tooltip doesn't translated. But if I use QCoreApplication.translate() with "global" as context, then translation doesn't work for the other items also.
    And while I tried different things I also found a strange behaviour on another string:

    outs = self.tr("The") + " " + s + " " + self.tr("will perform at") + "   " + self.time2Go()
    

    The above appears all translated fine. but if remove the empty spaces and put them as parts of the words( "The ", " will perform at "), then translation doesn't work. Of course I have update the .ts files and also delete all cache files before rerun the application.

    What I'm doing wrong here?
    I had some java and android programming in the past and localization there was quite easy.
    Thanks in advance.

    D 1 Reply Last reply
    0
    • D dancaer69

      I have a problem with the translation I'm trying to implement with sertain places. The translation works in most places except on a QMessageBox(also on a notify2 implemetation I used before that) and on Tooltip in QSystemTrayIcon.
      I've searched in every place I found for qt and pyqt related forums etc, I've tried many different appraches based on info I found, I've update and recreate .ts/.qm file many times but nothing works.
      I have installed the translator like this:

      def run():
          app = QtWidgets.QApplication(sys.argv)
          app.setStyle("adwaita")
          app.setQuitOnLastWindowClosed(False)
      
          defaultLocale = QLocale.system().name()
          print(defaultLocale)
      
          translator = QTranslator(app)
          if defaultLocale == "el_GR":
              translator.load(":ui/resources/translations/el_GR")
              app.installTranslator(translator)
          app.setApplicationName("Snooze Shutdown")
          app.setApplicationDisplayName("Snooze Shutdown")
          
      
          ui = MainWindow()
          ui.retranslateUi(ui)
          ui.show()
          return app.exec_()
      

      I don't use qt' s .ts files(it doesn't exist for the language I use), but I haven't translation problems with any of the ui items, at least with self(tr), except the places I mentioned above.
      I tried also to use QCoreApplication.translate instead of self(tr), but with this I have more untranslated items.
      The problematic are:
      qmessagebox:
      ```

      def timerDialog(self):
              font = QFont()
              font.setFamily("Ubuntu")
              font.setPointSize(14)
              msg = QMessageBox()
              msg.setIconPixmap(QtGui.QPixmap(":ui/resources/images/snooze.png"))
              msg.setText(self.tr("The countdown timer finished!"))
              msg.setWindowTitle(self.tr("Notification"))
              msg.setStandardButtons(QMessageBox.Close)
              button = msg.button(QMessageBox.Close)
              button.setText(self.tr("Dismiss"))
              msg.setFont(font)
              msg.setStyleSheet("QMessageBox { background-image: url(:ui/resources/images/back.jpg) }");
              QTimer.singleShot(5000, lambda: msg.done(1))
              msg.exec()
      

      nothing get translated in this widget
      QSystemTrayIcon:

      tray_menu = QMenu()
      
              show_action = QAction(restimg, self.tr("Restore"), self)
              logout_action = QAction(logimg, self.tr("Logout now"), self)
              reb_action = QAction(rebimg, self.tr("Reboot now"), self)
              shut_action = QAction(shutimg, self.tr("Shutdown now"), self)
              susp_action = QAction(suspimg, self.tr("Suspend now"), self)
              hide_action = QAction(self.tr("Hide"), self)
              quit_action = QAction(exitimg, self.tr("Exit"), self)
              show_action.triggered.connect(self.show)
              logout_action.triggered.connect(Actions.Logoutcmd)
              reb_action.triggered.connect(Actions.Rebcmd)
              shut_action.triggered.connect(Actions.Shutcmd)
              susp_action.triggered.connect(Actions.Suspcmd)
              hide_action.triggered.connect(self.hide)
              quit_action.triggered.connect(QApplication.instance().quit)
      
              tray_menu.addAction(show_action)
              tray_menu.addSeparator()
              tray_menu.addAction(logout_action)
              tray_menu.addAction(reb_action)
              tray_menu.addAction(shut_action)
              tray_menu.addAction(susp_action)
              tray_menu.addAction(hide_action)
              tray_menu.addSeparator()
              tray_menu.addAction(quit_action)
      
              self.trayicon.activated.connect(self.on_systray_activated)
              self.trayicon.setContextMenu(tray_menu)
              self.trayicon.setToolTip(self.tr("No action have set. Right click to access the menu."))
              self.trayicon.show()
              self.snoozedlg = SnoozeDialog(self)
      

      Here only the Tooltip doesn't translated. But if I use QCoreApplication.translate() with "global" as context, then translation doesn't work for the other items also.
      And while I tried different things I also found a strange behaviour on another string:

      outs = self.tr("The") + " " + s + " " + self.tr("will perform at") + "   " + self.time2Go()
      

      The above appears all translated fine. but if remove the empty spaces and put them as parts of the words( "The ", " will perform at "), then translation doesn't work. Of course I have update the .ts files and also delete all cache files before rerun the application.

      What I'm doing wrong here?
      I had some java and android programming in the past and localization there was quite easy.
      Thanks in advance.

      D Offline
      D Offline
      dancaer69
      wrote on last edited by
      #2

      I created a test application using the same code, with just a button which shows the untranslated dialog:

      import os
      import sys
      
      from PyQt5 import QtCore, QtWidgets, QtGui
      from PyQt5.QtCore import QLocale, QTranslator, QTimer, pyqtSlot, QCoreApplication
      from PyQt5.QtGui import QFont
      from PyQt5.QtWidgets import QMainWindow, QMessageBox
      
      from mainwindow import Ui_MainWindow
      
      
      class Main(QMainWindow, Ui_MainWindow):
      
          def __init__(self, parent=None):
      
      
              """
                              Constructor
      
                              @param parent reference to the parent widget
                              @type QWidget
                              """
              super(Main, self).__init__(parent)
              self.setupUi(self)
              self.setWindowFlags(QtCore.Qt.WindowCloseButtonHint)
      
          def timerDialog(self):
              font = QFont()
              font.setFamily("Ubuntu")
              font.setPointSize(14)
              msg = QMessageBox()
              msg.setIconPixmap(QtGui.QPixmap(":ui/resources/images/snooze.png"))
              msg.setText(self.tr("The countdown timer finished!"))
              msg.setWindowTitle(self.tr("Notification"))
              msg.setStandardButtons(QMessageBox.Close)
              button = msg.button(QMessageBox.Close)
              button.setText(self.tr("Dismiss"))
              msg.setFont(font)
              msg.setStyleSheet("QMessageBox { background-image: url(:ui/resources/images/back.jpg) }");
              QTimer.singleShot(5000, lambda: msg.done(1))
              msg.exec()
      
          @pyqtSlot()
          def on_btnexit_clicked(self):
              """
                      Slot documentation goes here.
                      """
              sys.exit()
      
          @pyqtSlot()
          def on_btnmsg_clicked(self):
              """
                      Slot documentation goes here.
                      """
              self.timerDialog()
      
      def run():
          app = QtWidgets.QApplication(sys.argv)
          app.setStyle("adwaita")
          app.setQuitOnLastWindowClosed(False)
      
          defaultLocale = QLocale.system().name()
          print(defaultLocale)
      
          translator = QTranslator(app)
      
          LOCAL_DIR = os.path.dirname(os.path.realpath(__file__))
          print(LOCAL_DIR)
      
      
          if defaultLocale == "el_GR":
              #translator.load(":translations/el_GR")
              translator.load(LOCAL_DIR + "/translations/el_GR.qm")
              app.installTranslator(translator)
          app.setApplicationName("Snooze Shutdown")
          app.setApplicationDisplayName("Snooze Shutdown")
      
          ui = Main()
          ui.retranslateUi(ui)
          ui.show()
          return app.exec_()
      

      As I said I did it the same way with copy/paste the parts from the problematic project.
      Used the same way to create/update the translation file, and I run the test app. Translation now works for all items!
      So, now I really don't know what to do.

      1 Reply Last reply
      0
      • Kent-DorfmanK Offline
        Kent-DorfmanK Offline
        Kent-Dorfman
        wrote on last edited by
        #3

        What is the parent of QMessageBox and SystemTrayIcon? WAG here, but wouldn't the translation only apply to direct children of MainWindow? In Your example QMessageBox has a null parent.

        The dystopian literature that served as a warning in my youth has become an instruction manual in my elder years.

        1 Reply Last reply
        0

        • Login

        • Login or register to search.
        • First post
          Last post
        0
        • Categories
        • Recent
        • Tags
        • Popular
        • Users
        • Groups
        • Search
        • Get Qt Extensions
        • Unsolved