tr()和國際化

來源:互聯網
上載者:User

標籤:style   color   os   使用   io   strong   檔案   ar   問題   

如果我們程式需要翻譯成另外一種語言,那麼Qt Linguist 和Qt的翻譯工具已經為我們解決這個問題,它提供了一套解決方案,它們提供了如何組織和處理翻譯後字串的方法。

為了準備進行代碼翻譯,需要使用QObject::tr()函數,來包含需要翻譯的字串,當將其作用於非靜態函數時,他會將QMetaObject所提供對象的類名進行翻譯,作為要翻譯字串分組的“上下文”

tr()函數有兩個作用:

  1. 它使的QT的lupate工具可以提取所有可翻譯的字串

  2. 如果翻譯檔案可用,並且語言已經被選中,該函數就會返回翻譯後的字串

如果沒有可以使用的翻譯檔案,那麼tr()函數返回原始字串

注意:確保每個可翻譯的字串都完全在tr()函數內部,並且編譯時間刻被進行提取,這個是非常重要的,對於帶參數的字串,可以使用QString::arg()函數來將參數放置在翻譯過的字串中:

 label->setText(tr("%1 + %2 = %3")) .arg(para1) .arg(para2) .arg(para3)

具體步驟:

  1. 在pro檔案中添加:

TRANSLATIONS = $$PWD/lang/chinese.ts \                $$PWD/lang/english.ts

  2.  方法 一>使用Qt的終端使用lupdate  pro檔案名稱,產生翻譯檔案chinese.ts和english.ts

     方法 二>工具->外部->Qt語言家->更新翻譯,將產生翻譯檔案chinies.ts和english.ts

  3.使用Qt Linguist編輯*.ts檔案,來進行翻譯工作

  4. 方法 一>使用Qt的終端使用lrelease命令

      方法 二>在Qt Linguist找到“發布”,就可以根據*.ts產生*.qm檔案,他們可以有應用程式來載入其翻譯

      方法 三>工具->外部->Qt語言家->部署翻譯,將產生語言檔案qm

  5. 載入翻譯檔案

QTranslator translator;translator.load("cn.qm");qApp->installTranslator(&translator);


用QT實現多國語言支援有兩種情況:

第一種:使用UI編輯器來自動產生介面,這種方式實現多語系的動態切換很容易。

void MainWindow::changeLanguage(const ELangType& langType){    switch(langType)    {        case ELangType_Chinese:        {            this->languageState = ELangType_Chinese;            this->translator.load("chinese") ;            qApp->installTranslator(&(this->translator));            break;        }        case ELangType_English:        {            this->languageState = ELangType_English;            this->translator.load("english") ;            qApp->installTranslator(&(this->translator));            break;        }        default:        {            break;        }    }}

這個函數是實現語言動態切換,其中languageType是用來記錄當前語言的狀態,qApp是QApplication對象,我們只需使用QTranslator載入不同的檔案就可以實現多語系的動態切換。

第二種:不使用UI編輯器,自己通過親自編程來設計應用程式介面,這種方式實現多語系動態切換比較繁瑣,注意不是難;

void MainWindow::changeLanguage(const ELangType& langType){    switch(langType)    {        case ELangType_Chinese:        {            this->languageState = ELangType_Chinese;            this->translator.load("chinese") ;            this->pOwner->installTranslator(&(this->translator));            break;        }        case ELangType_English:        {            this->languageState = ELangType_English;            this->translator.load("english") ;            this->pOwner->installTranslator(&(this->translator));            break;        }        default:        {            break;        }    }        this->labelname->setText(tr("name"));    this->labeltel->setText(tr("tel"));    ........}

因此這個特別麻煩,每個介面都要進行類似這樣的操作,一般我會在每個介面使用一個retranslateUi()函數,把所有的

要翻譯的控制項放到裡面,每次翻譯的時候調用下就可以了

注意:第一個方法沒有再次從新設定tr(),原因如下

void MainWindow::changeEvent(QEvent *e){    QMainWindow::changeEvent(e);    switch (e->type()) {    case QEvent::LanguageChange:         ui->retranslateUi(this);//這裡實現語言翻譯器的更新。    .......}

tr()和國際化

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.