QML アプリの JS ファイルで i18n にアクセスできません

QML アプリの JS ファイルで i18n にアクセスできません

Ubuntu.Components 0.1 に含まれる i18n ライブラリを JS ファイルで使用するためにインポートする際に問題が発生しています。当初、Ubuntu Touch コア アプリ「Clock」をハッキングしているときにこの質問/問題に遭遇しましたが、大幅に簡素化されたコード スニペットを使用して動作を再現することができましたので、以下に貼り付けました。

UbuntuSDK を使用して 14.04 デスクトップでこのコードを実行すると、次のエラー メッセージが表示されます。

CurrencyConverter/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()
    }
}

コンバータユーティリティ.js

.pragma library
.import Ubuntu.Components 0.1 as Foo

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

ノート

1)「.pragma ライブラリ「」行は(私の理解する限りでは)「このライブラリの 1 つのバージョンのみをロードし、このアプリでこの JS が含まれるすべての場所で共有する」という意味です。 http://qt-project.org/doc/qt-4.8/qdeclarativejavascript.html

2) 「.pragma ライブラリ「」行については、上記のリンクが示唆しているように、JS ファイルは、使用されている QML ファイルのインポートを継承します。したがって、その行を削除すると i18n にアクセスできます。これは理にかなっています。ただし、最初にこの問題に遭遇した「時計」アプリは、.pragma ディレクティブを使用しているため (表面上はパフォーマンス上の理由から)、それを削除するのは良い解決策ではないと思います。

3) QML ライブラリを JS ファイルにインポートするための「.import」構文はここにあります:http://www.qt-project.org/doc/qt-5/qtqml-javascript-imports.html 誤解しているかもしれませんが、私には正しいように思えます。

4) 興味深いことに、UbuntuSDK (QtCreator) を使用してこのコードを編集しているときに、「Foo.」と入力すると、オートコンプリート候補として「i18n」が表示されます。「Foo.i18n.」と入力すると、オートコンプリート候補の 1 つとして「tr()」が表示されます。つまり、UbuntuSDK は私の「Foo」修飾子/名前空間を認識しているようです。または、オートコンプリートではインポートされたライブラリが考慮されていないのかもしれません。興味深いと思っただけです。

そこで質問なのですが、この動作の原因を知っている人はいますか? JS ユーティリティ ライブラリではなく QML ファイルから i18n.tr() を呼び出すことで、おそらくこの問題を回避できると思いますが、何が間違っていたのか知​​りたいです。何か提案はありますか?

答え1

つまり、私が見ていた問題の部分的な解決策が見つかりました。

RSS リーダー コア アプリのコードを確認したところ、「.pragma library」ディレクティブを使用する場合、呼び出される JavaScript 関数に i18n モジュールを渡す必要があるようです。これにより、JavaScript コードは渡されたオブジェクトを使用して関数を呼び出すことができます。

たとえば、JavaScript は次のようになります。

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

これは私の最初の質問の「なぜ」に対する答えにはなりませんが、この問題に遭遇した人にとっては、これが適切な回避策となるはずです。

関連情報