Qt Tips

多言語対応の方法 文字列リテラルを

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

最終更新:2010年02月10日 17:38