Qt与CMake:翻译的.ts文件没有更新。

huangapple go评论152阅读模式
英文:

Qt with CMake: Translation .ts files are not updated

问题

我想为我的Qt应用程序(版本6.5.2)提供翻译,该应用程序是使用CMake构建的。
为此,我使用了qt_add_translations

在我的源代码中,我使用了用qr()封装的字符串。现在,我希望生成一个.ts文件,其中包含所有需要翻译的字符串的条目。类似地,每次构建过程都应该更新此文件中的条目。

然而,当我首次构建应用程序时,会生成一个.ts文件,但不包含任何条目。随后的构建也不会更新这些条目。

那么,我做错了什么,如何才能更新我的.ts文件呢?
我将其简化为以下这个最小的不起作用的示例:

  1. // main.cpp
  2. #include "mainwindow.hpp"
  3. #include <QApplication>
  4. #include <QTranslator>
  5. int main(int argc, char *argv[]) {
  6. QApplication a(argc, argv);
  7. QTranslator translator;
  8. if (translator.load(":/i18n/lang_de")) {
  9. a.installTranslator(&translator);
  10. }
  11. MainWindow w;
  12. w.show();
  13. return a.exec();
  14. }
  1. // mainwindow.hpp
  2. #ifndef MAINWINDOW_HPP
  3. #define MAINWINDOW_HPP
  4. #include <QMainWindow>
  5. class MainWindow : public QMainWindow {
  6. Q_OBJECT
  7. public:
  8. MainWindow(QWidget *parent = nullptr);
  9. ~MainWindow();
  10. };
  11. #endif // MAINWINDOW_HPP
  1. // mainwindow.cpp
  2. #include "mainwindow.hpp"
  3. #include <QLabel>
  4. MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) {
  5. QLabel *label = new QLabel(tr("Translate this")); // 这个字符串应该出现在lang_de.ts中
  6. setCentralWidget(label);
  7. }
  8. MainWindow::~MainWindow() {
  9. }
  1. # CMakeLists.txt
  2. cmake_minimum_required(VERSION 3.25)
  3. project(mnwe VERSION 1.0 LANGUAGES CXX)
  4. set(CMAKE_CXX_STANDARD 20)
  5. set(CMAKE_CXX_STANDARD_REQUIRED ON)
  6. set(CMAKE_AUTOMOC ON)
  7. set(CMAKE_AUTORCC ON)
  8. set(CMAKE_AUTOUIC ON)
  9. find_package(Qt6 REQUIRED COMPONENTS Widgets LinguistTools)
  10. add_executable(${CMAKE_PROJECT_NAME} main.cpp mainwindow.hpp mainwindow.cpp)
  11. qt_add_translations(${CMAKE_PROJECT_NAME} TS_FILES lang_de.ts)
  12. target_link_libraries(${CMAKE_PROJECT_NAME} Qt::Widgets)
  13. set_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES
  14. WIN32_EXECUTABLE ON
  15. MACOSX_BUNDLE ON
  16. )
  1. <!-- lang_de.ts -->
  2. <?xml version="1.0" encoding="utf-8"?>
  3. <!DOCTYPE TS>
  4. <TS version="2.1" language="de_DE">
  5. </TS>

我还尝试了以下方法,但没有成功:qt_create_translationqt_add_lupdate,以及这些方法的一些可选参数。
此外,Qt论坛中的这个问题看起来很相似/相同,但没有答案。

英文:

I want to provide translations to my Qt (version 6.5.2) application, built with CMake.
For this, I am using qt_add_translations.

In my source code, I use strings encapsulated with qr(). Now I would expect a .ts file to be generated with entries for all strings to be translated. Similarly, every build process should update this file with new entries.

However, when I first build the application, a .ts file is generated but does not contain any entries. Subsequent builds also do not update the entries.

