0

将我的应用程序从 Qt 4.8 升级到 Qt 5.4.1,我注意到当以非英语运行我的应用程序时,找不到 qt_xx.ts 的“QDialogBu​​ttonBox”部分中的翻译项。可以正确找到并显示其他项目,例如“QWizard”部分中的项目。

我怎样才能让我QMessageBox的按钮使用 qt_xx.qm 中的翻译字符串?

我用法语来演示这个问题(代码如下):

我删除了 qt_fr.ts 文件中除“QDialogBu​​ttonBox”和“QWizard”之外的所有部分。我在“QWizard”部分编辑了“取消”的翻译,以确保完全使用 qt_fr.qm。然后我运行 lrelease 来创建我的 qt_fr.qm。

在 Windows 7 机器上,在区域和语言对话框中:

  • 在“格式”选项卡中,我将“格式”设置为“法语(法国)”
  • 在键盘和语言选项卡中,我将显示语言设置为法语。

我在同一个文件夹中使用 .exe 和 qt_fr.qm 运行我的示例项目。在那个文件夹中,我还有一份必要的 Qt5 dll 的副本(可以从 Qt 的 Windows 版本中复制它们,在 qtbase\bin 中)。

结果:

当我单击“QMessageBox”按钮时,我看到一个QMessageBox,按钮未翻译。当我单击“QWizard”按钮时,我看到一个QWizard,而“取消”按钮确实有我编辑过的翻译。

QMessageBox 按钮在我的应用程序的 Qt 4 版本中进行了翻译。发生了什么变化?如何让它在 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

主文件

#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();
}

主窗口.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

主窗口.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>&amp;Save</source>
        <translation>Enregi&amp;strer</translation>
    </message>
    <message>
        <source>Open</source>
        <translation>Ouvrir</translation>
    </message>
    <message>
        <source>Cancel</source>
        <translation>Annuler</translation>
    </message>
    <message>
        <source>&amp;Cancel</source>
        <translation>&amp;Annuler</translation>
    </message>
    <message>
        <source>Close</source>
        <translation>Fermer</translation>
    </message>
    <message>
        <source>&amp;Close</source>
        <translation>&amp;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&apos;t Save</source>
        <translation>Ne pas enregistrer</translation>
    </message>
    <message>
        <source>Discard</source>
        <translation>Ne pas enregistrer</translation>
    </message>
    <message>
        <source>&amp;Yes</source>
        <translation>&amp;Oui</translation>
    </message>
    <message>
        <source>Yes to &amp;All</source>
        <translation>Oui à &amp;tout</translation>
    </message>
    <message>
        <source>&amp;No</source>
        <translation>&amp;Non</translation>
    </message>
    <message>
        <source>N&amp;o to All</source>
        <translation>Non à to&amp;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>&amp;OK</source>
        <translation>&amp;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&apos;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>&lt; &amp;Back</source>
        <translation>&lt; &amp;Précédent</translation>
    </message>
    <message>
        <source>&amp;Finish</source>
        <translation>&amp;Terminer</translation>
    </message>
    <message>
        <source>Cancel</source>
        <translation>testAnnuler</translation>
    </message>
    <message>
        <source>&amp;Help</source>
        <translation>&amp;Aide</translation>
    </message>
    <message>
        <source>&amp;Next</source>
        <translation>&amp;Suivant &gt;</translation>
    </message>
    <message>
        <source>&amp;Next &gt;</source>
        <translation>&amp;Suivant &gt;</translation>
    </message>
</context>
</TS>
4

2 回答 2

1

Qt translation files have been modified in previous versions of Qt, and nobody bothered updating french support. It is now done, and hopefully released in Qt 5.5.0 :

https://codereview.qt-project.org/#/c/111230/

Note that the qt_fr.qm is obsolete and empty, and you should load qtbase_fr.qm, following the new Qt5 repository architecture.

qtcreator translation still needs work, you can contribute to its translation on Transifex, look for qttraductions project.

于 2015-06-20T12:32:40.420 回答
0

进入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 文件中,我复制了 QDialogBu​​ttonBox 部分并将其重命名为 QPlatformTheme。做到了!不知道为什么 Qt 5.4.1 附带的 qt_xx.ts 是错误的。

于 2015-04-16T18:33:08.950 回答