2016-09-16 3 views
3

У меня есть простая программа, в которой я хочу переключать языки во время выполнения. Поскольку GUI не выполняется с QtDesigner, у меня нет файла .ui и, следовательно, я не могу использовать ui.retranslateUi, насколько я могу видеть. Мой текущий путь решения этой вручную призывающую SetText на каждом виджете каждый раз, когда происходит событие изменения языка:PySide: динамически менять язык во время выполнения без ui.retranslateUi

from PySide.QtCore import * 
from PySide.QtGui import * 
import sys 


class Simple(QPushButton): 
    def __init__(self): 
     super().__init__('translate-me') 
     self.translator = QTranslator() 
     self.clicked.connect(self.switchLanguage) 
     self.show() 

    def changeEvent(self, event): 
     if event.type() == QEvent.Type.LanguageChange: 
      self.setText(self.tr('translate-me')) 

    def switchLanguage(self): 
     self.translator.load('translation-file') 
     QApplication.installTranslator(self.translator) 


app = QApplication(sys.argv) 
simple = Simple() 
sys.exit(app.exec_()) 

Решение с использованием ui.retranslateUi, как описано here намного короче, хотя. Есть ли решение, подобное тому, когда не используется файл .ui для графического интерфейса?

+0

Это, вероятно, не стоит. Вы можете разрешить пользователю изменять языки, а затем дать им возможность перезапустить приложение. 'retranslateUi' не магически исправляет все, каждое использование' tr() 'в вашем коде должно быть проверено, чтобы убедиться, что оно обновит любые видимые строки при изменении языков. Обычно это трудно сделать, если только вы не начинаете разработку, - и тогда вам придется разработать какой-то общий шаблон для его реализации, который должен придерживаться каждый фрагмент вашего кода, который использует видимую пользователем строку. –

ответ

3

Метод retranslateUi влияет только на объекты, созданные из файла ui. Поэтому для того, чтобы предоставить полное решение, каждая строка, нуждающаяся в повторном переводе, должна быть установлена ​​в файле ui. Любые строки, добавленные в другое место, нуждаются в совершенно отдельной обработке.

Вот пример метода retranslateUi:

def retranslateUi(self, Window): 
    self.fileMenu.setTitle(QtGui.QApplication.translate("Window", "&File", None, QtGui.QApplication.UnicodeUTF8)) 
    self.helpMenu.setTitle(QtGui.QApplication.translate("Window", "&Help", None, QtGui.QApplication.UnicodeUTF8)) 
    self.fileQuit.setText(QtGui.QApplication.translate("Window", "&Quit", None, QtGui.QApplication.UnicodeUTF8)) 
    self.fileQuit.setShortcut(QtGui.QApplication.translate("Window", "Ctrl+Q", None, QtGui.QApplication.UnicodeUTF8)) 
    self.helpAbout.setText(QtGui.QApplication.translate("Window", "&About", None, QtGui.QApplication.UnicodeUTF8)) 
    self.helpAboutQt.setText(QtGui.QApplication.translate("Window", "About &Qt", None, QtGui.QApplication.UnicodeUTF8)) 

Как вы можете видеть, все это делает называть setText (или любой другой) на пораженные объекты о которых он знает. Магии нет. Это всего лишь код котельной, созданный инструментом pyside-uic.

Если вы не можете использовать файл ui, вам придётся создать что-то подобное выше.

Смежные вопросы