关于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>&lt; &amp;Back</source>
50         <translation>&lt; Back(&amp;B)</translation>
51     </message>
52     <message>
53         <source>&amp;Finish</source>
54         <translation>Finish(&amp;F)</translation>
55     </message>
56     <message>
57         <source>Cancel</source>
58         <translation>Cancel</translation>
59     </message>
60     <message>
61         <source>&amp;Help</source>
62         <translation>Help(&amp;H)</translation>
63     </message>
64     <message>
65         <source>&amp;Next</source>
66         <translation>Next(&amp;N)</translation>
67     </message>
68     <message>
69         <source>&amp;Next &gt;</source>
70         <translation>Next(&amp;N) &gt;</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>

 

 

posted on 2013-01-19 10:50  孜求嵌道  阅读(678)  评论(0编辑  收藏  举报