局部クロックの例
この例では、CMake とQt Quick で Qt の翻訳とローカライズの機能を使用するためのベストプラクティスを示します。異なる言語での複数形の取り扱いや、ローカライズされた時刻と日付のフォーマットを含みます。
Qt アプリケーションの翻訳に関する詳細は、Qt Linguist マニュアルを参照してください。
ユーザーインターフェース
この例では、システムのロケールと言語で現在の時刻と日付を表示しています。さらに、UI のテキストは以下の言語にローカライズされています:英語、ドイツ語、フランス語、スペイン語、イタリア語、日本語、韓国語、ポルトガル語、アラビア語、中国語。デスクトップが他の言語で表示されている場合は、英語にフォールバックされます。
システムを変更せずに異なる言語やロケールをテストするために、この例ではコマンドライン引数としてロケールを受け取ることもできます。たとえば、コマンドラインから--locale de
オプションをつけてlocalizedClockを起動すると、ドイツで一般的な日付と時刻のフォーマットで、ドイツ語の時計が表示されます。
スクリーンショットはen_USバージョンです:
国際化
アプリケーションでは、メインウィンドウのタイトルと、プレースホルダーや複数形を含むいくつかのUIテキストを設定するために翻訳が使用されます。アプリケーションは複数形を有効にして秒を数えます(複数形の扱い方を参照)。その結果、秒のカウントに応じて、翻訳関数はターゲット言語の正しい文法番号で、異なる翻訳を返します。例えば、英語の場合、秒数が1より大きければ複数形が使われ、そうでなければ単数形が使われます。複数形の翻訳ルールでは、さまざまな言語の複数形のルールを見つけることができます。
ロケールは日付や時刻の表示方法にも影響します。これらは現在のロケールの国の規則に従ってフォーマットされます。例えば、ドイツのロケールでは24時間表示で月の前に日が表示されますが、アメリカのロケールでは12時間表示で日の前に月が表示されます。
このスクリーンショットはen_GBバージョンです。上のen_USバージョンとはデータ形式が異なりますが、どちらも同じ英語の複数形翻訳が読み込まれていることに注意してください。
これはde_DEバージョンのスクリーンショットです。GBバージョンと同様に、USバージョンとは日付の書式が異なります。ドイツ語の通常形と複数形の翻訳がそれに応じて読み込まれていることに注目してください。
実装
実装には3つの部分があります:
CMakeLists.txt
アプリケーションのCMakeファイルは、Qtの翻訳とローカリゼーションのサポートを有効にします。以下に関連する部分を示します:
find_package(Qt6 REQUIRED COMPONENTS Core Linguist Qml Quick)
:国際化に不可欠なLinguist
を含む、必要な Qt 6 モジュールを見つけてリンクします。
qt_standard_project_setup(...)
:リストされたロケールをサポートする国際化システムを設定します。ソースコードに英語のテキストが含まれているため、I18N_SOURCE_LANGUAGE
はデフォルト値 (English) のままです。
qt_standard_project_setup(REQUIRES 6.8 I18N_TRANSLATED_LANGUAGES de ar ko zh ja fr it es pt)
qt_add_translations(...)
:clock
をベース名として "i18n" ディレクトリに翻訳ソースファイル (TS ファイル) を生成し、翻訳を含む場合はバイナリの.qm
ファイルにコンパイルすることで、lupdate
とlrelease
の機能をバンドルします。以下のTSファイルが生成されます:
- "clock_{de,ar,ko,zh,ja,fr,it,es,pt}.ts":
qt_standard_project_setup
のI18N_TRANSLATED_LANGUAGES
に記載されている言語ごとに、その言語への翻訳を含むTSファイルが1つ生成される。 - "clock_en.ts":ソースコードに複数形の翻訳("%n second(s)")があるため、英語の複数形が含まれる。
I18N_SOURCE_LANGUAGE
をデフォルト値のままにして、ソースコードのテキストの言語を英語に指定したため、関数qt_add_translations
はここに複数形のみを書き込みます。そのため、通常のテキストには翻訳は必要ありません。
qt_add_translations(localizedClock TS_FILE_BASE i18n/clock RESOURCE_PREFIX i18n )
qt_add_qml_module(...)
:qtexamples.localizedclock
、Main.qmlファイルを含むQMLモジュールを追加します。
qt_add_qml_module(localizedClock URI qtexamples.localizedclock VERSION 1.0 QML_FILES Main.qml )
main.cpp
アプリケーションのスタート地点。この部分は、ロケールの設定、必要な翻訳のインストール、UIの読み込みを担当する。以下は関連するコードの説明です:
ロケール引数を定義します。例えば、--locale en_US
や--locale de_DE
などです:
QCommandLineParser parser; QCommandLineOption localeOption("locale"_L1, "Locale to be used in the user interface"_L1, "locale"_L1); parser.addOption(localeOption); parser.addHelpOption(); parser.process(app);
引数を解析し、指定されたロケールを取得し、入力されたロケールをアプリケーションのデフォルトロケールとして設定します:
QLocaleロケール(parser.value(localeOption)); qInfo() << "Setting locale to" << locale.name(); QLocale::setDefault(locale);
ロケールに関係なく英語翻訳をインストールし、他の言語の不完全な翻訳を許可します。QTranslator 翻訳がインストールされる順序を逆にしたテキストの翻訳を問い合わせます:
QTranslatorenPlurals;const autoenPluralsPath= ":/i18n/clock_en.qm"_L1;if(!enPlurals.load(enPluralsPath)) qFatal("Could not load %s!", qUtf8Printable(enPluralsPath)); app.installTranslator(&enPlurals);
指定されたロケールに従って翻訳をインストールします。英語の翻訳は前のステップでインストール済みなので、ここでは2つの翻訳をインストールすることになります。Qtは重複するキーに対して、最近インストールされた翻訳を使用します。そのため、ロケール固有の翻訳が英語よりも優先され、翻訳がない場合はQTranslator が英語にフォールバックします。
QTranslator翻訳;if(QLocale().language()!=QLocale::English) {if(translation.load(), "clock"_Language() !QLocale(), "clock"_L1, "_"_L1, ":/i18n/"_L1)) { { { { ().language() ! qInfo("Loading translation %s", qUtf8Printable(QDir::toNativeSeparators(translation.filePath())));if(!app.installTranslator(&translation)) qWarning("Could not install %s!", qUtf8Printable(QDir::toNativeSeparators(translation.filePath()))); }else{ { {. qInfo("Could not load translation to %s. Using English.", qUtf8Printable(QLocale().name()); } }
メイン.qml
このQMLファイルは、アプリケーションのメインUIウィンドウを定義するもので、時刻、日付、使用ロケール、秒カウンターを表示します。以下は、関連するコードの説明です:
qsTr()を使ってウィンドウのタイトルを設定します。このテキストの翻訳を見つけるために、QTranslator 現在の言語のTSファイルで、コンテキスト"Main"(ファイル名)内のテキスト"Digital Clock "をクエリします:
title: qsTr("Digital Clock")
複数形(数字)をサポートする qsTr() を使用して、秒数を表示する。複数形は、特別な表記法"%n "を使用することで有効になる(複数形の扱いを参照)。n の値によって、翻訳関数は、ターゲット言語の正しい文法番号で、異なる翻訳を返す。例えば英語では、root.seconds
の値が1より大きければ複数形が使われ、そうでなければ単数形が使われます。複数形の翻訳ルールでは、さまざまな言語の複数形のルールを見つけることができます。
text: qsTr("%n second(s)", "seconds", root.seconds)
現在のロケールを表示し、qsTr() を使用してソーステキスト "Locale: %1" を翻訳します。また、翻訳には引数表記 "%1" が必要です。その結果、テキストの引数 (すなわち、Qt.locale().name
) は、テキストの書式設定に正しく使用できます:
text: qsTr("Locale: %1").arg(Qt.locale().name)
ロケールの規約に従って、時刻と日付をフォーマットしてください。異なる国では、時刻と日付の表示方法について特定の好みがあるかもしれません。たとえば、ドイツのロケールでは24時間制を採用しており、月の前に日を書きます。一方、アメリカのロケールでは12時間制を採用しており、日の前に月を書きます。Date.toLocaleTimeStringメソッドはこのような点を考慮し、指定したロケールに基づいて時刻と日付を正しくフォーマットします:
const now = new Date(); const locale = Qt.locale(); root.time = now.toLocaleTimeString(locale, Locale.ShortFormat); root.date = now.toLocaleDateString(locale);
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.