我试着在QML中使用翻译。我打开了一个新项目QtQuick项目,我选择QtQuick Componenet作为QtQuick应用程序类型。Qt创建了一个包含所有标准文件(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!“其他的东西,只是测试一下它在翻译。然后,我用语言学家创建了inter_en.qm文件。
但是当我在模拟器上运行这个应用程序时,我没有得到"Hello!“翻译,尽管翻译成功(我在qDebug中得到了“翻译:真”)。
我确信翻译器工作正常,因为当我用QPushButton读取代码的一部分时(再次重复lupdate和语言学家的内容),然后是"Hello!“QPushButton中的表达式被正确翻译。
只有QmlApplicationViewer和QML文件没有正确地执行转换。有什么疑问吗?
谢谢
更新
我发现: MainPage.qml作为可重用组件导入到main.qml中。如果我在qsTr()中使用main.qml,那么文本将在main.qml中正确翻译。然而,MainPage.qml中的文本并不是正确的。我想是因为将它作为可重用组件导入。有什么评论吗?经验?
UPDATE2 -解决方案
翻译文件需要敏感地创建案例:
lupdate mainpage.qml -ts myapp_sk.ts is wrong
lupdate MainPage.qml -ts myapp_sk.ts is correct发布于 2016-07-13 14:03:54
如果问题不是翻译本身,而是在运行时更改语言,这可能会对您有所帮助。如果您用app->installTranslator(Translator)加载一个新的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);
}
} 在加载您的“main.qml”之后:
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平台来说是非常好的。
发布于 2016-01-02 20:42:16
我还使用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
https://stackoverflow.com/questions/8115277
复制相似问题