Qtの設定 - Qt Linguist

提供:MochiuWiki : SUSE, EC, PCB
2022年12月5日 (月) 16:30時点におけるWiki (トーク | 投稿記録)による版
ナビゲーションに移動 検索に移動

概要

Qtは、Qt WidgetおよびQt Quickをローカル言語に翻訳するための優れたサポートを提供する。
リリースマネージャおよび翻訳者は、Qtツールを使用して翻訳業務を行うことができる。

リリースマネージャと翻訳者の業務を、以下に示す。

  • リリースマネージャの業務
    リリースマネージャは、開発者と翻訳者の作業を調整する。
    • ソースコードと翻訳を同期させるためのlupdateコマンド
    • リリースされたソフトウェアで使用するランタイム翻訳ファイルを作成するためのlreleaseコマンド

  • 翻訳者の業務
    Qt Linguistツールを使用してソフトウェア内のテキストを翻訳する。
    テキストエディタやワードプロセッサを使用する能力以上のコンピュータ知識は不要である。



リリースマネージャ

リリースマネージャとは

リリースマネージャとは、開発者と翻訳者の業務を調整する人である。

リリースマネージャが使用するツールとして、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


翻訳ファイル名でロケールを使用すると、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とする場合は、変数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!"の翻訳があれば、翻訳を表示して、無ければ原文が表示される


まず、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ツールの使用方法を、以下に示す。

  1. Qt Linguistツールのメイン画面左ペインの上に、翻訳する対象(ここでは、"QPushButton")を選択する。
  2. 翻訳する文言(ここでは、"Hello world!")を選択する。
  3. Qt Linguistツールのメイン画面中央右にある翻訳ペインに、翻訳した文言を入力する。
  4. [完了]チェックボックスにチェックを入力して、メニューバーから[ファイル] - [保存]を選択する。
  5. TSファイルを確認する。
    # 変換前
    <translation type='unfinished'></translation>

    # 変換後
    <translation>翻訳した文言</translation>


次に、TSファイルからQMファイルを生成する。
QMファイルの生成は、Qt Linguistツールから(1つずつTSファイルに対して)行う、または、lreleaseコマンドを実行して行うことができる。

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


Qt LinguistツールからQMファイルを生成する方法を、以下に示す。

  1. Qt Linguistツールのメニューバーから、[ファイル] - [リリース]を選択する。
  2. ファイル保存ダイアログの[保存]ボタンを押下する。
  3. TSファイルからQMファイルが生成される。
  4. 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ベースとプレーンテキストベースの翻訳の比較
テキスト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
# ...略