So, what am I doing wrong and how can I get updates to my .ts file?
I boiled it down to this minimal non-working example:

  1. // main.cpp
  2. #include &quot;mainwindow.hpp&quot;
  3. #include &lt;QApplication&gt;
  4. #include &lt;QTranslator&gt;
  5. int main(int argc, char *argv[]) {
  6. QApplication a(argc, argv);
  7. QTranslator translator;
  8. if (translator.load(&quot;:/i18n/lang_de&quot;)) {
  9. a.installTranslator(&amp;translator);
  10. }
  11. MainWindow w;
  12. w.show();
  13. return a.exec();
  14. }
  1. // mainwindow.hpp
  2. #ifndef MAINWINDOW_HPP
  3. #define MAINWINDOW_HPP
  4. #include &lt;QMainWindow&gt;
  5. class MainWindow : public QMainWindow {
  6. Q_OBJECT
  7. public:
  8. MainWindow(QWidget *parent = nullptr);
  9. ~MainWindow();
  10. };
  11. #endif // MAINWINDOW_HPP
  1. // mainwindow.cpp
  2. #include &quot;mainwindow.hpp&quot;
  3. #include &lt;QLabel&gt;
  4. MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) {
  5. QLabel *label = new QLabel(tr(&quot;Translate this&quot;)); // this string should show up in lang_de.ts
  6. setCentralWidget(label);
  7. }
  8. MainWindow::~MainWindow() {
  9. }
  1. # CMakeLists.txt
  2. cmake_minimum_required(VERSION 3.25)
  3. project(mnwe VERSION 1.0 LANGUAGES CXX)
  4. set(CMAKE_CXX_STANDARD 20)
  5. set(CMAKE_CXX_STANDARD_REQUIRED ON)
  6. set(CMAKE_AUTOMOC ON)
  7. set(CMAKE_AUTORCC ON)
  8. set(CMAKE_AUTOUIC ON)
  9. find_package(Qt6 REQUIRED COMPONENTS Widgets LinguistTools)
  10. add_executable(${CMAKE_PROJECT_NAME} main.cpp mainwindow.hpp mainwindow.cpp)
  11. qt_add_translations(${CMAKE_PROJECT_NAME} TS_FILES lang_de.ts)
  12. target_link_libraries(${CMAKE_PROJECT_NAME} Qt::Widgets)
  13. set_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES
  14. WIN32_EXECUTABLE ON
  15. MACOSX_BUNDLE ON
  16. )
  1. &lt;!-- lang_de.ts --&gt;
  2. &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
  3. &lt;!DOCTYPE TS&gt;
  4. &lt;TS version=&quot;2.1&quot; language=&quot;de_DE&quot;&gt;
  5. &lt;/TS&gt;

Things I also tried, without success: qt_create_translation, qt_add_lupdate, as well as a bunch of optional arguments to these.
Also, this question in the Qt forum seems similar/identical but has no answers.

答案1

得分: 1

qt_add_translations(${CMAKE_PROJECT_NAME} TS_FILES lang_de.ts)创建了一个"rule"和一个目标mnwe_lupdate

您需要将该目标添加为适当目标的依赖项。

因此,您可以添加以下内容之一:

  1. add_dependencies(mnwe mnwe_lupdate)
  2. add_dependencies(mnwe update_translations) // 等同于所有{target}_lupdate
  3. update_translations

由于lupdate解析所有文件(可能会很"长"),所以每次构建都运行它并不是一个好主意。这就是为什么该依赖项不会自动添加的原因。

英文:

qt_add_translations(${CMAKE_PROJECT_NAME} TS_FILES lang_de.ts)

creates the "rule" and a target mnwe_lupdate.

You have to add that target as dependencies of appropriate target.

So you might add either:

  1. add_dependencies(mnwe mnwe_lupdate)
  2. add_dependencies(mnwe update_translations) // equivalent of all {target}_lupdate
  3. update_translations

As lupdate parses all files (might be "long"), it is not necessary a good idea to run it for each build. that's why that dependency is not automatically add there.

huangapple
  • 本文由 发表于 2023年8月8日 22:33:19
  • 转载请务必保留本文链接:https://go.coder-hub.com/76860562.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定