はじめに
この記事は Qt Advent Calendar 2021 の13日目の記事です。
QWidget ベースのアプリケーション および Qt Quick アプリケーションで、動的に言語を切り替える実装について書きました。
今年も時間ギリギリになってしまったのでソースコードとポイントの箇条書きだけですゴメンナサイ。
なるべく簡単に対応言語が増やせるように意識して書いてみました。
Qt Creator 5.0.3 (MSVC), Qt 6.2.1, Windows 10 で動作確認しています。
Qt多言語対応の概要
特徴
基本的な多言語対応の実装手順
- ソースコードの翻訳したい文字列を、C++ なら QObject::tr で、QML なら qsTr で囲む。
- lupdate コマンドを実行し、ソースコードから ts ファイルを作る。
- Qt Linguist で ts ファイルを開いて編集する。
- lrelease コマンドを実行し、ts ファイルから qm ファイルを作る。
- アプリケーション実行時に QTranslator::load で(システムのロケールに対応した) qm ファイルを読む。
- 読み込んだ QTranslator を QCoreApplication::installTranslator する。
動的な言語切り替えの実装例
QWidgetアプリケーション
ポイント
- pro ファイルで
TRANSLATIONS += translations/multi_language_widgets_ja_JP.ts
しておくと、lupdate コマンドの引数にこの pro ファイルを指定して ts ファイルを生成できる。Qt Creator からは Tools - External - Linguist - Update Translations(lupdate) メニューで lupdate コマンドを実行できる。- ただし ts ファイル出力先のフォルダが無いとコマンドの実行が失敗するので注意。
- 対応言語を増やす場合は TRANSLATIONS に追加して lupdate を再実行する。
- ts ファイルを編集する時は Qt Creator で ts ファイルを右クリックして Open With - Qt Linguist メニューを選ぶ。
- 他にまとめて編集したい ts ファイルがあれば、Qt Creator から Qt Linguist へドラッグ&ドロップする。
- pro ファイルで
CONFIG += lrelease
しておくとビルド時に lrelease コマンドで TRANSLATIONS の ts ファイルから qm ファイルを出力ディレクトリに生成してくれる。- QM_FILES_INSTALL_PATH で出力先ディレクトリを変えられると書いてあったけど効かなかった。。。
- pro ファイルで
CONFIG += lrelease embed_translations
しておくと生成した qm ファイルをリソースとしてアプリケーションに取り込んでおいてくれる。- QM_FILES_RESOURCE_PREFIX でリソースの prefix を指定できる。デフォルトは
/i18n/
。
- QM_FILES_RESOURCE_PREFIX でリソースの prefix を指定できる。デフォルトは
- 先に installTranslator しておいた QTranslator で別ファイルを load してもうまく動いた。
- ui ファイルでフォーム作成したクラスでは、changeEvent で LanguageChange のイベントを受けて retranslateUi する。
- Qt 用の翻訳ファイルも installTranslator してあげると、QLineEdit の右クリックメニュー等々も翻訳される。
- Qt がインストールされていない環境で実行する場合には Qt の qm ファイルも配布する必要がある。
Qt Quick アプリケーション
ポイント
- QWidget アプリケーションと大体同じ。
- 言語が切り替わったら QQmlApplicationEngine::retranslate を呼ぶ。
- その気になれば選択言語に合わせて画像の切り替えもできる。
- 多分推奨はされていない。
終わりに
CONFIG += lrelease
とか embed_translations
とか全然知らなかったので、調べてみて良かったなーとおもいました。(小並感)
明日は @hoshianaaa さんの PyQt5のチュートリアルを動かす ➇ QMessageBox です。お楽しみに!