为啥我需要一个 QTranslator 来在 Windows 上的 QMessageBox 中本地化按钮文本?

Posted

技术标签:

【中文标题】为啥我需要一个 QTranslator 来在 Windows 上的 QMessageBox 中本地化按钮文本?【英文标题】:Why do I need a QTranslator for localized button texts in a QMessageBox on Windows?为什么我需要一个 QTranslator 来在 Windows 上的 QMessageBox 中本地化按钮文本? 【发布时间】:2017-07-16 19:57:34 【问题描述】:

我正在开发一个在 Linux 和 Windows 上运行的 Qt 应用程序。我在德国地区。

在 Linux 上构建它时,我得到了 e 显示的标准按钮的正确翻译。 G。 QMessageBox::questionQMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel 按钮集(在我的例子中是“Ja”、“Nein”和“Abbrechen”)。

如果我在 Windows 上构建代码,我只会获得这些按钮(“是”、“否”和“取消”)的 C 语言环境(英语)文本。

经过一番搜索,我通过添加找到了一个全局可行的解决方案

#include <QTranslator>
#include <QLibraryInfo>

QTranslator qtTranslator;
if (qtTranslator.load(QLocale::system(), QString::fromUtf8("qt"), QString::fromUtf8("_"),
                      QLibraryInfo::location(QLibraryInfo::TranslationsPath))) 
    app.installTranslator(&qtTranslator);

致我的main.cpp

使用它,我还可以在 Windows 上获得翻译后的字符串。然而,在 Linux 上,qtTranslator.load 调用失败,因此我之前的状态没有任何变化,所以我最终将该代码放入了 #ifdef Q_OS_WIN 块中。

这可行,但对我来说似乎有点 hacky。另外,我不明白为什么我默认在 Linux 上而不是在 Windows 上得到翻译后的字符串。

我的做法是正确的解决方案吗?如果是这样,我为什么在 Windows 上需要额外的代码?

【问题讨论】:

【参考方案1】:

尝试在此替换您的代码并进行测试。

static QTranslator qtTr;
qtTr.load("qt_" + QLocale::system().name(), QLibraryInfo::location(QLibraryInfo::TranslationsPath));
installTranslator(&qtTr);

【讨论】:

我认为这不会改变任何事情。在我的 linux 机器上,QLibraryInfo::location(QLibraryInfo::TranslationsPath) 给了我/usr/share/qt5/translations,它甚至不存在。所以它会在 Linux 上再次失败。好吧,在 Windows 上,它就像我在上面发布的那样工作......我仍然想知道为什么我需要在 Windows 上而不是在 Linux 上的代码! @TobiasLeupold 你用的是什么版本的qt? 先是 5.6.2,然后是 5.7.1。两个版本的行为相同。 @TobiasLeupold 编译器呢? msvc, mingw? Linux 上的 cmake + gcc,Windows 上的 cmake + mingw 和 qmake + mingw。

以上是关于为啥我需要一个 QTranslator 来在 Windows 上的 QMessageBox 中本地化按钮文本?的主要内容,如果未能解决你的问题,请参考以下文章

为啥需要方括号来在 Javascript 中对 Map 的所有元素进行字符串化?

为啥 g++ 需要 -fpermissive 标志来在 c++ 中打印迭代器值? [关闭]

如何基于 QTranslator 更改 QPushButton 的图标字符串

QTranslator 没有在 PyQt5 中持久安装

为啥要设计一个库来在 Javascript 中使用 const [] 而不是 const ?

QTranslator 在 if 语句中使用时不起作用