日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Qt动态多语言的实现(VS2012开发)

發布時間:2025/4/5 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt动态多语言的实现(VS2012开发) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Qt對于多語言提供了QTranslator的接口,只要在程序啟動時進行安裝,然后動態改變QTranslator的加載即可。下面是效果圖(英文/簡體/繁體)。


選擇不同的語言,界面會隨著切換。這要如何實現呢?QTranslator會加載*.qm的語言檔,而該文件是從*.ts轉換而來的。所以我們首先要做的是制作*.ts檔。步驟如下

1.在項目的Resource Files的位置右擊,添加新建項,選擇.cpp類型的文件,然后將名字命名為ts的后綴,比如simplify.ts。

2.雙擊simplify.ts,在里面添加ts必要的內容。

<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE TS> <TS version="2.0"></TS> 3.右擊ts檔,選擇lupdate,更新ts檔。如下圖。


4.查看ts檔。右擊ts檔->打開方式->XML(文本)編譯器->雙擊或確定。(ts檔是xml格式,選用xml編譯器,便于編輯)。內容如下

<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE TS> <TS version="2.0"> <context><name>LanguagesDialog</name><message><source>Languages</source><translation type="unfinished"></translation></message><message><source>English</source><translation type="unfinished"></translation></message><message><source>Simplify</source><translation type="unfinished"></translation></message><message><source>Traditional</source><translation type="unfinished"></translation></message> </context> </TS> 5.編譯ts檔。代碼中使用tr轉換的字段都被提取了出來,并且存在了message字段下。message字段下的source是代碼中的源字段,translation就是轉換的內容。我們將type="unfinished"刪除,然后添加內容。編譯后的內容如下。

<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE TS> <TS version="2.0"><context><name>LanguagesDialog</name><message><source>Languages</source><translation >多語言</translation></message><message><source>English</source><translation >英文</translation></message><message><source>Simplify</source><translation >簡體</translation></message><message><source>Traditional</source><translation >繁體</translation></message></context> </TS>
6.繁體檔(traditional.ts)和英文檔(english.ts)按同樣的方法制作。也可直接將simpify.ts復制,然后改名。

7.生成qm檔。選中ts->右擊->lrelease.如下圖


8.查看qm檔是否生成成功。也就是說,生成了對應的english.qm、simplify.qm、traditional.qm。如下圖


注:對于ts和qm檔的制作也可以直接使用qt的Qt Linguist工具來制作。

qm制作完成后,在代碼中要實現相應的切換和調用。下面是實現代碼。

main.cpp

#include <QtWidgets/QApplication> #include "LanguagesDialog.h"int main(int argc, char *argv[]) {QApplication a(argc, argv);LanguagesDialog languagesDialog;a.installTranslator(languagesDialog.qTranslator);//注意:一定要加上這一句,才能將轉換器安裝到程序中,否則語言切換會失敗。languagesDialog.show();return a.exec(); }
LanguagesDialog.h

#include <QtWidgets>class LanguagesDialog:public QDialog {Q_OBJECT public:LanguagesDialog();QTranslator *qTranslator; protected:void changeEvent(QEvent *);private slots:void languageChanged();private:void translateUi();QGroupBox *languages;QRadioButton *english;QRadioButton *simplify;QRadioButton *traditional;};


LanguagesDialog.cpp

#include "LanguagesDialog.h"LanguagesDialog::LanguagesDialog():QDialog() {languages=new QGroupBox(this);english=new QRadioButton(this);simplify=new QRadioButton(this);traditional=new QRadioButton(this);qTranslator=new QTranslator();english->setChecked(true);qTranslator->load("english");QVBoxLayout *baselayout=new QVBoxLayout(this);baselayout->addWidget(languages);QVBoxLayout *radioLayout=new QVBoxLayout(languages);radioLayout->addWidget(english);radioLayout->addWidget(simplify);radioLayout->addWidget(traditional);connect(english,SIGNAL(toggled(bool)),this,SLOT(languageChanged()));connect(simplify,SIGNAL(toggled(bool)),this,SLOT(languageChanged()));connect(traditional,SIGNAL(toggled(bool)),this,SLOT(languageChanged()));translateUi(); }void LanguagesDialog::translateUi() {languages->setTitle(tr("Languages"));//用tr轉換的字段,會被自動抽取出來,將利用QTranslator來轉換。english->setText(tr("English"));simplify->setText(tr("Simplify"));traditional->setText(tr("Traditional")); }void LanguagesDialog::changeEvent(QEvent *event) { if (event->type()==QEvent::LanguageChange){translateUi();//更新界面}else{QDialog::changeEvent(event);} }///slots void LanguagesDialog::languageChanged() {if (english->isChecked()){qTranslator->load("english");//加載英文}else if(simplify->isChecked()){qTranslator->load("simplify");//加載簡體} else if(traditional->isChecked()){qTranslator->load("traditional");//加載繁體} }

如果需要與操作系統的語言相匹配,那么可以利用QLocale::system().name()獲取系統的語言信息,然后載入對應的語言檔。簡易代碼如下

int main(int argc, char *argv[]) {QApplication a(argc, argv); QTranslator translator;translator.load(QLocale::system().name());a.installTranslator(&translator);//other thing.return a.exec(); }
注意:QLocale::system().name()獲取的語言信息是依據ISO_639-1和ISO_3166-1生成的,一般是語言_區域的形式,比如中文代號是zh,中國的代號是CN,所以組合出來的結果就是zh_CN。所以這就要求我們在制作i18n(國際化)和l10n(本地化)的文言檔時,最好是依照這種規范生成相應的ts和qm檔。比如剛剛可以是zh_CN.ts和zh_CN.qm。當然可以適當的加入前綴,以便于區分不同的程序(LanguageDialog_zh_ch)。前綴可以用translator.load(QString("LanguageDialog_")+QLocale::system().name())組合而成。


以上就是簡單的實現。


轉載于:https://www.cnblogs.com/sparkleDai/p/7605053.html

總結

以上是生活随笔為你收集整理的Qt动态多语言的实现(VS2012开发)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。