Kein Zugriff auf i18n in der JS-Datei der QML-App möglich

Kein Zugriff auf i18n in der JS-Datei der QML-App möglich

Ich habe Probleme, die in Ubuntu.Components 0.1 enthaltene i18n-Bibliothek zur Verwendung in einer JS-Datei zu importieren. Ich bin zum ersten Mal auf meine Frage/mein Problem gestoßen, als ich die Ubuntu Touch-Kernanwendung „Clock“ gehackt habe, aber ich konnte das Verhalten mithilfe eines stark vereinfachten Codeausschnitts reproduzieren, den ich unten eingefügt habe.

Wenn ich diesen Code auf meinem 14.04-Desktop mit dem UbuntuSDK ausführe, erhalte ich die Fehlermeldung:

CurrencyConverter/ConverterUtils.js:5: TypeError: Eigenschaft ‚tr‘ des Objekts [Objekt Object] ist keine Funktion

Es scheint, dass ich entweder mit der falschen Syntax auf die Funktion verweise oder dass mit meiner Importsyntax etwas nicht stimmt.

Währungsrechner.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");
}

Anmerkungen

1) Das ".pragma-Bibliothek"-Zeile (soweit ich weiß) soll aussagen: "Laden Sie nur eine Version dieser Bibliothek und teilen Sie sie mit allen Stellen, an denen dieses JS in dieser App enthalten ist. http://qt-project.org/doc/qt-4.8/qdeclarativejavascript.html

2) Wenn ich das ".pragma-Bibliothek"-Zeile, wie der obige Link andeutet, erbt die JS-Datei die Importe der QML-Datei, aus der sie verwendet wird. Wenn ich also diese Zeile entferne, kann ich auf i18n zugreifen. Das macht Sinn. Da jedoch die App „Uhr“, bei der ich ursprünglich auf dieses Problem gestoßen bin, die .pragma-Direktive verwendet (angeblich aus Leistungsgründen), halte ich das Entfernen dieser Zeile nicht für eine gute Lösung.

3) Die „.import“-Syntax zum Importieren von QML-Bibliotheken in eine JS-Datei habe ich hier gefunden:http://www.qt-project.org/doc/qt-5/qtqml-javascript-imports.html Ich habe es vielleicht falsch interpretiert, aber für mich sieht es richtig aus.

4) Interessant ist, dass beim Bearbeiten dieses Codes mit UbuntuSDK (QtCreator) die Eingabe von „Foo.“ „i18n“ als Autovervollständigungsvorschlag anzeigt. Wenn Sie „Foo.i18n.“ eingeben, wird „tr()“ als einer der Autovervollständigungsvorschläge angezeigt. Es scheint also, als würde UbuntuSDK meinen „Foo“-Qualifizierer/Namespace erkennen. Oder vielleicht berücksichtigt die Autovervollständigung importierte Bibliotheken nicht. Ich fand es einfach interessant.

Meine Frage lautet also: Weiß jemand, was dieses Verhalten verursacht? Ich kann das Problem wahrscheinlich umgehen, indem ich i18n.tr() aus einer QML-Datei statt aus einer JS-Hilfsbibliothek aufrufe, aber ich bin neugierig, was ich falsch gemacht habe. Irgendwelche Vorschläge?

Antwort1

Ich habe also eine Teillösung für das Problem, das ich gesehen habe.

Nach dem Betrachten des Codes für die RSS Reader-Kernanwendung sieht es so aus, als ob bei Verwendung der Direktive „.pragma library“ das i18n-Modul an die aufgerufene JavaScript-Funktion übergeben werden muss. Dadurch erhält der JavaScript-Code die Möglichkeit, Funktionen mithilfe des übergebenen Objekts aufzurufen.

Das JavaScript würde beispielsweise ungefähr so ​​aussehen:

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

Dies beantwortet zwar nicht wirklich das „Warum“ meiner ursprünglichen Frage, sollte aber für jeden, der auf dieses Problem stößt, eine geeignete Problemumgehung sein.

verwandte Informationen