使用CMake的Qt:翻译.ts文件不更新

jc3wubiy  于 9个月前  发布在  其他
关注(0)|答案(1)|浏览(103)

我想为我的Qt(版本6.5.2)应用程序提供翻译,该应用程序是用CMake构建的。我用qt_add_translations
在我的源代码中,我使用qr()封装的字符串。现在,我希望生成一个.ts文件,其中包含所有要翻译的字符串的条目。类似地,每个构建过程都应该使用新条目更新此文件。
然而,当我第一次构建应用程序时,生成了一个.ts文件,但不包含任何条目。后续生成也不会更新这些条目。

那么,我做错了什么,我如何才能更新我的.ts文件?我把它归结为这个最小的非工作示例:

// main.cpp

#include "mainwindow.hpp"
#include <QApplication>
#include <QTranslator>

int main(int argc, char *argv[]) {
    QApplication a(argc, argv);

    QTranslator translator;
    if (translator.load(":/i18n/lang_de")) {
        a.installTranslator(&translator);
    }

    MainWindow w;
    w.show();
    return a.exec();
}
// mainwindow.hpp

#ifndef MAINWINDOW_HPP
#define MAINWINDOW_HPP

#include <QMainWindow>

class MainWindow : public QMainWindow {
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
};

#endif // MAINWINDOW_HPP
// mainwindow.cpp

#include "mainwindow.hpp"
#include <QLabel>

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) {
    QLabel *label = new QLabel(tr("Translate this")); // this string should show up in lang_de.ts
    setCentralWidget(label);
}

MainWindow::~MainWindow() {
}
# CMakeLists.txt

cmake_minimum_required(VERSION 3.25)

project(mnwe VERSION 1.0 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)

find_package(Qt6 REQUIRED COMPONENTS Widgets LinguistTools)

add_executable(${CMAKE_PROJECT_NAME} main.cpp mainwindow.hpp mainwindow.cpp)

qt_add_translations(${CMAKE_PROJECT_NAME} TS_FILES lang_de.ts)

target_link_libraries(${CMAKE_PROJECT_NAME} Qt::Widgets)

set_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES
    WIN32_EXECUTABLE ON
    MACOSX_BUNDLE ON
)
<!-- lang_de.ts -->
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="de_DE">
</TS>

我也试过,但没有成功:qt_create_translation、qt_add_lupdate以及一堆可选参数。此外,this question in the Qt forum似乎相似/相同,但没有答案。

5w9g7ksd

5w9g7ksd1#

qt_add_translations(${CMAKE_PROJECT_NAME} TS_FILES lang_de.ts)
创建“规则”和目标mnwe_lupdate
您必须将该目标添加为适当目标的依赖项。
因此,您可以添加:

add_dependencies(mnwe mnwe_lupdate)
add_dependencies(mnwe update_translations) // equivalent of all {target}_lupdate
update_translations

由于lupdate解析所有文件(可能是“长”文件),因此不必在每次构建时都运行它。这就是为什么没有自动在那里添加依赖项原因。

相关问题