未找到 Qt5 QDialogButtonBox 本地化值,尽管它们存在于 qt_xx.qm 中并且在 Qt4 中找到
Qt5 QDialogButtonBox localized values aren't found, though they exist in qt_xx.qm and were found in Qt4
将我的应用程序从 Qt 4.8 升级到 Qt 5.4.1,我注意到当 运行我的非英语应用程序时,"QDialogButtonBox" 中的 t运行 指定项目找不到 qt_xx.ts 的部分。找到并正确显示其他项目,例如 "QWizard" 部分中的项目。
如何让我的 QMessageBox
的按钮使用 qt_xx.qm 中的 t运行 指定字符串?
我用法语来演示这个问题(下面的代码):
我删除了 qt_fr.ts 文件中除 "QDialogButtonBox" 和 "QWizard" 之外的所有部分。我在 "QWizard" 部分编辑了 "Cancel" 的 t运行slation 以确保完全使用 qt_fr.qm。然后我 运行 lrelease 创建我的 qt_fr.qm.
在 Windows 7 框中,在“区域和语言”对话框中:
- 在“格式”选项卡中,我将格式设置为 "French (France)"
- 在键盘和语言选项卡中,我将显示语言设置为法语。
我 运行 我的示例项目与 .exe 和 qt_fr.qm 在同一文件夹中。在该文件夹中,我还有一个必要的 Qt5 dll 的副本(可以从 Qt 的 Windows 构建中复制它们,在 qtbase\bin 中)。
结果:
当我单击 "QMessageBox" 按钮时,我看到一个 QMessageBox
,按钮不是 运行 指定的。当我单击 "QWizard" 按钮时,我看到一个 QWizard
,而取消按钮确实有我编辑的 t运行slation。
QMessageBox 按钮在我的应用程序的 Qt 4 版本中是 t运行。什么改变了?我如何让它在 Qt 5 中工作?
示例项目代码:
btn_localize_bug757.pro:
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = btn_localize_bug757
TEMPLATE = app
SOURCES += main.cpp\
mainwindow.cpp
HEADERS += mainwindow.h
main.cpp
#include "mainwindow.h"
#include <QtWidgets/QApplication>
#include <QtCore/QTranslator>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTranslator qtTranslator;
qtTranslator.load("qt_fr");
a.installTranslator(&qtTranslator);
MainWindow w;
w.show();
return a.exec();
}
mainwindow.h:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QtWidgets/QMainWindow>
#include <QtWidgets/QPushButton>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void showMessage();
void showWizard();
private:
QPushButton *showMessageButton;
QPushButton *showWizardButton;
};
#endif // MAINWINDOW_H
mainwindow.cpp:
#include "mainwindow.h"
#include <QtWidgets/QMessageBox>
#include <QtWidgets/QVBoxLayout>
#include <QtWidgets/QWizard>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
setWindowTitle("test");
QPushButton *showMessageButton = new QPushButton("QMessageBox", this);
connect(showMessageButton, SIGNAL(clicked()), SLOT(showMessage()));
QPushButton *showWizardButton = new QPushButton("QWizard", this);
connect(showWizardButton, SIGNAL(clicked()), SLOT(showWizard()));
QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(showMessageButton);
layout->addWidget(showWizardButton);
QWidget *window = new QWidget();
window->setLayout(layout);
setCentralWidget(window);
}
MainWindow::~MainWindow()
{
}
void MainWindow::showMessage()
{
QMessageBox msg(this);
msg.setWindowModality(Qt::WindowModal);
msg.setIcon(QMessageBox::Question);
msg.setText("test");
msg.setStandardButtons(QMessageBox::Save |
QMessageBox::Discard |
QMessageBox::Cancel);
msg.setDefaultButton(QMessageBox::Save);
msg.exec();
}
void MainWindow::showWizard()
{
QWizard *wiz = new QWizard();
wiz->show();
}
qt_fr.ts:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.0" language="fr">
<context>
<name>QDialogButtonBox</name>
<message>
<source>OK</source>
<translation>OK</translation>
</message>
<message>
<source>Save</source>
<translation>Enregistrer</translation>
</message>
<message>
<source>&Save</source>
<translation>Enregi&strer</translation>
</message>
<message>
<source>Open</source>
<translation>Ouvrir</translation>
</message>
<message>
<source>Cancel</source>
<translation>Annuler</translation>
</message>
<message>
<source>&Cancel</source>
<translation>&Annuler</translation>
</message>
<message>
<source>Close</source>
<translation>Fermer</translation>
</message>
<message>
<source>&Close</source>
<translation>&Fermer</translation>
</message>
<message>
<source>Apply</source>
<translation>Appliquer</translation>
</message>
<message>
<source>Reset</source>
<translation>Réinitialiser</translation>
</message>
<message>
<source>Help</source>
<translation>Aide</translation>
</message>
<message>
<source>Don't Save</source>
<translation>Ne pas enregistrer</translation>
</message>
<message>
<source>Discard</source>
<translation>Ne pas enregistrer</translation>
</message>
<message>
<source>&Yes</source>
<translation>&Oui</translation>
</message>
<message>
<source>Yes to &All</source>
<translation>Oui à &tout</translation>
</message>
<message>
<source>&No</source>
<translation>&Non</translation>
</message>
<message>
<source>N&o to All</source>
<translation>Non à to&ut</translation>
</message>
<message>
<source>Save All</source>
<translation>Tout Enregistrer</translation>
</message>
<message>
<source>Abort</source>
<translation>Abandonner</translation>
</message>
<message>
<source>Retry</source>
<translation>Réessayer</translation>
</message>
<message>
<source>Ignore</source>
<translation>Ignorer</translation>
</message>
<message>
<source>Restore Defaults</source>
<translation>Restaurer les valeurs par défaut</translation>
</message>
<message>
<source>Close without Saving</source>
<translation>Fermer sans enregistrer</translation>
</message>
<message>
<source>&OK</source>
<translation>&OK</translation>
</message>
</context>
<context>
<name>QWizard</name>
<message>
<source>Go Back</source>
<translation>Précédent</translation>
</message>
<message>
<source>Continue</source>
<translation>Continuer</translation>
</message>
<message>
<source>Commit</source>
<translatorcomment>si il s'agit de commit au même sens que git... (en même temps se marier en cliquant... ?!!?!)</translatorcomment>
<translation>Soumettre</translation>
</message>
<message>
<source>Done</source>
<translation>Terminer</translation>
</message>
<message>
<source>Quit</source>
<translation type="obsolete">Quitter</translation>
</message>
<message>
<source>Help</source>
<translation>Aide</translation>
</message>
<message>
<source>< &Back</source>
<translation>< &Précédent</translation>
</message>
<message>
<source>&Finish</source>
<translation>&Terminer</translation>
</message>
<message>
<source>Cancel</source>
<translation>testAnnuler</translation>
</message>
<message>
<source>&Help</source>
<translation>&Aide</translation>
</message>
<message>
<source>&Next</source>
<translation>&Suivant ></translation>
</message>
<message>
<source>&Next ></source>
<translation>&Suivant ></translation>
</message>
</context>
</TS>
进入Qt代码,发现在qtbase\src\gui\kernel\qplatformtheme.cpp:
QString QPlatformTheme::defaultStandardButtonText(int button)
{
switch (button) {
case QPlatformDialogHelper::Ok:
return QCoreApplication::translate("QPlatformTheme", "OK");
case QPlatformDialogHelper::Save:
return QCoreApplication::translate("QPlatformTheme", "Save");
case QPlatformDialogHelper::SaveAll:
return QCoreApplication::translate("QPlatformTheme", "Save All");
case QPlatformDialogHelper::Open:
return QCoreApplication::translate("QPlatformTheme", "Open");
等等
因此,在每个 qt_xx.ts 文件中,我复制了 QDialogButtonBox 部分并将其重命名为 QPlatformTheme。做到了!不知道为什么 Qt 5.4.1 附带的 qt_xx.ts 是错误的。
Qt 翻译文件在以前版本的 Qt 中已被修改,没有人费心更新法语支持。现在已经完成,并希望在 Qt 5.5.0 中发布:
https://codereview.qt-project.org/#/c/111230/
请注意,qt_fr.qm
已过时且为空,您应该按照新的 Qt5 存储库架构加载 qtbase_fr.qm
。
qtcreator 翻译还需要努力,你可以在 Transifex 上贡献它的翻译,寻找 qttraductions
项目。
将我的应用程序从 Qt 4.8 升级到 Qt 5.4.1,我注意到当 运行我的非英语应用程序时,"QDialogButtonBox" 中的 t运行 指定项目找不到 qt_xx.ts 的部分。找到并正确显示其他项目,例如 "QWizard" 部分中的项目。
如何让我的 QMessageBox
的按钮使用 qt_xx.qm 中的 t运行 指定字符串?
我用法语来演示这个问题(下面的代码):
我删除了 qt_fr.ts 文件中除 "QDialogButtonBox" 和 "QWizard" 之外的所有部分。我在 "QWizard" 部分编辑了 "Cancel" 的 t运行slation 以确保完全使用 qt_fr.qm。然后我 运行 lrelease 创建我的 qt_fr.qm.
在 Windows 7 框中,在“区域和语言”对话框中:
- 在“格式”选项卡中,我将格式设置为 "French (France)"
- 在键盘和语言选项卡中,我将显示语言设置为法语。
我 运行 我的示例项目与 .exe 和 qt_fr.qm 在同一文件夹中。在该文件夹中,我还有一个必要的 Qt5 dll 的副本(可以从 Qt 的 Windows 构建中复制它们,在 qtbase\bin 中)。
结果:
当我单击 "QMessageBox" 按钮时,我看到一个 QMessageBox
,按钮不是 运行 指定的。当我单击 "QWizard" 按钮时,我看到一个 QWizard
,而取消按钮确实有我编辑的 t运行slation。
QMessageBox 按钮在我的应用程序的 Qt 4 版本中是 t运行。什么改变了?我如何让它在 Qt 5 中工作?
示例项目代码:
btn_localize_bug757.pro:
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = btn_localize_bug757
TEMPLATE = app
SOURCES += main.cpp\
mainwindow.cpp
HEADERS += mainwindow.h
main.cpp
#include "mainwindow.h"
#include <QtWidgets/QApplication>
#include <QtCore/QTranslator>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTranslator qtTranslator;
qtTranslator.load("qt_fr");
a.installTranslator(&qtTranslator);
MainWindow w;
w.show();
return a.exec();
}
mainwindow.h:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QtWidgets/QMainWindow>
#include <QtWidgets/QPushButton>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void showMessage();
void showWizard();
private:
QPushButton *showMessageButton;
QPushButton *showWizardButton;
};
#endif // MAINWINDOW_H
mainwindow.cpp:
#include "mainwindow.h"
#include <QtWidgets/QMessageBox>
#include <QtWidgets/QVBoxLayout>
#include <QtWidgets/QWizard>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
setWindowTitle("test");
QPushButton *showMessageButton = new QPushButton("QMessageBox", this);
connect(showMessageButton, SIGNAL(clicked()), SLOT(showMessage()));
QPushButton *showWizardButton = new QPushButton("QWizard", this);
connect(showWizardButton, SIGNAL(clicked()), SLOT(showWizard()));
QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(showMessageButton);
layout->addWidget(showWizardButton);
QWidget *window = new QWidget();
window->setLayout(layout);
setCentralWidget(window);
}
MainWindow::~MainWindow()
{
}
void MainWindow::showMessage()
{
QMessageBox msg(this);
msg.setWindowModality(Qt::WindowModal);
msg.setIcon(QMessageBox::Question);
msg.setText("test");
msg.setStandardButtons(QMessageBox::Save |
QMessageBox::Discard |
QMessageBox::Cancel);
msg.setDefaultButton(QMessageBox::Save);
msg.exec();
}
void MainWindow::showWizard()
{
QWizard *wiz = new QWizard();
wiz->show();
}
qt_fr.ts:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.0" language="fr">
<context>
<name>QDialogButtonBox</name>
<message>
<source>OK</source>
<translation>OK</translation>
</message>
<message>
<source>Save</source>
<translation>Enregistrer</translation>
</message>
<message>
<source>&Save</source>
<translation>Enregi&strer</translation>
</message>
<message>
<source>Open</source>
<translation>Ouvrir</translation>
</message>
<message>
<source>Cancel</source>
<translation>Annuler</translation>
</message>
<message>
<source>&Cancel</source>
<translation>&Annuler</translation>
</message>
<message>
<source>Close</source>
<translation>Fermer</translation>
</message>
<message>
<source>&Close</source>
<translation>&Fermer</translation>
</message>
<message>
<source>Apply</source>
<translation>Appliquer</translation>
</message>
<message>
<source>Reset</source>
<translation>Réinitialiser</translation>
</message>
<message>
<source>Help</source>
<translation>Aide</translation>
</message>
<message>
<source>Don't Save</source>
<translation>Ne pas enregistrer</translation>
</message>
<message>
<source>Discard</source>
<translation>Ne pas enregistrer</translation>
</message>
<message>
<source>&Yes</source>
<translation>&Oui</translation>
</message>
<message>
<source>Yes to &All</source>
<translation>Oui à &tout</translation>
</message>
<message>
<source>&No</source>
<translation>&Non</translation>
</message>
<message>
<source>N&o to All</source>
<translation>Non à to&ut</translation>
</message>
<message>
<source>Save All</source>
<translation>Tout Enregistrer</translation>
</message>
<message>
<source>Abort</source>
<translation>Abandonner</translation>
</message>
<message>
<source>Retry</source>
<translation>Réessayer</translation>
</message>
<message>
<source>Ignore</source>
<translation>Ignorer</translation>
</message>
<message>
<source>Restore Defaults</source>
<translation>Restaurer les valeurs par défaut</translation>
</message>
<message>
<source>Close without Saving</source>
<translation>Fermer sans enregistrer</translation>
</message>
<message>
<source>&OK</source>
<translation>&OK</translation>
</message>
</context>
<context>
<name>QWizard</name>
<message>
<source>Go Back</source>
<translation>Précédent</translation>
</message>
<message>
<source>Continue</source>
<translation>Continuer</translation>
</message>
<message>
<source>Commit</source>
<translatorcomment>si il s'agit de commit au même sens que git... (en même temps se marier en cliquant... ?!!?!)</translatorcomment>
<translation>Soumettre</translation>
</message>
<message>
<source>Done</source>
<translation>Terminer</translation>
</message>
<message>
<source>Quit</source>
<translation type="obsolete">Quitter</translation>
</message>
<message>
<source>Help</source>
<translation>Aide</translation>
</message>
<message>
<source>< &Back</source>
<translation>< &Précédent</translation>
</message>
<message>
<source>&Finish</source>
<translation>&Terminer</translation>
</message>
<message>
<source>Cancel</source>
<translation>testAnnuler</translation>
</message>
<message>
<source>&Help</source>
<translation>&Aide</translation>
</message>
<message>
<source>&Next</source>
<translation>&Suivant ></translation>
</message>
<message>
<source>&Next ></source>
<translation>&Suivant ></translation>
</message>
</context>
</TS>
进入Qt代码,发现在qtbase\src\gui\kernel\qplatformtheme.cpp:
QString QPlatformTheme::defaultStandardButtonText(int button)
{
switch (button) {
case QPlatformDialogHelper::Ok:
return QCoreApplication::translate("QPlatformTheme", "OK");
case QPlatformDialogHelper::Save:
return QCoreApplication::translate("QPlatformTheme", "Save");
case QPlatformDialogHelper::SaveAll:
return QCoreApplication::translate("QPlatformTheme", "Save All");
case QPlatformDialogHelper::Open:
return QCoreApplication::translate("QPlatformTheme", "Open");
等等
因此,在每个 qt_xx.ts 文件中,我复制了 QDialogButtonBox 部分并将其重命名为 QPlatformTheme。做到了!不知道为什么 Qt 5.4.1 附带的 qt_xx.ts 是错误的。
Qt 翻译文件在以前版本的 Qt 中已被修改,没有人费心更新法语支持。现在已经完成,并希望在 Qt 5.5.0 中发布:
https://codereview.qt-project.org/#/c/111230/
请注意,qt_fr.qm
已过时且为空,您应该按照新的 Qt5 存储库架构加载 qtbase_fr.qm
。
qtcreator 翻译还需要努力,你可以在 Transifex 上贡献它的翻译,寻找 qttraductions
项目。