6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

QtAdvent Calendar 2021

Day 13

Qt の動的言語切り替え

Last updated at Posted at 2021-12-12

はじめに

この記事は Qt Advent Calendar 2021 の13日目の記事です。

QWidget ベースのアプリケーション および Qt Quick アプリケーションで、動的に言語を切り替える実装について書きました。
今年も時間ギリギリになってしまったのでソースコードとポイントの箇条書きだけですゴメンナサイ。
なるべく簡単に対応言語が増やせるように意識して書いてみました。

Qt Creator 5.0.3 (MSVC), Qt 6.2.1, Windows 10 で動作確認しています。

Qt多言語対応の概要

特徴

  1. 実行時に読み込む言語ファイルはバイナリ形式で軽量、高速。
  2. 翻訳ファイルは、 Qt Linguist というツールを使い、フォームやソースコードを確認しながら編集できる。
    image.png
    image.png

基本的な多言語対応の実装手順

  1. ソースコードの翻訳したい文字列を、C++ なら QObject::tr で、QML なら qsTr で囲む。
  2. lupdate コマンドを実行し、ソースコードから ts ファイルを作る。
  3. Qt Linguist で ts ファイルを開いて編集する。
  4. lrelease コマンドを実行し、ts ファイルから qm ファイルを作る。
  5. アプリケーション実行時に QTranslator::load で(システムのロケールに対応した) qm ファイルを読む。
  6. 読み込んだ 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/
  • 先に 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 です。お楽しみに!

6
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?