本地化时钟示例
该示例展示了在 CMake 和Qt Quick 中使用 Qt 翻译和本地化功能的最佳实践,包括处理不同语言中的复数形式,以及本地化的时间和日期格式。
有关翻译 Qt 应用程序的更多信息,请参阅《Qt Linguist 手册》。
用户界面
该示例以您系统的区域设置和语言显示当前的时间和日期。此外,用户界面中的文本还针对以下语言进行了本地化:英语、德语、法语、西班牙语、意大利语、日语、韩语、葡萄牙语、阿拉伯语和中文。如果您的桌面环境使用的是其他语言,则会回退到英语。
为了在不更改系统设置的情况下测试不同的语言和区域设置,该示例还支持将区域设置作为命令行参数传入。例如,在命令行中使用选项--locale de 启动 localizedClock,时钟将以德语显示,并采用德国通用的日期和时间格式。
下图显示的是 en_US 版本:

国际化
在该应用程序中,翻译功能用于设置主窗口标题和部分 UI 文本,包括包含占位符和复数形式的文本。该应用程序在计时过程中启用了复数形式(参见“处理复数形式”)。 因此,根据秒数的多少,翻译函数会返回不同的翻译结果,并确保目标语言中数词形式正确。例如,在英语中,如果秒数大于一,则使用复数形式;否则使用单数形式。在“复数形式的翻译规则”中,您可以查阅不同语言的复数规则。
区域设置还会影响日期和时间的显示方式。这些内容将根据当前区域设置所属国家的惯例进行格式化。例如,德国区域设置会采用 24 小时制,且日期写在月份之前;而美国区域设置则采用 12 小时制,且月份写在日期之前。
此屏幕截图展示了 en_GB 版本。请注意,其日期格式与上文的 en_US 版本不同,尽管两种情况下加载的都是相同的英语复数翻译。

以下是 de_DE 版本的屏幕截图,与 GB 版本类似,其日期格式也与美国版本不同。请注意,常规形式和复数形式的德语翻译已相应加载。

实现
该实现包括三个部分:
CMakeLists.txt
该应用程序的 CMake 文件启用了 Qt 的翻译和本地化支持。以下是相关代码片段:
find_package(Qt6 REQUIRED COMPONENTS Core Linguist Qml Quick): 查找并链接所需的 Qt 6 模块,包括对国际化至关重要的Linguist 。
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(...): 整合了lupdate 和lrelease 的功能,通过以clock 为基名在“i18n”目录中生成翻译源文件(TS文件),并在文件包含翻译内容时将其编译为二进制.qm 文件。生成的TS文件如下:
- "clock_{de, ar, ko, zh, ja, fr, it, es, pt}.ts":针对
qt_standard_project_setup中的I18N_TRANSLATED_LANGUAGES所列每种语言,生成一个包含该语言翻译内容的 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 下添加一个 QML 模块,其中包含Main.qml文件。
qt_add_qml_module(localizedClock
URI qtexamples.localizedclock
VERSION 1.0
QML_FILES
Main.qml
)main.cpp
应用程序的入口点。该部分负责设置区域设置、安装所需的翻译文件以及加载用户界面。以下是对相关代码片段的说明:
定义区域设置参数,例如:--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);根据给定的区域设置安装翻译。由于在上一步中已安装了英语翻译,此处可能会导致同时安装了两个翻译。对于任何重叠的键,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.