ランタイム言語スイッチ付きローカライズド・クロック
この例では、Qtの翻訳とローカライゼーション機能をCMakeで使用するためのベストプラクティスを示します。 Qt Quickで Qt の翻訳とローカライゼーションの機能を使うためのベストプラクティスを示しています。これは、よりシンプルなローカライズ時計の例を拡張したものです。
Qt アプリケーションの翻訳については、Qt Linguist マニュアルを参照してください。
ユーザーインターフェース
この例では、システムのロケールと言語で現在の時刻と日付を表示しています。UI テキストも以下の言語にローカライズされています:英語、ドイツ語、フランス語、スペイン語、イタリア語、日本語、韓国語、ポルトガル語、アラビア語、中国語。また、メニューボタンで異なる言語やロケールを選択することもできます。
英語版アプリケーション:
実行時に言語を変更した後のドイツ語バージョン:
実装
このアプリケーションには4つの部分があります:
CMakeLists.txt
CMakeの統合は、Localized ClockサンプルのCMake統合と同じです。詳細はそのページを参照してください。
main.cpp
アプリケーションの開始点であり、QMLモジュールのロードを担当します。
int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); QQmlApplicationEngine engine; QObject::connect( &engine, &QQmlApplicationEngine::objectCreationFailed, &app, [](const QUrl &) { QCoreApplication::exit(-1); }, Qt::QueuedConnection); engine.loadFromModule("qtexamples.localizedclockswitchlocale", "Main"); return app.exec(); }
トランスレータマネージャ (translator.h, translator.cpp)
TranslatorManager
はQMLのシングルトン・クラスで、実行時の言語とロケールの切り替えを管理します。このクラスの中心的なメソッドはTranslatorManager::switchLanguage()
で、言語コードを表す文字列を受け取ります。
このメソッドはQ_INVOKABLE でマークされていますが、 TranslatorManager クラスはQML_ELEMENT とQML_SINGLETON で宣言されています。これにより、このメソッドはQMLから直接アクセスできるようになります。
voidTranslatorManager::switchLanguage(constQStringロケール(lang) QLocalelocale(lang); QLocale::setDefault(locale); qApp->removeTranslator(&m_translator);// Qt 6.10からは必要ありません if(m_translator.load(locale, "clock"_L1, "_"_L1, ":/i18n/"_L1)&& qApp->installTranslator(&m_translator)) { m_engine.retranslate(); }else{ { Qt 6.10からは必要ありません。 qWarning("Could not load translation to %s!", qPrintable(locale.name())); } }
実行時に翻訳を更新する
言語を切り替えると、以前の翻訳が削除され(QCoreApplication::removeTranslator() )、選択した言語の新しい翻訳が読み込まれ(QTranslator::load() )、インストールされます(QCoreApplication::installTranslator() )。QQmlEngine::retranslate()をトリガーとして、QMLドキュメント内の文字列が再翻訳されます。
日付と時刻のフォーマットの更新
言語を変更すると、日付や時刻の表示方法にも影響を与える可能性があります。例えば、あなたのシステムでQLocale が "en "を "en_US"、"de "を "de_DE "というロケールを好むとします:
- アプリケーションは最初、国コードとして "US "でロードされます。
- USロケールの規約により、日付はMM/DD/YYYYフォーマットで表示され、時刻は12時間時計を使用します。
- 言語をドイツ語に変更した後、"de_DE "がドイツ語の最初の優先ロケールであるため、国はドイツに変更される。
- ドイツの規約では、DD.MM.YYYY形式で日付が表示され、24時間時計が使用されます。
言語を切り替えると、アプリケーションはQLocale::setDefault ()を使用して、選択された言語に従ってQLocale 。時刻を表す場合、Date.toLocaleTimeString ()関数は、アプリケーションのロケールに従って時刻と日付をローカライズします(Main.qmlを参照)。
Main.qml
メインQMLファイルはアプリケーションのユーザーインターフェースを定義します。UIは時刻、日付、秒カウンターを表示します。基本的な翻訳(ウィンドウのタイトル)と複数の処理(秒数)については、ローカライズされた時計の例を参照してください。
Menu
TranslatorManager.switchLanguage()
から項目を選択すると、それぞれの言語コードで呼び出されます。この呼び出しは、翻訳可能なテキストの再翻訳も行います(Translator Managerを参照)。しかし、言語が変更された場合、新しいローカライズフォーマットで時刻表示を更新するためにupdateClock()
を呼び出す必要があります。
ListModel { id: languageModel ListElement { name: "English"; code: "en" } ListElement { name: "Deutsch"; code: "de" } ListElement { name: "العربية"; code: "ar" } ListElement { name: "한국어"; code: "ko" } ListElement { name: "中文"; code: "zh" } ListElement { name: "日本語"; code: "ja" } ListElement { name: "Français"; code: "fr" } ListElement { name: "Italiano"; code: "it" } ListElement { name: "Español"; code: "es" } ListElement { name: "Português"; code: "pt" } } Menu { id: languageMenu width: languageButton.width Repeater { model: languageModel delegate: MenuItem { required property string name required property string code text: name onTriggered: { TranslatorManager.switchLanguage(code) root.selectedLanguage = name root.updateClock() } } } }
© 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.