2011-11-13 1 views
4

QML로 번역을 사용하려고합니다. 새로운 프로젝트 QtQuick 프로젝트를 열었습니다. Symbian 용 QtQuick 애플리케이션을 QtQuick 애플리케이션 유형으로 선택했습니다.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 파일 : Qt는 창조주는 모든 표준 파일 (MAIN.CPP, main.qml, mainpage.qml ...)

MainPage.qml은 매우 간단와 응용 프로그램 소스 트리를 생성 보이는이 같은 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(); 
} 

는 그럼, 내가 POSIX의 표현을 번역하는 언어 학자를 사용한 lupdate mainpage.qml -ts inter_en.ts을 실행 다른 것으로 번역 만하고 있는지 테스트합니다. 그런 다음 언어 학자와 함께 inter_en.qm 파일을 만들었습니다.

하지만 시뮬레이터에서 응용 프로그램을 실행하면 "Hello world!"가 표시되지 않습니다. 번역기가 성공적으로로드되었지만 (qDebug에서 "Translating : true"를 얻음).

번역기가 올바르게 작동합니다. QPushButton으로 코드의 일부를 deremark 할 때 (다시 한번 lupdate 및 언어학적인 것들을이 목적으로 반복하기 때문에), "Hello world!" QPushButton의식이 올바르게 변환됩니다.

올바르게 번역을 수행하지 않는 것은 QmlApplicationViewer 및 QML 파일뿐입니다. 어떤 quesses ?????

감사

UPDATE

나는 밖으로 다음 발견 : 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

당신이 해결책을 찾았 기 때문에 다행이지만, 나는 무엇인가 언급해야만한다. 번역에 대한 최선의 접근법을 사용하지 않는다고 생각한다. 기본적으로 당신은 N 개의 다른 qml을위한 N 개의 파일을 생성하고 번역해야한다. separatly (어쩌면 나쁘지는 않은 생각). 통역을 하나씩. 같은 파일에서 모두 처리하지 않는 이유는 무엇입니까? 미안 당신이 벌써 그것을하고 있으면, 나는 항상 myproject.pro를 갱신하고 잊는다 : D –

+0

질문에 대한 답을 발견했다면 그것을 게시하고 수락하는 것이 좋습니다. –

답변

0

또한 재사용 가능한 구성 요소로 QML 파일을 사용하고 난 전혀 번역 아무 문제가 없다. 그래서 나는 다음과 같이 도와 줄 수 있다고 생각합니다.

또한 모든 파일에 대해 수동으로 lupdate를 호출하지 않으려 고합니다. 그래서 당신은 그렇게,

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 

그것은 내 머리에서 오지 않는다 ... 그것은 (당신의 경로를 수정) 자동으로 모든 번역 QML의 문구와 JS 파일을 찾을 수 있도록 .PRO 파일에서 다음 라인을 사용한다 여기에 소스가 있습니다 (동적 번역에 대한 참고 사항이 있습니다) : https://forum.qt.io/topic/30076/is-there-a-way-to-use-linguist-in-global-context

0

문제는 번역 자체가 아니지만 런타임 중에 언어를 변경하면 도움이 될 수 있습니다. app-> installTranslator (translator)를 사용하여 새 QTranslator를로드하는 경우; it (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); 
     } 
    } 

Somewher로 잡아야합니다.QML "

m_pQmlView->rootContext()->setContextProperty("_view", this); 

QML 측 :. 당신이 솔루션을 직접 찾은 때문에 이것은 MS Windows 용 아주 좋은 작동

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") 
} 

플랫폼