多言語対応の方法 文字列リテラルを
tr("abc")
または
(Qt3の場合) qApp->translate( "category", "abc" ); (Qt4の場合) QCoreApplication::translate( "category", "abc" );
のように記述しておく。 また、文字列リテラルを直接変換せずに、後から変換したい場合は
const char* cstr = QT_TR_NOOP( "some text" );
または
const char* cstr = QT_TRANSLATE_NOOP( "category", "some text" );
としておき、変換する部分で
tr( cssr );
などとする。
trはQObjectで定義しているので、QObjectを継承していないクラスで使いたい場合は、 マクロ
Q_DECLARE_TR_FUNCTIONS()
をクラス定義に入れるとよい。 tr()を使うとクラス名がカテゴリ名となる。クラス外の場合、QCoreApplication::translate()でカテゴリを指定できる。 QObject::tr()とすることもできるが、その場合はカテゴライズされない。
次に、.proファイルに
TRANSLATIONS = myapp_en.ts
を追加して、コマンドラインから
lupdate myapp.pro
あるいは
lupdate myapp.pro -ts myapp_en.ts
を実行すると、myapp_en.tsファイルができる。 このファイルをQt Linguistで開いて訳を書いていく。 FileメニューのReleaseまたは、コマンドラインから
lrelease myapp.pro
を実行すると myapp_en.tsファイルがコンパイルされて myapp_en.qmファイルが作成される。 このmyapp.qmファイルをexeファイルと同じフォルダ等に置いて実行時に読み込んで使用する。
読み込む方法: 例えばmain()で
QTranslator translator; bool ok = translator.load( "myapp_en", app.applicationDirPath() ); app.installTranslator( &translator );
とすればよい。 Qtのサンプルでは、"en"の部分をlocaleから取ってきて実行時に言語を切り替える例がある。
参考:
http://calmlight.s2.zmx.jp/Qt4Note/qt4_note/internationalization.html
http://qt.nokia.com/include-jp/pdfs/qtconferencetokyo09_localization