「Qtの設定 - Qt Linguist」の版間の差分
(→未完成の翻訳) |
|||
86行目: | 86行目: | ||
== Qt Linguistのマニュアル : 開発者向け == | == Qt Linguistのマニュアル : 開発者向け == | ||
==== 翻訳におけるオーバーヘッド ==== | ==== 翻訳におけるオーバーヘッド ==== | ||
Qtでは、各ウィンドウのフレーズを作成時に翻訳することにより、翻訳する時のパフォーマンスコストを最小限に抑えている。<br> | |||
多くのQtソフトウェアでは、ウィンドウおよびダイアログは1度だけ作成されて、必要に応じて表示または非表示にすることがよくある。<br> | |||
<br> | <br> | ||
最初の翻訳が行われる時、翻訳されたウィンドウのランタイムオーバーヘッドは無い。<br> | 最初の翻訳が行われる時、翻訳されたウィンドウのランタイムオーバーヘッドは無い。<br> | ||
94行目: | 94行目: | ||
実行時に言語を切り替えることができるソフトウェアを設計することもできるが、開発者の介入をある程度必要とするため、実行時のパフォーマンスも犠牲になる。<br> | 実行時に言語を切り替えることができるソフトウェアを設計することもできるが、開発者の介入をある程度必要とするため、実行時のパフォーマンスも犠牲になる。<br> | ||
<br> | <br> | ||
==== Qtプロジェクトファイルでの翻訳ファイルの指定 ==== | |||
自動的に<code>lrelease</code>コマンドおよび<code>lupdate</code>コマンドを使用するには、<br> | 自動的に<code>lrelease</code>コマンドおよび<code>lupdate</code>コマンドを使用するには、<br> | ||
Qtプロジェクトファイルにおいて、変数<code>TRANSLATIONS</code>に対して各言語のエントリーが必要となる。<br> | Qtプロジェクトファイルにおいて、変数<code>TRANSLATIONS</code>に対して各言語のエントリーが必要となる。<br> | ||
103行目: | 103行目: | ||
これは、Qtプロジェクトファイルを読み込み、どのソースファイルに翻訳されるテキストが含まれているかを特定する。<br> | これは、Qtプロジェクトファイルを読み込み、どのソースファイルに翻訳されるテキストが含まれているかを特定する。<br> | ||
<br> | <br> | ||
この時、翻訳するソースコードファイルがQtプロジェクトファイルの変数<code>SOURCES</code>、変数<code>HEADERS</code>、変数<code>RESOURCE</code>に記述している必要がある。<br> | |||
記述されていないファイルのテキストは検出されないため、翻訳対象外となる。<br> | 記述されていないファイルのテキストは検出されないため、翻訳対象外となる。<br> | ||
SOURCES += mainwindow.cpp \ | SOURCES += mainwindow.cpp \ | ||
119行目: | 119行目: | ||
<br> | <br> | ||
ただし、Visual Studio等のIDEでは、標準で異なる文字コードを使用する。<br> | ただし、Visual Studio等のIDEでは、標準で異なる文字コードを使用する。<br> | ||
文字コードの問題を回避する方法として、ソースコードの文字コードをASCIIにして、他の文字を含む翻訳可能な文字列にはエスケープシーケンスを使用する方法がある。<br> | |||
label->setText(tr("F\374r \310lise")); | label->setText(tr("F\374r \310lise")); | ||
<br> | <br> | ||
138行目: | 138行目: | ||
ツールは1つの結合された翻訳ファイルを作成するため、文字列はC++/QMLからアクセス可能である。<br> | ツールは1つの結合された翻訳ファイルを作成するため、文字列はC++/QMLからアクセス可能である。<br> | ||
<br> | <br> | ||
Qtソフトウェアの国際化をサポートするクラスは、[https://doc.qt.io/qt-5/internationalization.html Internationalization with Qt (Qt5向け)]を参照する。<br> | |||
また、ソースコードを翻訳可能にする手順は、[https://doc.qt.io/qt-5/i18n-source-translation.html Writing Source Code for Translation (Qt5向けi18n)]と[https://doc.qt.io/qt-5/qtquick-internationalization.html Internationalization and Localization with Qt Quick (Qt5向け)]を参照する。<br> | |||
<br> | <br> | ||
翻訳が必要な各ソースコードは、翻訳者がそのテキストがソフトウェアのどこに出てくるかを特定するための文脈を必要とする。<br> | 翻訳が必要な各ソースコードは、翻訳者がそのテキストがソフトウェアのどこに出てくるかを特定するための文脈を必要とする。<br> | ||
149行目: | 149行目: | ||
==== 翻訳の準備 ==== | ==== 翻訳の準備 ==== | ||
ソフトウェアに必要なQMファイルは、<code>QTranslator</code>クラスを使用するローダコードが位置する場所に配置する必要がある。<br> | ソフトウェアに必要なQMファイルは、<code>QTranslator</code>クラスを使用するローダコードが位置する場所に配置する必要がある。<br> | ||
これは、一般的に、<code>QCoreApplication::applicationDirPath</code>メソッドからの相対パスを指定することで行われる。<br> | |||
<br> | <br> | ||
ソフトウェアのQMファイルがあり、かつ、システムにインストールされていないバージョンのQtが使用されている場合、QtのQMファイルも配置する必要がある。<br> | ソフトウェアのQMファイルがあり、かつ、システムにインストールされていないバージョンのQtが使用されている場合、QtのQMファイルも配置する必要がある。<br> |
2022年12月1日 (木) 11:40時点における版
概要
リリースマネージャとして、lrelease
とlupdate
の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とする場合は、変数CODECFORSRCをUTF-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ファイルを含むメタカタログファイルが存在する。
しかし、常に、Qt5の全てのQMファイルをデプロイする必要はない。
lconvert
ツールを使用して、必要なモジュールのQMファイルのみをメタカタログファイル名と一致する1つのファイルに連結することを推奨する。
以下の例では、Qt Core、Qt GUI、Qt Quickの各モジュールを使用したソフトウェアにおいて、ドイツ語翻訳ファイルを作成している。
lconvert -o installation_folder/qt_de.qm qtbase_de.qm qtdeclarative_de.qm