2016-09-16 6 views
3

런타임시 언어를 전환하려는 간단한 프로그램이 있습니다. GUI는 QtDesigner로 끝나지 않으므로 .ui 파일이 없으므로 ui.retranslateUi를 사용할 수 없습니다. 모든 위젯에 언어 변경 이벤트가 발생할 때마다이 수동으로 호출의 setText를 해결하는 나의 현재 방법 : here 설명 ui.retranslateUi를 사용하여와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 GUI 용 파일을 사용하지 않을 때와 유사한 솔루션이 있습니까?

+0

아마 가치가 없습니다. 사용자가 언어를 변경하도록 허용 한 다음 응용 프로그램을 다시 시작할 수있는 옵션을 제공 할 수 있습니다. 'retranslateUi'는 모든 것을 마술처럼 수정하지는 않습니다. 언어가 변경 될 때 보이는 문자열을 업데이트하도록 코드에서'tr()'을 사용할 때마다 감사해야합니다. 개발을 시작하기 전까지는 일반적으로 어렵습니다. 그런 다음 사용자가 볼 수있는 문자열을 사용하는 코드의 모든 부분을 고수해야한다는 것을 구현하기 위해 일종의 공통 패턴을 디자인해야합니다. –

답변

3

retranslateUi 메서드는 ui 파일에서 생성 된 개체에만 영향을줍니다. 따라서 솔루션을 제공하려면 재 번역이 필요한 모든 단일 문자열을 ui 파일에 설정해야합니다. 다른 곳에 추가 된 문자열은 완전히 별도의 처리가 필요합니다. 당신이 볼 수 있듯이

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 (또는 무엇이든)를 호출 할 수 있습니다 : 여기

retranslateUi 방법의 예입니다. 마법과 관련된 것은 없습니다. pyside-uic 도구로 생성 된 보일러 플레이트 코드 일뿐입니다.

ui 파일을 사용할 수없는 경우 위와 동일한 내용을 만들어야합니다.

관련 문제