2

我正在创建一个 Qt 应用程序并添加了动态翻译(我按照http://www.qtcentre.org/wiki/index.php?title=Dynamic_translation_in_Qt4_applications中的示例)和一个列出不同语言的 QCombobox。它运作良好,但问题是我看不到如何动态翻译对话框窗口中的文本(例如“是”和“否”按钮)。

在 main.cpp 中,在执行应用程序之前,我有:

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

它将对话窗口翻译成用户系统语言,但我想像我的应用程序的其余部分一样动态地执行它。

以下是示例代码:application.h:

#ifndef APPLICATION_H

#include <QApplication>
#include <QHash>
#include <QStringList>
class QDir;
class QTranslator;

typedef QHash<QString, QTranslator*> Translators;

class Application : public QApplication
{
    Q_OBJECT

public:
    explicit Application(int& argc, char* argv[]);
    ~Application();

    static void loadTranslations(const QString& dir);
    static void loadTranslations(const QDir& dir);
    static const QStringList availableLanguages();

public slots:
    static void setLanguage(const QString& locale);

private:
    static QTranslator* current;
    static Translators translators;
    //static QTranslator* qtTranslator;//test to translate dialog windows
};

#endif // APPLICATION_H

应用程序.cpp:

    #include <QDir>
#include <QFileInfo>
#include <QTranslator>
#include <QLibraryInfo>

#include "application.h"


QTranslator* Application::current = 0;
//QTranslator* Application::qtTranslator = 0;//test to translate dialog windows

Translators Application::translators;

Application::Application(int& argc, char* argv[])
    : QApplication(argc, argv)
{

}

Application::~Application()
{
}

void Application::loadTranslations(const QString& dir)
{
    loadTranslations(QDir(dir));

    QString locale = QLocale::system().name().section('_', 0, 0);
    QString language=locale+ "_" + locale;

    if(!QFile::exists(":Localization/Localization/"+language+".qm"))//if system language is not available, load english version
        setLanguage("en_en");
    else
        setLanguage(language);
}

void Application::loadTranslations(const QDir& dir)
{
    // <language>_<country>.qm
    QString filter = "*_*.qm";
    QDir::Filters filters = QDir::Files | QDir::Readable;
    QDir::SortFlags sort = QDir::Name;
    QFileInfoList entries = dir.entryInfoList(QStringList() << filter, filters, sort);
    foreach (QFileInfo file, entries)
    {
        // pick country and language out of the file name
        QStringList parts = file.baseName().split("_");
        QString language = parts.at(parts.count() - 2);
        QString country  = parts.at(parts.count() - 1);
        // construct and load translator
        QTranslator* translator = new QTranslator(instance());
        if (translator->load(file.absoluteFilePath()))
        {
            QString locale = language + "_" + country;
            translators.insert(locale, translator);
        }
    }
}

const QStringList Application::availableLanguages()
{
    // the content won't get copied thanks to implicit sharing and constness
    return QStringList(translators.keys());
}

void Application::setLanguage(const QString& locale)
{
    //test to translate dialog windows
    /*
    QTranslator qtTranslator;
    QString qTLocale=locale.mid(0,2);
    qtTranslator->load("qt_"+ qTLocale, QLibraryInfo::location(QLibraryInfo::TranslationsPath));
    installTranslator(qtTranslator);
    //*/

    // remove previous
    if (current)
    {
        removeTranslator(current);
    }

    // install new
    current = translators.value(locale, 0);
    if (current)
    {
        installTranslator(current);
    }
}

我添加了注释为“//test to translate dialog Windows”的行,以尝试对对话框 Windows 进行动态翻译,但它不起作用(编译时没有错误,但应用程序未启动并显示错误消息“程序突然停止“,我在 Qt Creator 上)。谢谢!

4

3 回答 3

2

所以在遇到同样的问题后,我终于让它工作了。在我的情况下有两件事是错误的:

  1. qt翻译文件名:

    QTranslator qtTranslator;
    qtTranslator.load("qt_de");  // worked in older qt versions
    qtTranslator.load("qtbase_de");  // works for qt5.2
    a.installTranslator(&qtTranslator);
    
  2. 拥有 QMessageBox 的正确父级。这在您考虑后很明显,但很容易错过。

    QMessageBox::information(someChildOfMainWindow, ...);
    

对于后者,如果您碰巧在一个属于 aQObject但不是 a的类中,QWidget您还可以使用以下代码从任何地方访问您MainWindow的:

QMainWindow* mw = 0;
foreach(QWidget* widget, QApplication::topLevelWidgets()) {
    if(widget->objectName() == "<your-main-window-class-name-here>") {
        mw = qobject_cast<QMainWindow>(widget);
    }
}
于 2014-11-27T07:21:37.180 回答
0

好的 Sébastian Lange,所以最后我创建了盒子并且没有使用静态盒子(例如 QMessageBox::question(..) )

QMessageBox quitMessageBox;
quitMessageBox.setWindowTitle(tr("Quit"));
quitMessageBox.setWindowIcon(QIcon("myIcon.jpg"));
quitMessageBox.setIcon(QMessageBox::Question);
quitMessageBox.setText(tr("Quit the application?"));
quitMessageBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
quitMessageBox.setDefaultButton(QMessageBox::No);
quitMessageBox.button(QMessageBox::Yes)->setText(tr("Yes"));
quitMessageBox.button(QMessageBox::No)->setText(tr("No"));

接着

quitMessageBox.exec();

像这样就可以了。再次感谢!

于 2013-09-24T15:00:52.170 回答
-1

为对话框使用提供按钮时

tr("Yes")

至于默认对话框,创建的 .ts 语言文件(将通过 QtLinguist 编辑)应该包含默认翻译。

tr()标记要翻译的给定参数。得出的结论是,如果您不知道给定标签上会写什么,则无法翻译它...

于 2013-09-24T10:37:48.253 回答