【QT】Internationalization


【Proposal】
  1. Providing multilingual files (Traditional Chinese/English/Russian)。

【Basic Steps】

  1. creating a project and naming as lang
  2. add QLabel component and define its Text to “Hello” 。
    Captured from Qt Designer as below。
    image
  3. add multilingual setting to *.pro file
    TRANSLATIONS += lang_zh_TW.ts \
                    lang_en_US.ts \
                    lang_ru_RU.ts
  4. produce *.ts via lupdate
    c:\Qt\2010.03\Qt\bin\lupdate.exe lang.pro 
  5. open lang_zh_TW.ts、lang_en_US.ts、lang_ru_RU.ts via Qt Linguist。 
    1. Russian
      1. 先用 編輯 | 翻譯檔案設定 指定目標語言。
        image
      2. 將 Hello 定義為 здравствуйте,並存檔離開。
        image
    2. 中文部分也是類似上面的作法。
      1. 先用 編輯 | 翻譯檔案設定 指定目標語言為中文。
      2. 將 Hello 定義為 "你好",並存檔離開。
        image
    3. 英文部分直接將 Hello 定義為 Hello 即可。
  6. produce *.pm via lrelease, we’ll get lang_zh_TW.qm、lang_en_US.qm、lang_ru_RU.qm
    c:\Qt\2010.03\Qt\bin\lrelease.exe *.ts
  7. copy *.qm files to execute-file folder (ex. Debug/Release for Windows OS)
  8. 內定語系,讀取 OS的語系
    1. 程式碼
      #include <QTranslator> 
      #include <QLocale> 
      QTranslator translator; 
      translator.load("lang_" + QLocale::system().name())); 
      a.installTranslator(&translator); 
    2. 結果
      image
  9. 指定語系(以俄文為例,強制使用俄文)
    1. 程式碼
      #include <QTranslator> 
      #include <QLocale> 
      QTranslator translator; 
      translator.load("lang_ru_RU"); 
      a.installTranslator(&translator); 
    2. 結果
      image
  10. 讓客戶指定語系,建議(這部分是我的想法,比較省事,否則就要一個一個元件去 setText() )
    1. 出現一個讓客戶可以選定語系的選單(Combox,選單內使用圖檔讓客戶定義語系)。
      客戶選完之後將設定存檔(xml/ini Format)。並提醒客戶重開該應用程式。
    2. 重開之後,按照設定載入語系檔。
  11. 在 MacOsX底下會讀取 zh_CN 檔,而不是 zh_TW,建議先用qDebug() 先行確認。 
    qDebug() << QLocale::system().name();
  12. 參考下面資料,裡面提供語系檔,可參考命名方式
    1. C:\Qt\2010.03\qt\translations
    2. http://code.google.com/p/qwit/source/browse/#svn/trunk/translations 
【Question】
  1. 另一種方法是使用setCodecForTr。不過嘗試製作一個簡單的語言切換選單,
    但發現在俄文底下動作並不正常。
    #include <QTextCodec>
    
    void Dialog::on_comboBox_activated()
    {   
      QString str_hello = tr("Hello");
    
      if (ui->multilingual->currentText() == "Traditional Chinese(Taiwan)")
      {
        QTextCodec::setCodecForTr(QTextCodec::codecForName("Big5-ETen"));
        str_hello = tr("哈囉");
      }else if (ui->multilingual->currentText() == "Pycckom(Russia)")
      {
        QTextCodec::setCodecForTr(QTextCodec::codecForName("KOI8-R"));
        str_hello = tr("здравствуйте");
      }
      ui->label->setText(str_hello);
      qDebug() << str_hello;
    }
  2. 結果
    image
  3. 針對此問題,可以採用 fromUtf8 來指定QString格式。
    但目前 WinXp還有問題,而在MacOs底下動作正常。
    ex. ui->pushButton->setText(QString::fromUtf8("Привет")); 
  4. 猜想是Qt Creator 1.3.1在WinXp存檔格式並非雙字元,如果使用 Editplus 編輯,並存成utf8 格式
    就可以暫時解決這個問題。
    1. 先在 Editplus 修改字串。 
      image
    2. 回到 Qt Creator,雖然看到的是亂碼。
      image
    3. 不過執行出來是正確的。
      image 
    4. 在 Qt Creator 可以選擇檔案格式, Edit | Select Encoding
      這樣就不用再開其他編輯器編輯了。 不過進階使用方式還須研究。
      image image
  5. 參考 Как записать в файл ?
    http://www.prog.org.ru/topic_10946_0.html;prev_next=prev
【參考】
 

Ed32. Copyright 2008 All Rights Reserved Revolution Two Church theme by Brian Gardner Converted into Blogger Template by Bloganol dot com