我在菜单中选择了一种语言后写了一个简单的小例子来改变应用程序语言。虽然连接DOES工作(qDebug()打印好消息)但它不会改变我的QLabel上的文本。我使用QtDesigner创建了GUI。 注意:所有这些文件都在同一目录中。我正在使用Qt5。继承我的代码:
*的的.pro:
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = qt_pl_en
TEMPLATE = app
SOURCES += main.cpp\
mainwindow.cpp
HEADERS += mainwindow.h
FORMS += mainwindow.ui
TRANSLATIONS += ic.ts
TRANSLATIONS += se.ts
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTranslator>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
retranslate();
QObject::connect(ui->action_Icelandic, SIGNAL(triggered()), this, SLOT(speakIcelandic()));
QObject::connect(ui->action_Swedish, SIGNAL(triggered()), this, SLOT(speakSwedish()));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::changeEvent(QEvent* event)
{
if (event->type() == QEvent::LanguageChange)
{
// retranslate designer form
ui->retranslateUi(this);
// retranslate other widgets which weren't added in designer
retranslate();
}
// remember to call base class implementation
QWidget::changeEvent(event);
}
void MainWindow::retranslate()
{
ui->label->setText(QObject::tr("Hello, world! :-)"));
}
void MainWindow::speakSwedish()
{
QTranslator translator;
translator.load("se.qm");
qApp->installTranslator(&translator);
ui->retranslateUi(this);
qDebug() << "Swedish";
}
void MainWindow::speakIcelandic()
{
QTranslator translator;
translator.load("ic.qm");
qApp->installTranslator(&translator);
ui->retranslateUi(this);
qDebug() << "Icelandic";
}
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
void retranslate();
void changeEvent(QEvent* event);
private slots:
void speakSwedish();
void speakIcelandic();
};
#endif // MAINWINDOW_H
的main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
ic.ts
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.0" language="en_EN">
<context>
<name>MainWindow</name>
<message>
<location filename="mainwindow.ui" line="14"/>
<source>MainWindow</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainwindow.ui" line="27"/>
<location filename="mainwindow.cpp" line="13"/>
<source>Hello, world! :-)</source>
<translation type="unfinished">Halló, heimur! :-)</translation>
</message>
<message>
<location filename="mainwindow.ui" line="42"/>
<source>File</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainwindow.ui" line="60"/>
<source>&Swedish</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainwindow.ui" line="65"/>
<source>&Icelandic</source>
<translation type="unfinished"></translation>
</message>
</context>
</TS>
se.ts
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.0" language="en_EN">
<context>
<name>MainWindow</name>
<message>
<location filename="mainwindow.ui" line="14"/>
<source>MainWindow</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainwindow.ui" line="27"/>
<location filename="mainwindow.cpp" line="13"/>
<source>Hello, world! :-)</source>
<translation type="unfinished">Hallå, världen! :-)</translation>
</message>
<message>
<location filename="mainwindow.ui" line="42"/>
<source>File</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainwindow.ui" line="60"/>
<source>&Swedish</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainwindow.ui" line="65"/>
<source>&Icelandic</source>
<translation type="unfinished"></translation>
</message>
</context>
</TS>
mainwindow.ui
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralWidget">
<widget class="QLabel" name="label">
<property name="geometry">
<rect>
<x>120</x>
<y>80</y>
<width>181</width>
<height>17</height>
</rect>
</property>
<property name="text">
<string>Hello, world! :-)</string>
</property>
</widget>
</widget>
<widget class="QMenuBar" name="menuBar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>25</height>
</rect>
</property>
<widget class="QMenu" name="menuFile">
<property name="title">
<string>File</string>
</property>
<addaction name="action_Swedish"/>
<addaction name="action_Icelandic"/>
</widget>
<addaction name="menuFile"/>
</widget>
<widget class="QToolBar" name="mainToolBar">
<attribute name="toolBarArea">
<enum>TopToolBarArea</enum>
</attribute>
<attribute name="toolBarBreak">
<bool>false</bool>
</attribute>
</widget>
<widget class="QStatusBar" name="statusBar"/>
<action name="action_Swedish">
<property name="text">
<string>&Swedish</string>
</property>
</action>
<action name="action_Icelandic">
<property name="text">
<string>&Icelandic</string>
</property>
</action>
</widget>
<layoutdefault spacing="6" margin="11"/>
<resources/>
<connections/>
</ui>
答案 0 :(得分:5)
这对我有用。(从英语翻译成葡萄牙语)
QApplication app(argc, argv);
//Language Translation
//change the prefered language
QString locale = "pt" // say i am doing Portuguese language translation
QString file= app.applicationDirPath() +"/translation_"+locale;
QTranslator translator;
bool result=translator.load(file);
if ((locale != "en") && !result )
{
QMessageBox msgBox;
msgBox.setText("Unable to load language translation files");
msgBox.exec();
}
app.installTranslator(&translator);
2)说你是否要翻译MainWindow.ui
使用QT Designer点击该MainWindow.ui中每个标签的可翻译复选框。 (除了这个之外,你在gui中无所事事)
3)创建如下所述的translation_pt.ts文件。确保将classname放在名称标签
中
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS><TS>
<context>
<name>MainWindow</name>
<!-- Dialog Heading -->
<message>
<source>Glasses Fitment Details</source>
<translation>Detalhes de Calibração dos Óculos</translation>
</message>
<!-- Fitter -->
<message>
<source>Fitter</source>
<translation>Ajustador</translation>
</message>
<message>
<source>Fitter's Name</source>
<translation>Nome do Ajustador</translation>
</message>
</context>
</TS>
4)在.pro文件中添加以下行
TRANSLATIONS = translation_pt.ts
5)转到qt安装位置并运行以下命令
lrelease“您在步骤4中编辑的.pro文件的位置”
然后您将在该位置获得translation_pt.qm文件
6)将translation_pt.qm文件复制到二进制文件运行的位置
然后自动将您的MainWindow.ui中的语言从英语翻译成葡萄牙语
谢谢,
三安
答案 1 :(得分:2)
好的家伙,解决方案更简单,你甚至可以想象。添加:
QTranslator *translator;
进入 mainwindow.h
然后,在speakIcelandic()
和speakSwedish()
(在 mainwindow.cpp 中),只需将实施代码更改为:
bool ok = translator->load("se.qm");
qDebug("translation %d", ok);
qApp->installTranslator(translator);
ui->retranslateUi(this);
qDebug() << "Swedish";
别忘了在构造函数中添加translator = new QTranslator();
,最终会有效!