Qt对话框窗口的动态转换

时间:2013-09-24 10:27:01

标签: qt translation

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

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

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

以用户系统语言翻译对话框Windows,但我想像我的应用程序的其余部分一样动态地进行操作。

以下是示例的代码: 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

application.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上。谢谢!

3 个答案:

答案 0 :(得分:1)

所以我在遇到同样的问题后终于开始工作了。在我的案例中有两件事是错误的:

  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, ...);
    
  3. 对于后者,如果您恰好位于QObject但不是QWidget的课程中,您还可以使用以下代码从任何地方访问MainWindow:< / p>

    QMainWindow* mw = 0;
    foreach(QWidget* widget, QApplication::topLevelWidgets()) {
        if(widget->objectName() == "<your-main-window-class-name-here>") {
            mw = qobject_cast<QMainWindow>(widget);
        }
    }
    

答案 1 :(得分:0)

为对话框提供按钮时使用

tr("Yes")

对于默认对话框,创建的.ts-language文件(通过QtLinguist编辑)应包含默认翻译。

tr()标记要翻译的给定参数。如果您不知道将在给定标签上写什么,那么您就无法翻译它......

答案 2 :(得分:0)

OkSébastianLange,所以最后我创造了这个盒子而没有使用静态盒子( 例如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();

就像那样没关系。再次感谢!