关于qt的国际化,网上有相当的文章,这里要讲下要注意的一些地方。
1.qt的国际化可以分为动态加载和静态加载,动态加载会比静态加载复杂一些。
静态加载只要实现如下代码即可:
1 QApplication app(argc, argv); 2 QTranslator *translator = new QTranslator(&app); 3 if (translator->load(":/translations/sys_Korean.qm")) 4 app.installTranslator(translator);
2.如果使用动态加载,加载语言文件成功后,需要手动调用刷新ui文本的函数。界面是designer画的话就方便一点,直接调用ui->retranslateUi(this);即可。界面要是手动画的话就麻烦一点,就需要自己实现retranslateUi函数。
3.界面中不是自己设置的text,需要加载qt自带的语言文件。但是自带的文件翻译较多,截取部分需要的翻译到自己实现qm文件中也可以实现。
4.Linguist语言家并不是必须的,在使用完lupdate后,可以进行手动修改ts文件,然后再使用lrelease生成qm文件。
类的声明:
1 class LangPage : public QWizardPage 2 { 3 Q_OBJECT 4 5 public: 6 LangPage(QWidget *parent = 0); 7 ~LangPage(); 8 9 private slots: 10 void changeLang(int index); 11 12 private: 13 void retranslateUi(); 14 void changeQtLang(QString langCode); 15 QStringList findQmFiles(); 16 QString languageName(const QString &qmFile); 17 18 QComboBox *comboBox; 19 QHBoxLayout *layout; 20 };
类的实现:
1 static QTranslator *translator; 2 3 LangPage::LangPage(QWidget *parent) 4 : QWizardPage(parent) 5 { 6 setTitle(tr("Choose Language")); 7 setSubTitle(tr("Specify where you want the wizard to put the generated " 8 "skeleton code.")); 9 setPixmap(QWizard::LogoPixmap, QPixmap(":/images/logo1.png")); 10 11 comboBox = new QComboBox; 12 layout = new QHBoxLayout; 13 14 QStringList qmFiles = findQmFiles(); 15 for (int i = 0; i < qmFiles.size(); ++i) { 16 comboBox->addItem(languageName(qmFiles[i])); 17 } 18 connect(comboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(changeLang(int))); 19 layout->addWidget(comboBox); 20 setLayout(layout); 21 } 22 23 LangPage::~LangPage() 24 { 25 delete comboBox; 26 delete layout; 27 if (translator != NULL) 28 { 29 qApp->removeTranslator(translator); 30 delete translator; 31 translator = NULL; 32 } 33 } 34 35 void LangPage::changeLang(int index) 36 { 37 QString langCode = comboBox->itemText(index); 38 changeQtLang(langCode); 39 } 40 41 void LangPage::changeQtLang(QString langCode) 42 { 43 if (translator != NULL) 44 { 45 qApp->removeTranslator(translator); 46 delete translator; 47 translator = NULL; 48 } 49 50 translator = new QTranslator; 51 QString qmFilename = ":/translations/" + langCode + ".qm"; 52 if (translator->load(qmFilename)) 53 qApp->installTranslator(translator); 54 retranslateUi(); 55 } 56 57 void LangPage::retranslateUi() 58 { 59 wizard()->restart(); 60 wizard()->setWindowTitle(tr("Setup Wizard")); 61 62 setTitle(tr("Choose Language")); 63 setSubTitle(tr("Specify where you want the wizard to put the generated " 64 "skeleton code.")); 65 } 66 67 QStringList LangPage::findQmFiles() 68 { 69 QDir dir(":/translations"); 70 QStringList fileNames = dir.entryList(QStringList("*.qm"), QDir::Files, 71 QDir::Name); 72 QMutableStringListIterator i(fileNames); 73 while (i.hasNext()) { 74 i.next(); 75 i.setValue(dir.filePath(i.value())); 76 } 77 return fileNames; 78 } 79 80 QString LangPage::languageName(const QString &qmFile) 81 { 82 QTranslator translator; 83 translator.load(qmFile); 84 return translator.translate("MainWindow", "English"); 85 }
ts文件举例:
1 <?xml version="1.0" encoding="utf-8"?> 2 <!DOCTYPE TS> 3 <TS version="2.0"> 4 <context> 5 <name>LangPage</name> 6 <message> 7 <source>Choose Language</source> 8 <translation>Choose Language</translation> 9 </message> 10 <message> 11 <source>Setup Wizard</source> 12 <translation>Setup Wizard</translation> 13 </message> 14 <message> 15 <source>Specify where you want the wizard to put the generated skeleton code.</source> 16 <translation>Specify where you want the wizard to put the generated skeleton code.</translation> 17 </message> 18 </context> 19 <context> 20 <name>MainWindow</name> 21 <message> 22 <source>English</source> 23 <translation>English</translation> 24 </message> 25 </context> 26 <context> 27 <name>QWizard</name> 28 <message> 29 <source>Go Back</source> 30 <translation>Go Back</translation> 31 </message> 32 <message> 33 <source>Continue</source> 34 <translation>continue</translation> 35 </message> 36 <message> 37 <source>Commit</source> 38 <translation>Commit</translation> 39 </message> 40 <message> 41 <source>Done</source> 42 <translation>Done</translation> 43 </message> 44 <message> 45 <source>Help</source> 46 <translation>Help</translation> 47 </message> 48 <message> 49 <source>< &Back</source> 50 <translation>< Back(&B)</translation> 51 </message> 52 <message> 53 <source>&Finish</source> 54 <translation>Finish(&F)</translation> 55 </message> 56 <message> 57 <source>Cancel</source> 58 <translation>Cancel</translation> 59 </message> 60 <message> 61 <source>&Help</source> 62 <translation>Help(&H)</translation> 63 </message> 64 <message> 65 <source>&Next</source> 66 <translation>Next(&N)</translation> 67 </message> 68 <message> 69 <source>&Next ></source> 70 <translation>Next(&N) ></translation> 71 </message> 72 </context> 73 <context> 74 <name>SetupWizard</name> 75 <message> 76 <source>Setup Wizard</source> 77 <translation>Setup Wizard</translation> 78 </message> 79 </context> 80 </TS>