• qt_standard_project_setup


    qt_standard_project_setup的更先进的国际化。

    这个camke命令的官方说明是:项目范围默认标准设置。

    该命令在Qt6包的Core组件中定义,可以像这样加载:

     find_package(Qt6 REQUIRED COMPONENTS Core)
    
    • 这个命令是在Qt 6.3中引入的
    1. qt_standard_project_setup(
    2.      [REQUIRES ]
    3.      [SUPPORTS_UP_TO ]
    4.      [I18N_TRANSLATED_LANGUAGES ]
    5.      [I18N_SOURCE_LANGUAGE ]
    6.  )

    该命令简化了设置典型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/,其中是从CMAKE_INSTALL_BINDIR到CMAKE_INSTALL_LIBDIR的相对路径。这允许安装到CMAKE_INSTALL_BINDIR的可执行文件找到任何安装到CMAKE_INSTALL_LIBDIR的可能依赖的库。CMAKE_INSTALL_RPATH中的任何重复项都将被移除。在实践中,这两个值确保可执行文件和库能够找到它们的链接时依赖项,假设项目将它们安装到install(TARGETS)命令在没有明确提供目标时使用的默认位置。 要禁用集成开发环境的文件夹支持,请在调用qt_standard_project_setup之前或之后将USE_FOLDERS设置为OFF。 通过将QT_NO_STANDARD_PROJECT_SETUP变量设置为true,可以有效地禁用qt_standard_project_setup()命令。

    重点来了:

    • 自Qt 6.7以来,可以使用I18N_TRANSLATED_LANGUAGES参数指定用于项目国际化的语言。参见QT_I18N_TRANSLATED_LANGUAGES了解详细信息。 使用I18N_SOURCE_LANGUAGE指定编写可翻译字符串所用的语言。缺省情况下,使用“en”。详细信息请参见QT_I18N_SOURCE_LANGUAGE。
    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文件

    以下代码也不需要了:

    1. QTranslator translator;
    2. const QStringList uiLanguages = QLocale::system().uiLanguages();
    3. for (const QString &locale : uiLanguages) {
    4. const QString baseName = "untitled_" + QLocale(locale).name();
    5. if (translator.load(":/projct_/" + baseName)) {
    6. a.installTranslator(&translator);
    7. break;
    8. }
    9. }

    一气呵成。

    该条语句示例存在于官方项目:qml-i18n 中,有兴趣的小伙伴可以自行实践。

    配合

    1. qt_add_translations(untitled
    2. RESOURCE_PREFIX /i18n
    3. TS_FILE_BASE untitled
    4. TS_FILE_DIR i18n
    5. )

    生成前缀untitled_的.ts文件

    QT6.7以前此命令只接受第一个参数作为“target”。“target”用于提取可翻译源和嵌入 .qm 文件。

    QT6.7以后第一个参数“target”不再用于源提取。

  • 相关阅读:
    代码随想录训练营第33天|休息日 小结
    设计模式之单例和原型
    【kafka实战】01 3分钟在Linux上安装kafka
    iOS 内存管理和优化
    力扣刷题篇之数与位3
    ABP - 初识 ABP
    Codeforces Round #820 (Div. 3) G-Cut Substrings(kmp状态机dp)
    富士康曲线救国,iPhone 15 Pro订单较上代有减少,iPhone 15增加
    质量属性案例-架构真题(二十一)
    Open3D (C++) 八叉树的使用
  • 原文地址:https://blog.csdn.net/star65806841/article/details/138012880