Qtの設定 - Qt Linguist

提供:MochiuWiki : SUSE, EC, PCB
2022年12月1日 (木) 13:05時点におけるWiki (トーク | 投稿記録)による版 (→‎翻訳の準備)
ナビゲーションに移動 検索に移動

概要

リリースマネージャとして、lreleaselupdateの2つのツールが提供されている。
これらのツールは、QtプロジェクトファイルおよびCMakeプロジェクトファイルの処理、または、ファイルシステム上で直接操作することができる。

翻訳ファイルは、ソフトウェアにある全てのユーザー可視テキスト、[Ctrl]キーアクセラレータ、そのテキストの翻訳から構成される。

翻訳ファイルを作成する手順は、以下の通りである。

  • lupdateコマンドを実行して、ユーザから見えるテキストを全て含み、翻訳が無い最初の翻訳ファイル群((TSファイル群)を生成する。
  • TSファイルを翻訳者に渡して、翻訳者はQt Linguistを使用して翻訳を追加する。
    Qt Linguistは、変更または削除されたソーステキストを処理する。
  • lupdateコマンドは、データを破壊することなく、ソフトウェアのユーザビジュアルテキストと翻訳を同期させる。
  • ソフトウェアをリリースする場合、lreleaseを実行して、TSファイルを読み込みソフトウェアで使用するQMファイルを実行時に生成する。


lupdateコマンドを使用する場合は、コンパイルする翻訳ファイル(TSファイル)を、QtプロジェクトファイルおよびCMakeプロジェクトファイルに記述する必要がある。


lreleaseコマンド

lreleaseコマンドは、TSファイルをQMファイルに変換・生成する。

lrelease <Qtプロジェクトファイルのパス>


QMファイルは、ローカライズされたソフトウェアで使用できるコンパクトなバイナリ形式である。
lreleaseコマンドがコンパイルするTSファイルは、コマンドラインから実行する、または、Qtプロジェクトファイルから間接的に与えることができる。

QMファイルが無い場合、ソフトウェアは設計者が代替として配置したテキストを使用して実行される。
QMファイルを適切な場所に配置することにより、ソフトウェアはQMファイルを自動的に検出して使用する。

また、lreleaseコマンドは、Qtプロジェクトファイルを指定せずに実行することもできる。

lrelease.exe <TSファイル 1> <TSファイル 2> <TSファイル ...>


※注意
lreleaseコマンドは、"finished"とマークされた翻訳のみを取り込む。
それ以外の場合は、代わりに原文が使用される。

その他のオプションを知りたい場合は、lrelease -helpコマンドを実行すること。


lupdateコマンド

lupdateコマンドは、指定されたソースファイル、ヘッダファイル、Qtデザイナーインターフェイスファイルの中から翻訳可能な文字列を見つけて、
TSファイル(翻訳ファイル)からQMファイルへ生成または更新する。

処理するファイルと更新するファイルは、コマンドラインから実行する、または、Qtプロジェクトファイルで指定する。

lupdate <Qtプロジェクトファイルのパス>


また、1つのQMLファイルに対する翻訳ファイルは、lupdateコマンドを実行することにより、生成することができる。

lupdate <QMLファイル> -ts <対応するTSファイル>

例. lupdate main.qml -ts main_ja.ts


他の言語(フランス語等)の翻訳ファイルを作成する場合は、main_en.tsファイルをmain_fr.tsファイルとしてコピーして、各言語のTSファイルにある文字列を翻訳・記述する。

lupdateコマンドは、.qrcファイルに記述されたQMLファイルを処理することもできる。

# Qtプロジェクトファイル (.pro)
RESOURCES += qml.qrc


全てのQMLファイルを特定の言語のQMファイルへ生成または更新する。

lupdate application.qrc -ts mysoftware_en.ts


.qrcファイルを使用せずに、全てのQMLファイルを特定の言語のQMLファイルへ生成または更新することも可能である。

lupdate -extensions qml -ts mysoftware_en.ts


QMLファイルおよび翻訳する文字列を含むC++のソースコードも存在する場合も、特定の言語のQMLファイルへ生成または更新することが可能である。

lupdate qml.qrc mainwindow.cpp -ts mysoftware_en.ts


TSファイルは、Qtプロジェクトファイルに記述せずに、lupdateコマンドを実行して、翻訳ファイルを指定することもできる。
以下の例では、英語とフランス語に使用するTSからQMファイルへ生成または更新している。

lupdate qml.qrc mainwindow.cpp -ts mysoftware_en.ts mysoftware_fr.ts


TSファイルの雛形を翻訳者に渡して、翻訳者はQt Linguistを使用してTSファイルを読み込み、翻訳を記述する。
社内に翻訳者がいる企業は、ソフトウェアの開発に合わせて、定期的にlupdateコマンドを実行するとよい。
これにより、翻訳作業量は少なくなり、プロジェクトの期間中に均等に分散されて、翻訳者は同時に多くのプロジェクトをサポートできるようになる。

TSファイルは、人間が読めるXML形式であり、必要に応じてバージョン管理システムで管理することができる。
また、lupdateコマンドは、Localization Interchange File Format(XLIFF)形式のファイルも処理することができる。

※注意
XLIFF形式のファイルの最小サポートバージョンは、1.1である。
XLIFF 1.0以前のファイルはサポートされていないので注意すること。

その他のオプションを知りたい場合は、lupdate -helpコマンドを実行すること。


未完成の翻訳

lreleaseコマンドおよびlupdateコマンドは、TSファイルの翻訳が不完全な場合でも使用することができる。
その場合、不足している翻訳箇所は、実行時にネイティブ言語のフレーズに置き換えられる。


Qt Linguistのマニュアル : 開発者向け

翻訳におけるオーバーヘッド

Qtでは、各ウィンドウのフレーズを作成時に翻訳することにより、翻訳する時のパフォーマンスコストを最小限に抑えている。
多くのQtソフトウェアでは、ウィンドウおよびダイアログは1度だけ作成されて、必要に応じて表示または非表示にすることがよくある。

最初の翻訳が行われる時、翻訳されたウィンドウのランタイムオーバーヘッドは無い。
ウインドウが破棄されて、その後再作成されるウィンドウのみが、翻訳におけるオーバーヘッドを持つことになる。

実行時に言語を切り替えることができるソフトウェアを設計することもできるが、開発者の介入をある程度必要とするため、実行時のパフォーマンスも犠牲になる。

Qtプロジェクトファイルでの翻訳ファイルの指定

自動的にlreleaseコマンドおよびlupdateコマンドを使用するには、
Qtプロジェクトファイルにおいて、変数TRANSLATIONSに対して各言語のエントリーが必要となる。

TRANSLATIONS += mysoftware_en.ts \
                mysoftware_ja.ts


lupdateコマンドは、ソフトウェアからユーザーインターフェイス文字列を抽出する。
これは、Qtプロジェクトファイルを読み込み、どのソースファイルに翻訳されるテキストが含まれているかを特定する。

この時、翻訳するソースコードファイルがQtプロジェクトファイルの変数SOURCES、変数HEADERS、変数RESOURCEに記述している必要がある。
記述されていないファイルのテキストは検出されないため、翻訳対象外となる。

SOURCES      += mainwindow.cpp \
                main.cpp

HEADERS      += mainwindow.h \

FORMS        += mainwindow.ui
TRANSLATIONS += mysoftware_en.ts \
                mysoftware_ja.ts


lupdateコマンドは、全てのソースコードの文字コードがUTF-8で記述されていることを想定している。
特定のBOM(Byte Order Mark)を持つファイルは、UTF-16、UTF-32でエンコードされていることもある。
例えば、BOMの無いソースコードファイルをUTF-16とする場合は、変数CODECFORSRCUTF-16に指定する。

ただし、Visual Studio等のIDEでは、標準で異なる文字コードを使用する。
文字コードの問題を回避する方法として、ソースコードの文字コードをASCIIにして、他の文字を含む翻訳可能な文字列にはエスケープシーケンスを使用する方法がある。

label->setText(tr("F\374r \310lise"));


ソフトウェアの国際化

Qtでは、開発者以外の担当者が、様々な言語や地域に対応できるように、翻訳をできるだけ簡単に行えるようにしている。
Qtの全ての入力コントロールとテキスト描画メソッドは、サポートされている全ての言語に対するビルトインサポートを提供している。

しかし、ソースコードを記述する場合には、以下のことを念頭に置く必要がある。

  • ソフトウェアで適切な翻訳ファイルを検索して、読み込むようにする。
  • ユーザから見えるテキストと[Ctrl]キーアクセラレータを、翻訳対象としてマークする。
  • 翻訳されるテキストに文脈を提供する。
  • 同一のテキストの曖昧さを無くす。
  • 実行時にテキストまたは数字に置き換えられるパラメータのプレースホルダとして、番号付き引数%nを使用する。
  • 数値、日付、時間、通貨を国際化する。
  • 関数外のデータテキスト文字列を翻訳可能なものにする。


C++/QMLの両方のソースコードにユーザインターフェイスの文字列を持つソフトウェアを設計することができる。
ツールは1つの結合された翻訳ファイルを作成するため、文字列はC++/QMLからアクセス可能である。

Qtソフトウェアの国際化をサポートするクラスは、Internationalization with Qt (Qt5向け)を参照する。
また、ソースコードを翻訳可能にする手順は、Writing Source Code for Translation (Qt5向けi18n)Internationalization and Localization with Qt Quick (Qt5向け)を参照する。

翻訳が必要な各ソースコードは、翻訳者がそのテキストがソフトウェアのどこに出てくるかを特定するための文脈を必要とする。
また、同じテキストが複数あり、かつ、異なる翻訳が必要な場合、翻訳者はソースコードを曖昧にしないための情報も必要である。

テキストに翻訳マークを付加することにより、自動的にクラス名が基本的なコンテキスト情報として使用される。
場合によっては、設計者が翻訳者の助けになるような情報を追加する必要があるかもしれない。

翻訳の準備

ソフトウェアに必要なQMファイルは、QTranslatorクラスを使用するローダコードが位置する場所に配置する必要がある。
これは、一般的に、QCoreApplication::applicationDirPathメソッドからの相対パスを指定することで行われる。

ソフトウェアのQMファイルがあり、かつ、システムにインストールされていないバージョンのQtが使用されている場合、QtのQMファイルも配置する必要がある。

Qt5では、QMファイルはモジュールごとに分割されて、全てのモジュールのQMファイルを含むメタカタログファイルが存在する。

しかし、常に、全てのQMファイルをデプロイする必要はない。
lconvertコマンドを使用して、必要なQMファイルのみをメタカタログファイル名と一致する1つのファイルに連結することを推奨する。

以下の例では、Qt Core、Qt GUI、Qt Quickの各モジュールを使用したQtソフトウェアにおいて、ドイツ語翻訳ファイルを生成している。

lconvert -o installation_folder/qt_de.qm qtbase_de.qm qtdeclarative_de.qm



Qtソフトウェアの翻訳

QTranslatorクラスを使用した翻訳

QTranslatorクラスを使用したQtソフトウェアの翻訳手順を示す。
また、trメソッドの最も簡単な使用方法として、ユーザインターフェースのテキストを翻訳用にマークすることも示している。

QObjectクラスを継承する全てのクラスは、trメソッドを持つ。
QObjectクラスのメンバ関数の内部では、QPushButton::tr("<文言>")QObject::tr("<文言>")の代わりに、tr("<文言")と記述すればよい。

 #include <QTranslator>
 
 // ...略
 
 QTranslator translator;                              // QTranslatorクラスのインスタンスを生成する
 translator.load("SampleTr_ja");                      // ソフトウェアで使用する日本語翻訳ファイル(SampleTr_ja.qmファイル)を読み込む
                                                      // もし、日本語翻訳ファイルが無くてもエラーにはならない
 app.installTranslator(&translator);                  // 日本語翻訳ファイルをソフトウェアで使用する翻訳プールに追加する
 QPushButton hello(QPushButton::tr("Hello world!"));  // "Hello world!"と表示されるボタンを作成する
                                                      // SampleTr_ja.qmファイルが存在して、"Hello world!"の翻訳があれば、翻訳を表示して、無ければ原文が表示される