歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Unix知識 >> 關於Unix

Linux下應用程序開發:QT國際化編程

Qt 目前的版本(2.2.4)對國際化的支持已經相當完善。 在文本顯示上,Qt 使用了Unicode 作為內部編碼,可以同時支持多種編碼。 為 Qt 增加一種編碼的支持也比較方便,只要 增加該編碼和Unicode的轉換編碼便可以了。 Qt 目前支持ISO標准編碼ISO 8859-1, ISO 88
  Qt 目前的版本(2.2.4)對國際化的支持已經相當完善。 在文本顯示上,Qt 使用了Unicode 作為內部編碼,可以同時支持多種編碼。 為 Qt 增加一種編碼的支持也比較方便,只要 增加該編碼和Unicode的轉換編碼便可以了。 Qt 目前支持ISO標准編碼ISO 8859-1, ISO 8859-2,ISO 8859-3,ISO 8859-4,ISO 8859-5,ISO 8859-7,ISO 8859-9,和 ISO 8859-15(對於阿拉伯語和希伯來語的支持正在開發之中),中文GBK/Big5,日文 eucJP/JIS/ShiftJIS,韓文eucKR,俄文KOI8-R。 當然也可以直接使用UTF8編碼。
  
  Qt 使用了自己定義的Locale機制,在編碼支持和信息文件(Message File)的翻譯上彌補 了目前Unix上所普遍采用Locale和gettext的不足之處。 Qt 的這種機制可以使 Qt 的同一 組件(QWidget)上同時顯示不同編碼的文本。 比如,Qt 的標簽上可以同時使用中文簡體 和中文繁體文本。
  
  在文本輸入上,Qt 采用了XIM(X Input Method)標准協議,可以直接使用XIM輸入服務器。 由於目前的絕大多數輸入服務器都是針對單一語言的,所以在 Qt 的標准輸入組件( QLineEdit,QMultiLineEdit)中的輸入受到單一編碼的限制,Qt 還不支持動態切換編碼 輸入的支持,這是它的不足之處。
  
  1. Qt 的文本顯示
  使用 Qt 編寫國際化的程序,最好不要在程序中直接使用特殊編碼的文本。 比如要 編寫一中文界面的 Qt 程序,應該在程序中使用英文,程序編寫完成後,把文本提取 出來翻譯。 這樣,程序還可以根據Locale的不同,支持多種語言。 下面介紹如何在 Qt 程序中標注字符串,如何提取並翻譯文本。
  
  像普通的國際化過程一樣,Qt 使用了類似GNU gettext一樣的函數 QObject::tr(),它 用於從Qt的信息文件 .qm 中取出信息,這些信息是經過 Qt 的工具處理的。 Qt在處理 編碼時還使用了 QTranslator 類,可用於指定整個應用軟件的 的信息文件。
  
  下面是一段使用了 QObject::tr()的代碼,它建立了一個彈出菜單,菜單項是"Quit", 它被放置在菜單條上,在菜單條上顯示的是標簽"File"。
  
  QPopupMenu* popup;
  popup = new QPopupMenu( this );
  popup->insertItem( tr("&Quit"),qApp,SLOT(quit()) );
  menubar->insertItem( tr("&File"),popup );
  
  對於絕大多數情況,可以用上述方法處理。不過有時在定義某些變量中使用的字符 串,不能使用上述方法,但是為了讓Qt提取並翻譯該字符串,必須用 某種方法標志出 來。Qt 定義了 QT_TR_NOOP() 和 QT_TRANSLATE_NOOP() 來標志它們。前者用於單個字 符串,後者用於多個字符串。比如,
  
  static const char* strings[] = {
  QT_TR_NOOP( "Hello" ),
  QT_TR_NOOP( "World" )
  };
  
  有時需要使用printf/sprintf之類的函數動態生成字符串,比如,
  
  QStings s;
  s.sprintf( "Button %d",i );
  but->setText( s );
  
  對這種使用方式的國際化是使用 arg() 函數。
  
  QString s = tr( "Button %1" ).arg(i);
  but->setText( s );
  
  提取上述信息的方法是使用 Qt 提供的工具 findtr 命令:
  
  findtr [filename].cpp > i18n.po
  
  它類似於GNU的 xgettext,上述文件的提取信息文件內包含,
  
  ....
  "Content-Type: text/plain; charset=iso-8859-1\n"
  
  #: i18n.cpp:34
  msgid "ExampleWidget::&File"
  msgstr ""
  ...
  
  接下來是文本翻譯過程。 在Qt中翻譯信息文件時應該注意以下事項: (1) 提取的 信息文件的編碼是iso-8859-1,在翻譯成某種語言(編碼)時應該 注意改動它的 字符集,比如對中文GB2312和Big5編碼,應該是, "Content-Type: text/plain; charset=gb2312\n"或者"Content-Type: text/plain; charset=big5\n"。 (2) 提取的信息有一個范圍,比如上面的文件指定的范圍是 ExampleWidget, 在翻譯 前應該把它去掉,變成 msgid "::&File"。(3) 被翻譯的字符串可能含有加速鍵 符號,如 "&File"中的"F",如果翻譯成中文最好保留該信息,它可以翻譯成 "文件(&F)"。
  
  對於翻譯後的文件(比如上面的翻譯文件存為 i18n_gb.po),必須使用 Qt 提供的 工具 msg2qm 把它轉換為 .qm 文件才能使用,
  
  > msg2qm i18n_gb.po i18n_gb.qm
  
  它類似於GNU的 msgfmt 命令。翻譯後的文件可以用Qt程序直接調用。
  
  QTranslator *translator = new QTranslator(0);
  translator->load("i18n_gb.qm",".");
  qApp->installTranslator(translator);
  
  此外,Qt 還提供了類似於 msgmerge 的工具 mergetr,它用於把新提取的信息 文件和已經翻譯過的信息文件融合起來,在此不再贅述。
  
  在 Qt 中也可以直接使用 QTextCodec 來轉換字符串的編碼,這為在Qt下開發純 中文軟件帶來了便利條件,不過這種方法不符和國際化/本地化的習慣,
  
  char *string = "中文和English混和字符串!"
  QTextCodec* gbk_codec = QTextCodec::codecByName("GBK");
  QString gbk_string = codec->toUnicode(string);
  QLabel *label = new QLabel(gbk_string);
  
  如果使程序只支持一種編碼,也可以直接把整個應用程序的編碼設置為GBK編碼, 然後在字符串之前 加tr(QObject::tr),
  
  qApp->setDefaultCodec( QTextCodec::codecForName("GBK") );
  QLabel *label = new QLabel( tr("中文標簽") );
  
  如果使Qt根據Locale的環境變量取得字符集,可以使用
  
  QString::fromLocal8Bit(str)。
  
  本節的例子請參見 qt-i18n-example.tar.gz
  
  2. Qt 的文本輸入
  在輸入方面,Qt 的輸入條(QLineEdit)和編輯區(QMultiLineEdit)都支持 XIM,只要配 合相應的輸入服務器,便可以輸入中文/日文/韓文。目前有許多支持XIM的軟件,比如 中文: Chinput/xcin/rfinput/q9,日文: kinput2/skkinput,韓文: ami/hanIM。
  
  Qt程序的缺省輸入風格是OverTheSpot風格,它也支持 OffTheSpot風格和 Root風格。 用戶可以在起動程序時在命令行指定輸入風格,比如對程序app,
  
  
  ./app -inputstyle overthespot  #缺省風格,光標跟隨
  ./app -inputstyle offthespot
  ./app -inputstyle root
  
  經過 MiziLinux 補丁的Qt-2.2.0 支持 OnTheSpot 輸入風格,並且把它作為 缺省的輸 入風格。請參見 http://www.mizi.com/ko/kde/doc/onthespot/onthespot.html。
  
  Qt 中的任何一個 Widget 都可以接受輸入,只要它可以有鍵盤聚焦(Keyboard Focus)。所以對特殊 Widget 的輸入處理只需要截獲鍵盤輸入,獲取從XIM服務器 來的字符串。 對於OverTheSport風格的支持,刷新XIM輸入服務器的位置即可。
  
  3. Qt 的打印
  在打印方面,XWindow下的 Qt 生成PostScript並使用lpr打印。 它含有QPrinter類, 可以方便地支持輸出頁面的控制。 對於中文打印,必須修正PostScript文件的輸出 部分。

Copyright © Linux教程網 All Rights Reserved