Elcook
Elcook

Reputation: 175

Questions about Qt internationalization

I am having trouble figuring out how to use Qt to create translation files for a python apllication.

I'm using python 2.7, Qt version 5.9.1 and PyQt4 4.12.1 to create my GUI on OSX 10.11.6.

For now I just wanted to translate a few words on my code.

For what I understand, I have to use QtLinguist to open a .ts file, translate the words and create a .qm file, which will then be used by python.

From Qt Linguist page I get that I need to use a .pro project file, that will be read by pylupdate4, etc...

Now, I do I create a .pro file?

I tried running:

$ qmake -project myfile.py
$ pylupdate4 myfile.pro -ts file.ts

but the resulting .pro file can't be read by pylupdate4 (XML error: Parse error at line 1, column 1 [...])

From this Tutorial, I tried:

$ pylupdate4 myfile.py -ts file.ts

Which creates an empty .ts file, that Qt Linguist can't open.

Can someone give my any tip on what might be wrong, the 15 tabs I have open in my browser are not helping.

Here's my python code if you need it:

import sys
import os.path as osp
import os
from PyQt4 import QtGui, QtCore

class MainWindow(QtGui.QWidget):

    def __init__(self):
        super(MainWindow,self).__init__()

        # Set MainWindow geometry, use settings of last session. If it's first session,
        # use defaulted settings
        self.settings = QtCore.QSettings('Paul',QtCore.QSettings.NativeFormat)
        self.resize(self.settings.value("size", QtCore.QSize(500, 300)).toSize())
        self.move(self.settings.value("pos", QtCore.QPoint(5, 5)).toPoint());

        self.initUI()


    def closeEvent(self, e):
        #Save MainWindow geometry session when closing the window
        self.settings.setValue("size",self.size())
        self.settings.setValue("pos",self.pos())
        e.accept()

    def initUI(self):

        self.hbox = QtGui.QVBoxLayout(self) # Create Vertival box layout to put the buttons
        self.myButtons = QtGui.QPushButton('button',self) #create push button
        self.myButtons.setStyleSheet("""QPushButton { background-color: red; font:bold 20px}""")
        self.myButtons.setToolTip('Push this button')
        self.myButtons.setText(self.tr(QtCore.QString('yes')))
        comboBox=QtGui.QComboBox(self) #create drop down menu
        comboBox.addItem('Portugues')
        comboBox.addItem('English')
        self.hbox.addWidget(comboBox,1,QtCore.Qt.AlignRight) #add drop down menu to box layout
        self.hbox.addStretch(3)      # set separation between buttons
        self.myButtons.clicked.connect(self.buttonClicked) # what should the button do
        self.hbox.addWidget(self.myButtons,1,QtCore.Qt.AlignRight) #add button to box layout


        self.setWindowTitle('Test2')


        self.show()


    def buttonClicked(self):

        msbox= QtGui.QMessageBox()
        choice=msbox.warning(self,'ok',"This button doesn't do anything!!!")


        if choice == QtGui.QMessageBox.No:
            print('nanan')
        else:
            print('Bye')
            self.settings.setValue("size",self.size());
            self.settings.setValue("pos",self.pos());
            sys.exit()

def main():

    app = QtGui.QApplication(sys.argv)
    translator = QtCore.QTranslator()
    translator.load("~/basefiles/translations/qt_pt.qm")
    app.installTranslator(translator)
    ex = MainWindow()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()  

Upvotes: 0

Views: 1036

Answers (2)

Syize
Syize

Reputation: 1

It's an old question, but I hope anyone from search engines like me can get the answer they want.

After giving it a brief try, I found it's very easy to create and update .ts file in PyQt5.

  1. First, you need to create a .pro file similar to that in C++ Qt. For example,
SOURCES += /path/to/your/python_script \
           /other/python_script

TRANSLATIONS += /path/to/your/translation_file \
                /other/translation_file
  1. Use command pylupdate5 to generate .ts file
pylupdate5 /path/to/your/pro_file

If you want to add new translation to .ts file (for example, you change your source code), just run this command again. It will update .ts file, preserving existing translations.

  1. If you want to release a .ts file, use command lrelease-pro-qt5
lrelease-pro-qt5 /path/to/your/pro_file

Upvotes: 0

eyllanesc
eyllanesc

Reputation: 243947

When you use self.tr you must pass the string, not the QString variable, in your case it changes:

self.myButtons.setText(self.tr(QtCore.QString('yes')))

to

self.myButtons.setText(self.tr("yes"))

And run everything again.

Upvotes: 0

Related Questions