Qtの設定 - Qt Linguist
概要
Qtは、Qt WidgetおよびQt Quickをローカル言語に翻訳するための優れたサポートを提供する。
リリースマネージャおよび翻訳者は、Qtツールを使用して翻訳業務を行うことができる。
リリースマネージャと翻訳者の業務を、以下に示す。
- リリースマネージャの業務
- リリースマネージャは、開発者と翻訳者の作業を調整する。
- ソースコードと翻訳を同期させるための
lupdate
コマンド - リリースされたソフトウェアで使用するランタイム翻訳ファイルを作成するための
lrelease
コマンド
- ソースコードと翻訳を同期させるための
- リリースマネージャは、開発者と翻訳者の作業を調整する。
- 翻訳者の業務
- Qt Linguistツールを使用してソフトウェア内のテキストを翻訳する。
- テキストエディタやワードプロセッサを使用する能力以上のコンピュータ知識は不要である。
リリースマネージャ
リリースマネージャとは
リリースマネージャとは、開発者と翻訳者の業務を調整する人である。
リリースマネージャが使用するツールとして、lrelease
とlupdate
の2つのツールが提供されている。
これらのツールは、QtプロジェクトファイルおよびCMakeプロジェクトファイルの処理、または、ファイルシステム上で直接操作することができる。
翻訳ファイルは、ソフトウェアにある全てのユーザー可視テキスト、[Ctrl]キーアクセラレータ、そのテキストの翻訳から構成される。
翻訳ファイル(TSファイル)を作成する手順は、以下の通りである。
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
翻訳ファイル名でロケールを使用すると、Qtソフトウェアの実行時にどの言語を読み込むかを決めることができる。
詳細については、QLocaleクラスを参照すること。
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ファイルを含むメタカタログファイルが存在する。
しかし、常に、全ての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!"の翻訳があれば、翻訳を表示して、無ければ原文が表示される
まず、Qtプロジェクトファイルにおいて、変数TRANSLATIONS
に、翻訳するTSファイルを指定する。
以下の例では、1つの翻訳セット(日本語のみ)を指定している。
TRANSLATIONS += SampleTr_ja.ts
※注意
翻訳ファイルは、QMファイルではなくTSファイルであることに注意する。
TSファイル形式は、Qtソフトウェアの開発中に使用するために設計されている。
Qtソフトウェアの設計者は、lupdate
コマンドを実行して、ソースコードから抽出された文言を含むTSファイルを生成する。
翻訳者は、Qt Linguistツールを使用してTSファイルを読み込み、翻訳を追加・編集する。
TSファイルはXML形式あり、直接、電子メールで送信すること、および、バージョン管理システムに配置することも簡単である。
TSファイルを手動で編集する場合、XMLのデフォルトエンコーディングはUTF-8であることに注意する。
例えば、"ø"のようなLatin1文字コードを入力する場合は、XMLエンティティを使用して、ø
と記述する。
これは、Unicode 4.0の全ての文字に対して有効である。
翻訳が完了した後、lrelease
コマンドを実行して、TSファイルをQM(Qt Message)ファイル形式に変換する。
QMファイル形式は、高速なルックアップ性能を実現するために設計されたコンパクトなバイナリ形式である。
lrelease
コマンドとlupdate
コマンドは、
Qtプロジェクトの全てのソースコードファイルとヘッダファイル(Qtプロジェクトファイルの変数SOURCESと変数HEADERSで指定されているファイル)を読み込み、
tr
メソッドの呼び出しに登場する文字列を抽出する。
lupdate
コマンドは、TSファイルを生成および更新して、ソースコードと同期させるために使用する。
lupdate
コマンドは情報を削除しないため、どのタイミングで実行してもよい。
例えば、QtプロジェクトファイルやCMakeプロジェクトファイルに記述することにより、プロジェクトをビルド/リビルドするたびにTSファイルが更新される。
また、lupdate
コマンドの-verbose
オプションは、lupdate
コマンド実行時における詳細なメッセージを表示するものである。
lupdate -verbose <Qtプロジェクトファイル>
lupdate
コマンドの実行後、カレントディレクトリにTSファイルが生成される。
TSファイル形式は、Qt Linguistツール等を使用して読み込むため、理解する必要はない。
<!DOCTYPE TS><TS>
<context>
<name>QPushButton</name>
<message>
<source>Hello world!</source>
<translation type="unfinished"></translation>
</message>
</context>
</TS>
Qt Linguistツールを使用して、各国の言語を翻訳する。
Qt Linguistツールのパスは、/<Qtのインストールディレクトリ>/bin/linguistに存在する。
端末からQt Linguistを起動する場合は、以下に示すコマンドを実行する。
linguist <TSファイル>
また、XMLエディタやテキストエディタを使用して、直接、TSファイルを編集することもできる。
Qt Linguistツールの使用方法を、以下に示す。
- Qt Linguistツールのメイン画面左ペインの上に、翻訳する対象(ここでは、"QPushButton")を選択する。
- 翻訳する文言(ここでは、"Hello world!")を選択する。
- Qt Linguistツールのメイン画面中央右にある翻訳ペインに、翻訳した文言を入力する。
- [完了]チェックボックスにチェックを入力して、メニューバーから[ファイル] - [保存]を選択する。
- TSファイルを確認する。
# 変換前
<translation type='unfinished'></translation>
# 変換後
<translation>翻訳した文言</translation>
次に、TSファイルからQMファイルを生成する。
QMファイルの生成は、Qt Linguistツールから(1つずつTSファイルに対して)行う、または、lrelease
コマンドを実行して行うことができる。
lrelease <TSファイル 1> <TSファイル 2> <TSファイル ...>
Qt LinguistツールからQMファイルを生成する方法を、以下に示す。
- Qt Linguistツールのメニューバーから、[ファイル] - [リリース]を選択する。
- ファイル保存ダイアログの[保存]ボタンを押下する。
- TSファイルからQMファイルが生成される。
- Qtソフトウェアを実行して、文言が翻訳されているかどうかを確認する。
TSファイルのフォーマット
Qt Linguistが使用するTSファイルのフォーマットは、DTDにより記述されている。
DTDの詳細を知りたい場合は、https://www.w3.org/TR/1998/REC-xml-19980210 を確認すること。
このフォーマットは、今後のQtのリリースで変更される可能性があることに注意する。
<!--
!
! Some notes to the DTD:
!
! The location element is set as optional since it was introduced first in Qt 4.2.
! The userdata element is set as optional since it was introduced first in Qt 4.4.
! The vanished message type was introduced first in Qt 5.2.
!
-->
<!--
! Macro used in order to escape byte entities not allowed in an xml document
! for instance, only #x9, #xA and #xD are allowed characters below #x20.
-->
<!ENTITY % evilstring '(#PCDATA | byte)*' >
<!ELEMENT byte EMPTY>
<!-- value contains decimal (e.g. 1000) or hex (e.g. x3e8) unicode encoding of one char -->
<!ATTLIST byte value CDATA #REQUIRED>
<!--
! This element wildcard is no valid DTD. No better solution available.
! extra elements may appear in TS and message elements. Each element may appear
! only once within each scope. The contents are preserved verbatim; any
! attributes are dropped. Currently recognized extra tags include:
! extra-po-msgid_plural, extra-po-old_msgid_plural
! extra-po-flags (comma-space separated list)
! extra-loc-layout_id
! extra-loc-feature
! extra-loc-blank
-->
<!ELEMENT extra-* %evilstring; >
<!ELEMENT TS (defaultcodec?, extra-**, dependencies?, (context|message)+) >
<!ATTLIST TS
version CDATA #IMPLIED
sourcelanguage CDATA #IMPLIED
language CDATA #IMPLIED>
<!-- The encoding to use in the QM file by default. Default is ISO-8859-1. -->
<!ELEMENT defaultcodec (#PCDATA) >
<!ELEMENT context (name, comment?, (context|message)+) >
<!ATTLIST context
encoding CDATA #IMPLIED>
<!ELEMENT dependencies (dependency+) >
<!ATTLIST dependency
catalog CDATA #IMPLIED>
<!ELEMENT name %evilstring; >
<!-- This is "disambiguation" in the (new) API, or "msgctxt" in gettext speak -->
<!ELEMENT comment %evilstring; >
<!-- Previous content of comment (result of merge) -->
<!ELEMENT oldcomment %evilstring; >
<!-- The real comment (added by developer/designer) -->
<!ELEMENT extracomment %evilstring; >
<!-- Comment added by translator -->
<!ELEMENT translatorcomment %evilstring; >
<!ELEMENT message (location*, source?, oldsource?, comment?, oldcomment?, extracomment?, translatorcomment?, translation?, userdata?, extra-**) >
<!--
! If utf8 is "true", the defaultcodec is overridden and the message is encoded
! in UTF-8 in the QM file. If it is "both", both source encodings are stored
! in the QM file.
-->
<!ATTLIST message
id CDATA #IMPLIED
utf8 (true|false|both) "false"
numerus (yes|no) "no">
<!ELEMENT location EMPTY>
<!--
! If the line is omitted, the location specifies only a file.
!
! location supports relative specifications as well. Line numbers are
! relative (explicitly positive or negative) to the last reference to a
! given filename; each file starts with current line 0. If the filename
! is omitted, the "current" one is used. For the 1st location in a message,
! "current" is the filename used for the 1st location of the previous message.
! For subsequent locations, it is the filename used for the previous location.
! A single TS file has either all absolute or all relative locations.
-->
<!ATTLIST location
filename CDATA #IMPLIED
line CDATA #IMPLIED>
<!ELEMENT source %evilstring;>
<!-- Previous content of source (result of merge) -->
<!ELEMENT oldsource %evilstring;>
<!--
! The following should really say one evilstring macro or several
! numerusform or lengthvariant elements, but the DTD can't express this.
-->
<!ELEMENT translation (#PCDATA|byte|numerusform|lengthvariant)* >
<!--
! If no type is set, the message is "finished".
! Length variants must be ordered by falling display length.
! variants may not be yes if the message has numerus yes.
-->
<!ATTLIST translation
type (unfinished|vanished|obsolete) #IMPLIED
variants (yes|no) "no">
<!-- Deprecated. Use extra-* -->
<!ELEMENT userdata (#PCDATA)* >
<!--
! The following should really say one evilstring macro or several
! lengthvariant elements, but the DTD can't express this.
! Length variants must be ordered by falling display length.
-->
<!ELEMENT numerusform (#PCDATA|byte|lengthvariant)* >
<!ATTLIST numerusform
variants (yes|no) "no">
<!ELEMENT lengthvariant %evilstring; >
テキストIDベースの翻訳
テキストID翻訳機構は、ローカライゼーションのための産業用強度の高いシステムである。
ソフトウェアの各テキスト(文言)には一意の識別子(テキストID)が割り当てられており、これらの識別子はプレーンテキストの代わりにソースコード内で直接使用される。
このため、ユーザーインターフェースの開発者には少し手間が掛かるが、大量の翻訳済みテキストの管理が非常に容易になる。
※注意
1つのソフトウェアでは、プレーンテキストベースの機能のみ、または、テキストIDベースの機能のみを使用する必要がある。
これらを混在させると、翻訳されるテキストのセットが不完全なものになってしまうことに注意する。
テキストIDを使用したローカライゼーション
プレーンテキストではなくテキストIDを使用する場合、ソフトウェアのローカライゼーションの一般的な方法は同じであるが、細部が少し異なる。
- テキストIDベースの翻訳システム用の関数とマクロは、プレーンテキストシステムとは異なる。
qsTr
メソッドの代わりにqsTrId
メソッド、QT_TR_NOOP
メソッドの代わりにQT_TRID_NOOP
マクロを使用する。 - プレーンテキスト文字列ではなく、テキストIDをユーザインターフェース文字列として使用する。
- 例.
qsTrId("id-back-not-front")
- 例.
- テキストIDを持つコンテキストパラメータを指定することはできない。
同じ綴りで異なる意味を持つ単語がある場合、これらは別々のテキストIDを必要とする。- 例.
qsTrId("id-back-backstep")
は、バックステップの"Back"とオブジェクトの背面である"Back"を区別する。
- 例.
- 開発において、ユーザインターフェースに表示されるテキスト(文言)は、
//%
のコメントで示される。
これを付加しない場合は、ユーザインターフェイスにテキストIDが表示される。
これは、パラメータを持つテキストがある場合に特に重要である。
コメントには、文字列中のパラメータインジケータを含める必要がある。- 例.
//% "ファイル数: %1"
- 例.
- 翻訳者に追加情報を提供する
//:
コメントは、プレーンテキストシステムでは任意である。
しかし、テキストIDベースのシステムでは、この追加情報が必須となる。
これは、追加情報が無い場合はテキストIDしか得られず、翻訳者はさらなる文脈なしに翻訳することができないかもしれないからである。
長い説明的なテキストIDを使用してコメントを使用しないこともできるが、コメントの方が理解しやすい場合がある。
下表に、テキストIDベースとプレーンテキストベースの翻訳を比較したものを示す。
テキストIDベース | プレーンテキストベース |
---|---|
Text {
id: backTxt;
//: The back of the object, not the front
//% "Back"
//~ Context Not related to back-stepping
text: qsTrId("id-back-not-front");
}
|
Text {
id: backTxt;
//: The back of the object, not the front
//~ Context Not related to back-stepping
text: qsTr("Back","Not front")
}
|
テキストIDを使用したローカライズ
テキストIDを使用したローカライズは、プレーンテキストの場合とほぼ同じ手順で行う。
lupdate
コマンドを使用して、TSファイルへの翻訳を行う。
lupdate <Qtプロジェクトファイル>.pro
※注意
翻訳ファイルのソース値はプレーンテキストではなく、テキストIDであることに注意する。
つまり、翻訳者が正しい翻訳を行うためには、説明的なテキストID、または、追加コメント、またはその両方が必要である。
テキストIDベースのユーザインターフェイスでは、TSファイルに以下に示すようなコンテンツが含まれる。
<message id="id-back-not-front">
<source>Back</source>
<extracomment>The back of the object, not the front</extracomment>
<translation type="unfinished"></translation>
<extra-Context>Not related to back-stepping</extra-Context>
</message>
lrelease
コマンドを使用する場合、翻訳されたテキストのキーがプレーンテキストではなく、テキストIDに基づくことを指定する必要がある。
qsTr
メソッドを使用して、ソースコード内の文字列を指定した場合、id
属性が設定されていないため、lrelease
コマンドでは無視される。
lrelease
コマンドは、ソフトウェアのためにコンパイルされた全ての翻訳であるQMファイルを生成する。
lrelease -idbased <Qtプロジェクトファイル>.pro
しかし、与えられたテキストに対して利用可能な翻訳が存在しない場合(一般的には開発の後半まで)、ユーザインターフェースにはテキストIDが表示される。
ソフトウェアの評価試験向けに、lrelease
コマンドにおいて、//% <コメント>
文を翻訳テキストとして使用して、
未翻訳のテキストを確認できるように、任意のインジケータでマークすることができる。
以下の例では、QMファイルを変換して、未翻訳のテキストの前に"!"を付加している。
lrelease -idbased -markuntranslated ! <Qtプロジェクトファイル>.pro
高度な使用方法
多数のロケールを対象とするプロジェクトでは、Qtプロジェクトファイルから変数TRANSLATIONS
を削除して、代わりに別のスクリプトで翻訳を管理することができる。
このスクリプトは、希望するターゲットごとにlrelease
コマンドおよびlupdate
を呼び出すことができる。
以下の例は、lupdate
コマンドを実行するスクリプトである。
lupdate -recursive <Qtプロジェクトのディレクトリ> -ts <Qtプロジェクトのディレクトリ>/i18n/MySoftware-text_en_ja.ts lupdate -recursive <Qtプロジェクトのディレクトリ> -ts <Qtプロジェクトのディレクトリ>/i18n/MySoftware-text_en_fr.ts # ...略
Qt Linguistの使用方法
Qt Linguistとは
Qt Linguistは、Qtソフトウェアに翻訳を追加するためのツールである。
Qtのインストール後、開発ホスト上の他のソフトウェアと同様に、Qt Linguistを起動することができる。
Qt Linguistのメイン画面には、メニューバーの他に下図に示す複数のビューが存在する。
- コンテキスト : [F6]キー
- 翻訳する文字列が出現するコンテキストを一覧から選択する。
- 文字列 : [F7]キー
- コンテキストで見つかった翻訳可能な文字列を表示する。
- ソースとフォーム : [F9]キー
- : 現在の文字列が使用されているコンテキストのソースコードにアクセスできる場合、そのコンテキストのソースコードを表示する。
- 翻訳エリアは、文字列を翻訳するためのものである。
- フレーズと推測 : [F10]キー
- : 現在の文字列の翻訳候補を表示する。
- 警告 : [F8]キー
- 検証テストに失敗した翻訳された文字列を表示する。
翻訳エリア(1)は常に表示されている。
他のビューを表示または非表示にする場合、[表示] - [ビュー]を選択する、または、上に挙げたキーボードショートカットを使用する。
ビューのタイトルバーをドラッグして、翻訳エリアの周囲やメイン画面の外側にまでビューを配置することができる。
翻訳
翻訳の手順
Qt Linguistで翻訳ファイル(TSファイル)を開いて翻訳する。
TSファイルは、翻訳者が読むことができるXMLファイルである。
TSファイルは、通常、lupdate
コマンドにより、作成および更新される。
TSファイルが存在しない場合は、Qtの設定 - Qt Linguist#リリースマネージャにあるTSファイルを作成する手順を参照すること。
Qt Linguistは、他のソフトウェアにより生成された国際的なXML Localization Interchange File Format(XLIFF)のファイルを翻訳するためにも使用することができる。
しかし、標準的なQtプロジェクトでは、TSファイル形式のみが使用される。
なお、XLIFF形式のファイルに対してサポートされている最小バージョンは1.1である。
Qt Linguistは、翻訳エリアに言語を表示して、それに応じて複数形の入力フィールドの数を調整する。
同時に翻訳する複数のTSファイルを開く場合、各言語ごとに翻訳者と翻訳者コメント欄が表示される。
位置情報の設定については、Qtの設定 - Qt Linguist#ターゲットロケールの変更を参照すること。
Qtソフトウェアの開発者が、QObject::tr
メソッドを使用している場合、そのコメントは開発者コメント欄に表示される。
Qt Linguistを使用して翻訳する手順を示す。
- [ファイル] - [開く]を選択して、TSファイルを読み込む。
- [コンテキスト]ビューでコンテキストを選択して、そのコンテキストにある翻訳可能な文字列が[文字列]ビューに読み込まれる。
- 文字列を選択すると、翻訳領域の原文としてコピーされる。
原文テキスト内の空白が視覚化されるため、テキスト内に必要な空白を確認することができる。 - [翻訳]フィールドに、現在の文字列の翻訳を入力する。
また、[フレーズと推測]ビューから既存の翻訳をダブルクリックして選択することもできる。
フレーズはフレーズ集から読み込まれ、推測はTSファイル内の類似フレーズの既存の翻訳を使用する。 - 任意ではあるが、他の翻訳者が読むためのコメントを[翻訳者コメント]フィールドに入力することもできる。
- 翻訳を受け入れる場合は、[Ctrl] + [Enter]キーを同時押下する、または、アイコンを選択する、文字列リストで選択したソース文字列の左側にあるアイコンを選択する。
- [ファイル] - [保存]を選択して、作業内容を保存する。
文字列リストの全ての文字列に、[Accepted / Correct]アイコンまたは[Accepted / Warnings]アイコンが付くまで、この処理を繰り返す。
その後、次のコンテキストを選択して翻訳を続行する。
原文と訳文の単語数と文字数を表示する場合は、[表示] - [統計]を選択する。
[ファイル]メニューバー - [リリース]を選択することにより、現在の翻訳ファイル(TSファイル)と同じベースネームのQMファイルを作成する。
なお、リリースマネージャのコマンドラインツールであるlrelease
コマンドは、全ての翻訳ファイル(TSファイル)に対して同じ機能を実行している。
翻訳ファイルと翻訳を印刷する場合は、[ファイル]メニューバー - [印刷]を選択する。
翻訳を途中で終了する
途中まで翻訳したファイルを残す場合は、[Ctrl] + [L]キーを同時押下して、次の未完成の翻訳に移動する。(Next Unfinished)
次の翻訳に移る場合は、[Shift] + [Ctrl] + [L]キーを同時押下する。
[翻訳]メニューバーにあるメニューを選択して移動することもできる。
異なるコンテキストに移動する場合は、メイン画面左にある[コンテキスト]ビューから作業するコンテキストを選択して、[文字列]ビューからソーステキストを選択する。
文脈によって複数の翻訳が必要なフレーズ
同じフレーズが2つ以上のコンテキストに矛盾なく現れることがある。
あるフレーズがあるコンテキストで翻訳されると、Qt Linguistは翻訳が行われたことを記録する。
翻訳者が同じフレーズを後で使用する場合、Qt Linguistは前の翻訳を翻訳候補として[フレーズと推測]ビューで提供する。
あるフレーズが特定のコンテキストに複数回出現する場合、[コンテキスト]ビューには1度だけ表示されて、そのコンテキスト内の全てのフレーズに翻訳が適用される。
同じフレーズを同じコンテキスト内で別の言語に翻訳する必要がある場合、開発者はそのフレーズの各出現箇所に区別するためのコメントを記述する必要がある。
このようなコメントを使用する場合、重複するフレーズは[コンテキスト]ビューに表示される。
開発者のコメントは、翻訳エリア内で水色の背景で表示される。
番号付き引数と複数形の処理
いくつかのフレーズには、番号付き引数が存在する。
番号付き引数は、実行時にテキストに置き換えられるプレースホルダーであり、ソース文字列の中で%記号の後に数字が続く形で表示される。
例えば、ファイル%1を処理した後にファイル%2が次に処理される時、この翻訳される文字列では、%1と%2は番号付きの引数である。
実行時に、%1と%2はそれぞれ最初のファイル名と2番目のファイル名に置き換えられる。
同じ番号の引数が翻訳に現れなければならないが、必ずしも同じ順番である必要はない。
ドイツ語への翻訳では、Datei %2 wird bearbeitet, wenn Datei %1 fertig istのように、フレーズを逆にすることができる。
両方の番号の引数は翻訳に現れるが、順序は逆である。
iは、引数iがソース文字列の引数列のどこに現れるかに関係なく、常に翻訳文字列の同じテキストに置き換えられる。
番号付き引数の使用は、しばしば原文での複数形の使用を伴うことが多い。
多くの言語では、テキストの形式は表示される値により異なり、複数の翻訳が必要になる。
開発者がソースコードの文字列を正しい方法でマークアップすることにより、翻訳領域で可能な複数形のそれぞれに対するフィールドが利用できる。
詳細を知りたい場合は、翻訳のためのソースコードの記述方法を参照すること。
ターゲットロケールの変更
ロケール情報は、Qt Liguistの[編集] - [翻訳ファイルの設定]から明示的に設定することができる。
翻訳元ファイルを開いた時、翻訳先の言語と国が明示的に設定されていない場合、Qt Linguistは翻訳元のファイル名からそれらを差し引こうとする。
このため、翻訳ファイルは、次のファイル名に関する規約を守る必要がある。
TSファイル名の規則: <ソフトウェア名>_<翻訳先の言語><_国名 (国名は任意)>.ts <翻訳先の言語>は、ISO 639の言語コード(小文字)である <_国名>は、ISO 3166の2文字の国コード(大文字)である。
翻訳先の言語と国を解決するための上記の試みが失敗する場合は、[翻訳ファイルの設定]ウィンドウが開く。
- 例1. app_de.ts
- 翻訳先の言語をドイツ語に設定する。
- 例2. app_de_ch.ts
- 翻訳先の言語をドイツ語、ターゲット国をスイスに設定する。
これは、現在のロケールの翻訳を自動的に読み込むことにも役立つ。
詳細については、Qtの設定 - Qt Linguist#Qt Linguistのマニュアル : 開発者向けを参照すること。
翻訳するコンテクストの選択
[コンテキスト]ビューには、翻訳する文字列が現れるコンテキストが一覧表示される。(アルファベット順)
各コンテキストは、QObject
クラスのサブクラス名である。
QObject
クラス自体のコンテキストもあり、そこにはstaticメソッドであるQObject::tr()
に渡される文字列が含まれる。
また、<unnamed context>
というものもあり、これは、QObject
クラスのサブクラスではない文字列が含まれる。
下表に、各コンテキストに対する現在の翻訳状態とそのアイコンを示す。
状態 | アイコン | 説明 |
---|---|---|
Accepted / Correct | コンテキスト内の全ての文字列が翻訳済みであり、全ての翻訳が検証に成功していることを表す。 | |
Accepted / Warnings | コンテキスト内の全ての文字列は翻訳済み、あるいは、翻訳済みとマークされているが、 少なくとも1つ以上の翻訳が検証に失敗していることを表す。 [文字列]ビューから、どの文字列が検証に失敗しているかどうかを確認することができる。 | |
Not Accepted | コンテキスト内の少なくとも1つの文字列が翻訳されていない、または、翻訳済みとマークされていないことを表す。 | |
Obsolete | 翻訳された文字列は、コンテキストには現れない。 これは、コンテキスト自体がQtソフトウェアに存在しないことを意味する。 |
[コンテキスト]ビューの[項目数]列には、コンテキスト内の翻訳可能な文字列の総数と翻訳された文字列の数が、スラッシュ(/)で区切って表示される。
数値が等しい場合、コンテキスト内の翻訳可能な文字列は、全て翻訳されている。
翻訳する文字列の選択
[文字列]ビューには、現在のコンテキストで見つかった翻訳可能な全ての文字列と、その翻訳受け入れ状態の一覧が表示される。
文字列を選択する場合、その文字列が翻訳領域の現在の文字列になる。
文字列の左にあるアイコンを選択すると、その文字列の翻訳受け入れ状態を変更することができる。
緑または黄色のチェックマークは、その文字列が翻訳されて翻訳が承認されたことを意味する。
[?]マークは、翻訳が受理されていない、または、その文字列に翻訳が存在しないことを意味する。
下表に、各文字列に対する現在の翻訳状態とそのアイコンを示す。
状態 | アイコン | 説明 |
---|---|---|
Accepted / Correct | 文字列に訳語がある。(空の可能性もある) ユーザが翻訳を受け入れて、その翻訳が全ての検証に合格していることを表す。 訳文が空の場合、ユーザは訳文を空のままにすることを選択したことになる。 アイコンを選択すると、翻訳の受け入れが取り消されて、[コンテキスト]ビューの[項目数]列にある受け入れられた翻訳の数が1つ減る。 文字列に翻訳がある場合は Not Accepted 、文字列の翻訳が空の場合はNo Translation に状態がリセットされる。lupdate コマンドにより文字列の内容を変更した場合、その受け入れ状態は自動的にNot Accepted にリセットされる。
| |
Accepted / Warnings | ユーザが翻訳を承認したが、翻訳が全ての検証に合格していないことを表す。 検証の不合格は、[警告]ビューに表示される。 アイコンを選択して、翻訳文の受理を取り消すこともできる。 その時、状態が[検証失敗]にリセットされて、[コンテキスト]ビューの[項目数]列の受け入れ翻訳数が1つ減る。 | |
Not Accepted | この文字列には、全ての検証に合格した翻訳があるが、ユーザはまだその翻訳を受け入れていないことを表す。 アイコンを選択する、または、[Ctrl] + [Enter]キーを同時押下して、翻訳を承認する。 この時、状態が[Accepted / Correct]にリセットされて、[Context]ビューの[項目数]列の受理された翻訳文の数が1つ増える。 | |
No Translation | この文字列には訳語が存在しないことを表す。 アイコンを選択することにより、空の翻訳を受け入れることができる。 この時、状態が[Accepted / Correct]にリセットされて、[Context]ビューの[項目数]列の受理された翻訳文の数が1つ増える。 | |
Validation Failures | 文字列には訳語が存在するが、その翻訳が全ての検証に合格していないことを表す。 検証に失敗した場合は、[警告]ビューに表示される。 アイコンを選択する、または、[Ctrl] + [Return]キーを同時押下して、検証に失敗した場合でも翻訳を受け入れることができる。 この時、状態は[Accepted / Warnings]にリセットされる。 ただし、検証失敗の原因を修正するために、翻訳を編集することを推奨する。 全ての失敗が修正された時、状態は自動的に[Not Accepted]にリセットされる。 | |
Obsolete | この文字列は廃止された(コンテキストで使用されなくなった)ことを表す。 廃止されたメッセージをファイルから削除する方法については、Qtの設定 - Qt Linguist#リリースマネージャを参照すること。 |
文字列のコンテキストの表示
翻訳可能な文字列を含むソースコードファイルがQt Linguistで利用可能な場合、[ソースとフォーム]ビューは[文字列]ビューに現在の文字列のソースコンテキストを表示する。
現在の文字列を含むソースコードの行が表示されて、ハイライトされる。
ソースコードの文字列を含むファイルが見つからない場合は、予想される絶対ファイルパスが表示される。
ソースコンテキストに間違ったソースコードの行が表示された場合、恐らく翻訳ファイルとソースコードファイルの同期が取れていないことを意味する。
翻訳ファイルとソースコードファイルを再同期する方法については、Qtの設定 - Qt Linguist#lupdateコマンドを参照すること。
Qt Designerで作成されたフォームは、特別なUIファイルに保存される。
Qt Linguistは、翻訳処理中にUIファイルが利用可能であれば、UIファイルを利用して、これまでに行われた翻訳をフォーム自体に表示させることができる。
翻訳の再利用
翻訳の再利用とは
翻訳されたテキストが原文と類似している場合、[翻訳]メニューバー - [ソーステキストからコピー]([Ctrl] + [B]キー)を選択して、ソーステキストを翻訳領域にコピーする。
Qt Linguistでは、一貫性を確保するために、共通の翻訳セットを提供するフレーズブックを使用する。
フレーズブックは、ソースフレーズ、ターゲット(翻訳)フレーズ、オプションの定義のセットである。
通常、1つの言語とQtソフトウェアファミリーにつき、1つのフレーズブックが作成される。
フレーズブックは、Qtソフトウェアファミリーの翻訳をフレーズブックで1度作成すればよいため、重複作業を避けるためにも使用できる。
[文字列]ビューの現在の文字列において、読み込まれた1つまたは複数のフレーズブックに表示されている場合、
[フレーズと推測]ビューに現在の文字列とそのフレーズブックの翻訳の一覧が表示される。
現在の文字列が、既に翻訳されている他の文字列と同じ、または、類似している場合、その他の文字列とその翻訳もこのビューに表示される。
[フレーズと推測]ビューから翻訳エリアに翻訳をコピーする場合は、[翻訳]をダブルクリックする、または、[翻訳]を選択して[Enter]キーを押下する。
一括翻訳
Qt Linguistの一括翻訳機能を使用して、フレーズブックにあるソーステキストを自動的に翻訳することができる。
一括翻訳プロセスにおいて、どのフレーズブックをどのような順序で使用するかを設定するには、[編集]メニューバー - [一括翻訳]を選択する。
現在翻訳されていない項目のみを考慮するかどうか、また、一括翻訳された項目を[Accepted]としてマークするかどうかを指定することができる。
フレーズブックの作成と編集
フレーズブックのファイルは、標準フレーズとその翻訳を含む人が読むことのできるXMLファイルである。
このファイルは、Qt Linguistにより作成および更新されて、多くのプロジェクトやソフトウェアで使用することができる。
新しいフレーズブックを作成する場合は、[フレーズ]メニューバー - [新しいフレーズブック]を選択する。
フレーズブックを開く場合は、[フレーズ]メニューバー - [フレーズブック開く]を選択して、Qtフレーズブックファイル(.qph)を選択する。
開いているフレーズブックを表示および変更する場合は、[フレーズ]メニューバー - [フレーズブックを編集]を選択する。
新しいフレーズを追加する場合は、フレーズブックダイアログの[新しい項目]ボタンを押下して、新しいソースフレーズ、訳語、任意の定義を入力する。
これは、同じソースフレーズの異なる翻訳を区別することに対して便利である。
作業中の翻訳を現在のフレーズブックに追加する場合は、[フレーズ]メニューバー - [フレーズブックに追加]を選択する。
複数のフレーズブックが読み込まれている場合は、1つ選択する必要がある。
[フレーズと推測]ビューに表示されているフレーズブックのエントリーでエラーを検出した場合、そのエントリを右クリックして[編集]を選択することにより、その場で編集することもできる。
編集後、[Enter]キーを押下して編集モードを終了する。
フレーズを削除する場合は、[ソースフレーズ]リストからフレーズを選択して、[エントリーを削除]を選択する。
フレーズブックを印刷する場合は、[フレーズ]メニューバー - [フレーズブックを印刷]を選択する。
翻訳の検証
Qt Linguistは、翻訳に対して、以下の検証機能を提供する。
- アクセラレータ検証では、原文のフレーズにアンパサンドがある場合に翻訳フレーズが検出されて、その逆も検出される。
- 句読点検証では、ソースフレーズと翻訳フレーズの終端句の違いが重要である場合に、その違いを検出する。
例えば、ソースフレーズの末尾に省略記号、感嘆符、疑問符があり、翻訳フレーズには無い場合、または、その逆の場合に警告が表示される。 - フレーズ検証は、フレーズ集にもある原文のフレーズにおいて、フレーズ集に記載されている訳語と異なるものを検出する。
- プレースマーカー検証は、原文と訳文の両方で同じ変数(%1、%2等)が使用されているかどうかを検出する。
検証の有効 / 無効を切り替える場合は、[検証]を選択する、または、ツールバーのボタンを選択する。
検証で不合格になった文字列には、[文字列]ビューで[検証不合格]アイコンが表示される。
受理された文字列には、[Accepted / Warnings]のマーク()が付く。
検証を無効にして、後で有効にする場合、Qt Linguistは全てのフレーズを再検証して、検証に失敗したフレーズをマークする。
現在の文字列に入力した翻訳において、検証のいずれかに失敗した場合は、その失敗が警告ビューにリストアップされる。
これらの失敗におけるメッセージは、メイン画面下部にあるステータスバーにも表示される。
複数言語の同時翻訳
Qt Linguistは、複数の翻訳ファイルを同時に読み込んで編集することができる。
下図は、英語と日本語の翻訳ファイルを読み込んだ状態である。
翻訳エリアには、英語と日本語のテキスト編集エリアがあり、これらは色分けされている。
[コンテキスト]ビューと[文字列]ビューでは、ステータス欄が1つから2つになり、同じ色で色分けされている。
[コンテキスト]ビューの[項目数]列には、両方の言語の値が組み合わされている。
翻訳可能な文字列の数が受理された文字列の数と一致しない場合、どちらかの言語または両方の言語に、翻訳または受理が必要な文字列がある。
[文字列]ビューには、各言語の各文字列の翻訳受け入れ状態が表示される。