我正在创建一个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上。谢谢!
答案 0 :(得分:1)
所以我在遇到同样的问题后终于开始工作了。在我的案例中有两件事是错误的:
qt翻译文件的名称:
QTranslator qtTranslator;
qtTranslator.load("qt_de"); // worked in older qt versions
qtTranslator.load("qtbase_de"); // works for qt5.2
a.installTranslator(&qtTranslator);
拥有QMessageBox的正确父级。这一点在您考虑之后很明显,但很容易错过。
QMessageBox::information(someChildOfMainWindow, ...);
对于后者,如果您恰好位于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();
就像那样没关系。再次感谢!