QML 앱의 JS 파일에서 i18n에 액세스할 수 없습니다.

QML 앱의 JS 파일에서 i18n에 액세스할 수 없습니다.

JS 파일에서 사용하기 위해 Ubuntu.Components 0.1에 포함된 i18n 라이브러리를 가져오는 데 문제가 있습니다. 처음에는 'Clock' Ubuntu Touch 핵심 앱을 해킹하는 동안 질문/문제가 발생했지만 훨씬 단순화된 코드 조각을 사용하여 동작을 재현할 수 있었기 때문에 아래에 붙여넣었습니다.

UbuntuSDK를 사용하여 14.04 데스크탑에서 이 코드를 실행하면 다음 오류 메시지가 나타납니다.

MoneyConverter/ConverterUtils.js:5: TypeError: 개체 [object Object]의 'tr' 속성은 함수가 아닙니다.

잘못된 구문을 사용하여 함수를 참조하고 있거나 가져오기 구문에 문제가 있는 것 같습니다.

통화변환기.qml

import QtQuick 2.0
import Ubuntu.Components 0.1
import "ConverterUtils.js" as Utils

MainView {
    id: root
    applicationName: "CurrencyConverter"

    width: units.gu(100)
    height: units.gu(75)

    property real margins: units.gu(2)
    property real buttonWidth: units.gu(9)

    Page {
        title: Utils.getTitle()
    }
}

ConverterUtils.js

.pragma library
.import Ubuntu.Components 0.1 as Foo

function getTitle() {
    return i18n.tr("Currency Converter");
}

노트

1) ".pragma 라이브러리" 라인(제가 이해하는 한)에는 "이 라이브러리의 한 버전만 로드하고 이 JS가 이 앱에 포함된 모든 위치 간에 공유합니다."라고 나와 있습니다. http://qt-project.org/doc/qt-4.8/qdeclarativejavascript.html

2) "를 제거하면.pragma 라이브러리" 라인, 위의 힌트에서 알 수 있듯이 JS 파일은 사용된 QML 파일의 가져오기를 상속합니다. 따라서 해당 라인을 제거하면 i18n에 액세스할 수 있습니다. 이는 의미가 있습니다. 그러나 원래 'Clock' 앱 이후 이 문제가 발생하면 .pragma 지시문을 사용합니다(표면적으로는 성능상의 이유로). 이를 제거하는 것은 좋은 해결책이 아니라고 생각합니다.

3) 여기에서 QML 라이브러리를 JS 파일로 가져오기 위한 ".import" 구문을 찾았습니다.http://www.qt-project.org/doc/qt-5/qtqml-javascript-imports.html 제가 잘못 해석했을 수도 있지만 제 눈에는 맞는 것 같습니다.

4) 흥미로운 점은 UbuntuSDK(QtCreator)를 사용하여 이 코드를 편집할 때 "Foo"를 입력한다는 것입니다. 자동 완성 제안으로 "i18n"이 표시됩니다. "Foo.i18n"을 입력하세요. 자동 완성 제안 중 하나로 "tr()"이 표시됩니다. 따라서 UbuntuSDK가 내 "Foo" 한정자/네임스페이스를 인식하는 것 같습니다. 아니면 자동 완성 기능이 가져온 라이브러리를 고려하지 않을 수도 있습니다. 그냥 흥미롭다고 생각했어요.

그래서 내 질문은: 이 동작의 원인이 무엇인지 아는 사람이 있습니까? JS 유틸리티 라이브러리가 아닌 QML 파일에서 i18n.tr()을 호출하면 문제를 해결할 수 있을 것 같지만, 내가 뭘 잘못했는지 궁금합니다. 어떤 제안이 있으십니까?

답변1

그래서 나는 내가 본 문제에 대한 부분적인 해결책을 가지고 있습니다.

RSS 리더 코어 앱의 코드를 살펴보면 ".pragma library" 지시문을 사용할 때 호출되는 JavaScript 함수에 i18n 모듈을 전달해야 하는 것처럼 보입니다. 이는 JavaScript 코드에 전달된 객체를 사용하여 함수를 호출하는 기능을 제공합니다.

예를 들어 JavaScript는 다음과 같습니다.

function getTitle(i18n) {
    return i18n.tr("CurrencyConverter");
}

이것은 실제로 내 초기 질문의 "이유"에 대한 대답은 아니지만 이 문제에 직면한 사람에게는 이것이 적합한 해결 방법이 될 것입니다.

관련 정보