地域設定された時計の例
この例では、CMakeおよびQt Quick におけるQtの翻訳・ローカライズ機能の使用に関するベストプラクティスを紹介しています。これには、各言語における複数形の扱い方や、ローカライズされた日時形式の設定などが含まれます。
Qtアプリケーションの翻訳に関する詳細については、『Qt Linguist マニュアル』を参照してください。
ユーザーインターフェース
このサンプルでは、お使いのシステムのロケールと言語に基づいて、現在の時刻と日付が表示されます。また、UI上のテキストは、英語、ドイツ語、フランス語、スペイン語、イタリア語、日本語、韓国語、ポルトガル語、アラビア語、中国語の各言語に対応しています。デスクトップの言語設定がこれら以外の言語の場合、英語が表示されます。
システム設定を変更せずにさまざまな言語やロケールを試すために、このサンプルではコマンドライン引数としてロケールを指定することも可能です。たとえば、コマンドラインから `localizedClock` を `--locale de ` オプション付きで起動すると、ドイツ語で時計が表示され、日付と時刻の形式もドイツで一般的な形式になります。
スクリーンショットは en_US バージョンのものです:

国際化
このアプリケーションでは、メインウィンドウのタイトルや、プレースホルダーや複数形を含むいくつかのUIテキストの設定に翻訳が使用されています。アプリケーションは、複数形が有効な状態で秒数をカウントします(「複数形の処理」を参照)。 その結果、秒数に応じて、翻訳関数は対象言語の文法的に正しい数形を用いた異なる翻訳を返します。例えば、英語の場合、秒数が1より大きい場合は複数形が使用され、それ以外の場合は単数形が使用されます。「複数形の翻訳ルール」では、各言語の複数形に関するルールをご確認いただけます。
ロケールは、日付や時刻の表示方法にも影響を与えます。これらは、現在のロケールの国の慣習に従ってフォーマットされます。たとえば、ドイツ語のロケールでは24時間制が採用され、日付は月の前に記載されますが、米国のロケールでは12時間制が採用され、月は日付の前に記載されます。
このスクリーンショットは en_GB バージョンを示しています。どちらの場合も、同じ英語の複数形翻訳が読み込まれているにもかかわらず、日付の形式が上記の en_US バージョンとは異なっていることにご注目ください。

こちらは de_DE バージョンのスクリーンショットです。en_GB と同様に、米国版とは日付の形式が異なります。通常形および複数形のドイツ語翻訳が、それに応じて読み込まれている点にご注目ください。

実装
実装は3つの部分で構成されています:
CMakeLists.txt
このアプリケーションの CMake ファイルでは、Qt の翻訳およびローカライズ機能が有効になっています。関連する部分は以下の通りです:
find_package(Qt6 REQUIRED COMPONENTS Core Linguist Qml Quick): 国際化に不可欠なLinguist を含む、必要なQt 6モジュールを検索し、リンクします。
qt_standard_project_setup(...): リストされたロケールをサポートするように国際化システムを設定します。ソースコードには英語のテキストが含まれているため、I18N_SOURCE_LANGUAGE はデフォルト値(英語)のままにされています。
qt_standard_project_setup(REQUIRES 6.8
I18N_TRANSLATED_LANGUAGES de ar ko zh ja fr it es pt)qt_add_translations(...): 翻訳ソースファイル (TS ファイル) を「i18n」ディレクトリに生成し、ファイル名にはclock をベースとして使用します。また、翻訳が含まれている場合は、それらをバイナリ形式の.qm ファイルにコンパイルすることで、lupdate およびlrelease の機能を統合します。以下の TS ファイルが生成されます:
- "clock_{de, ar, ko, zh, ja, fr, it, es, pt}.ts":
qt_standard_project_setupのI18N_TRANSLATED_LANGUAGESに記載されている各言語ごとに 1 つの TS ファイルが生成され、その言語への翻訳が含まれます。 - "clock_en.ts": ソースコードに複数形の翻訳("%n second(s)")が含まれているため、英語の複数形が含まれます。 関数
qt_add_translationsは、I18N_SOURCE_LANGUAGEの値をデフォルトのままにしておくことでソースコード内のテキストの言語を英語として指定したため、ここでは複数形のみを出力します。したがって、通常のテキストには翻訳は必要ありません。
qt_add_translations(localizedClock
TS_FILE_BASE i18n/clock
RESOURCE_PREFIX i18n
)qt_add_qml_module(...): URIqtexamples.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 locale(parser.value(localeOption));
qInfo() << "Setting locale to" << locale.name();
QLocale::setDefault(locale);ロケールに関係なく英語翻訳をインストールし、他の言語の翻訳が不完全な場合でも利用できるようにします。QTranslator は、翻訳がインストールされた順序と逆の順序でテキストの翻訳を照会します:
QTranslator enPlurals;
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 translation;
if(QLocale().language()!=QLocale::English) {
if(translation.load(QLocale(), "clock"_L1, "_"_L1, ":/i18n/"_L1)) {
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()));
}
}Main.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);© 2026 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.