我尝试在QML中使用翻译。我开了一个新项目QtQuick项目,我选择QtQuick Componenets for Symbian作为QtQuick应用程序类型。 Qt Creator创建了一个包含所有标准文件的应用程序源代码树(main.cpp,main.qml,mainpage.qml ...)
MainPage.qml非常简单:
import QtQuick 1.1
import com.nokia.symbian 1.1
Page {
id: mainPage
Text {
anchors.centerIn: parent
text: qsTr('Hello world!')
color: platformStyle.colorNormalLight
font.pixelSize: 20
}
}
我的main.cpp文件负责实现QTranslator,如下所示:
#include "qmlapplicationviewer.h"
#include <QTranslator>
#include <QPushButton>
#include <QDebug>
Q_DECL_EXPORT int main(int argc, char *argv[])
{
QScopedPointer<QApplication> app(createApplication(argc, argv));
QTranslator* translator = new QTranslator;
qDebug()<<"Translating: "<<translator->load(QString("qml/International/inter_en"));
app->installTranslator(translator);
//QPushButton hello(QPushButton::tr("Hello world!"));
// hello.resize(100, 30);
// hello.show();
QScopedPointer<QmlApplicationViewer> viewer(QmlApplicationViewer::create());
viewer->setMainQmlFile(QLatin1String("qml/International/main.qml"));
viewer->showExpanded();
return app->exec();
}
然后我运行lupdate mainpage.qml -ts inter_en.ts,我用语言学家来翻译POSIX表达式“Hello world!”别的东西只是测试它正在翻译。然后我用语言学家创建了inter_en.qm文件。
但是当我在模拟器上运行应用程序时,我不会得到“Hello world!”翻译,虽然翻译成功加载(我在qDebug中得到“翻译:真实”)。
译者工作正常我肯定,因为当我用QPushButton去除部分代码时,(我再次为此目的重复lupdate和语言学的东西),然后是“Hello world!” QPushButton中的表达式被正确翻译。
只有QmlApplicationViewer和QML文件无法正确执行翻译。 有问题?????
由于
更新
我发现了以下内容:MainPage.qml作为可重用组件导入main.qml。如果我在main.qml中使用qsTr(),则在main.qml中正确翻译文本。但是,MainPage.qml中的文本未正确转换。我想由于将其导入为可重用组件。任何意见?经历?
UPDATE2 - 解决方案
翻译文件需要区分大小写:
lupdate mainpage.qml -ts myapp_sk.ts is wrong
lupdate MainPage.qml -ts myapp_sk.ts is correct
答案 0 :(得分:0)
我也使用QML文件作为可重用的组件,我对翻译没有任何问题。所以我想以下内容也可以帮到你。
我还猜你不想为每个文件手动调用lupdate。所以你应该在.pro文件中使用以下几行来让它自动查找QML和JS文件中的所有可翻译短语(纠正你的路径)......
lupdate_hack{
SOURCES += qml/*.qml \
qml/*.js
}
TRANSLATIONS = \
langs/WakeOnLAN_cs.ts \
langs/WakeOnLAN_pl.ts \
langs/WakeOnLAN_es.ts \
langs/WakeOnLAN_fr.ts \
langs/WakeOnLAN_it.ts \
langs/WakeOnLAN_hu.ts \
langs/WakeOnLAN_fa.ts \
langs/WakeOnLAN_de.ts \
langs/WakeOnLAN_pt.ts
CODECFORTR = UTF-8
它不是来自我的头脑,所以这里是来源(还有关于动态翻译的说明):https://forum.qt.io/topic/30076/is-there-a-way-to-use-linguist-in-global-context
答案 1 :(得分:0)
如果问题不是翻译本身,而是在运行时更改语言,这可能会对您有所帮助。 如果您使用app-> installTranslator(翻译器)加载新的QTranslator; 它(QApplication)将触发更改事件。在你的Qt课程中,你必须用
来捕捉它 /*!
on the fly translation
*/
void MyQmlView::changeEvent(QEvent *event)
{
if (event->type() == QEvent::LanguageChange)
{
// triggers qml function/slots
emit retranslate();
}
else
{
QWidget::changeEvent(event);
}
}
在加载&#34; main.qml&#34;:
之后 m_pQmlView->rootContext()->setContextProperty( "_view", this );
QML方面:
Component.onCompleted: {
/********************** Connections ***************************/
// connect Qt signal MyView::retranslate() with QML function (slot) retranslate
_view.retranslate.connect(retranslate)
}
// slot!
function retranslate () {
lblHelloWord.text = qsTr("Hello Word")
}
这对MS Windows平台非常有用。