qt_standard_project_setup的更先进的国际化。
这个camke命令的官方说明是:项目范围默认标准设置。
该命令在Qt6包的Core组件中定义,可以像这样加载:
find_package(Qt6 REQUIRED COMPONENTS Core)
- qt_standard_project_setup(
- [REQUIRES
] - [SUPPORTS_UP_TO
] - [I18N_TRANSLATED_LANGUAGES
] - [I18N_SOURCE_LANGUAGE
] - )
该命令简化了设置典型Qt应用程序的任务。通常在第一次find_package(Qt6)调用之后立即调用,通常在顶级CMakeLists.txt文件中,并且在定义任何目标之前。
它可以完成以下工作:
qt_standard_project_setup()命令将CMake的一些变量设置为true,如果它们尚未定义。这将默认启用当前目录范围及其子目录中随后创建的目标的所有与Qt相关的自动生成特性。 CMake会自动包含GNUInstallDirs模块。这会为诸如CMAKE_INSTALL_BINDIR、CMAKE_INSTALL_LIBDIR等变量定义适当的默认值。 在针对Windows时,如果CMAKE_RUNTIME_OUTPUT_DIRECTORY变量尚未设置,它将被设置为${CMAKE_CURRENT_BINARY_DIR}。 针对苹果或Windows之外的目标平台,CMAKE_INSTALL_RPATH将按照以下描述进行扩展。 CMake的USE_FOLDERS属性被设置为ON,而QT_TARGETS_FOLDER被设置为QtInternalTargets。支持文件夹的集成开发环境将在此文件夹中显示Qt内部目标。
自Qt 6.5以来,可以通过选择接受来自更新的Qt版本的更改来更改Qt的CMake API的默认行为。如果指定了REQUIRES,将启用Qt引入的所有建议更改,直到REQUIRES,并且使用较旧的Qt版本将导致错误。如果另外指定了SUPPORTS_UP_TO,还将启用在SUPPORTS_UP_TO版本中引入的任何新更改(但是使用较旧的Qt版本不会导致错误)。这类似于CMake的策略概念(请参阅cmake_policy)。 在支持RPATH的平台上(除了苹果平台),此命令将向CMAKE_INSTALL_RPATH变量附加两个值。附加ORIGIN以便库能够在与自身相同目录中找到其依赖的其他库。还附加ORIGIN/
重点来了:
qt_standard_project_setup(REQUIRES 6.5 I18N_TRANSLATED_LANGUAGES en en_AU fr)
解释:需要版本至少6.5(这里来自于QT官方的一个例子,我是用的版本是6.7),加载QT_I18N_SOURCE_LANGUAGE,需要翻译的.ts有en、en_AU、fr如果你想增加中文翻译,只需要在指定的目录加上zh_CN.ts,然后将命令修改为:
qt_standard_project_setup(REQUIRES 6.5 I18N_TRANSLATED_LANGUAGES en en_AU fr zh_CN)
系统将自动生成对应的.pm文件,然后根据用户所在环境自动的执行国际化。
不用向以前if else判断了,也不需要添加资源,不需要手动生成.qm文件
以下代码也不需要了:
- QTranslator translator;
- const QStringList uiLanguages = QLocale::system().uiLanguages();
- for (const QString &locale : uiLanguages) {
- const QString baseName = "untitled_" + QLocale(locale).name();
- if (translator.load(":/projct_/" + baseName)) {
- a.installTranslator(&translator);
- break;
- }
- }
一气呵成。
该条语句示例存在于官方项目:qml-i18n 中,有兴趣的小伙伴可以自行实践。
配合
- qt_add_translations(untitled
- RESOURCE_PREFIX /i18n
- TS_FILE_BASE untitled
- TS_FILE_DIR i18n
- )
生成前缀untitled_的.ts文件
QT6.7以前此命令只接受第一个参数作为“target”。“target”用于提取可翻译源和嵌入 .qm 文件。
QT6.7以后第一个参数“target”不再用于源提取。