Невозможно получить доступ к i18n в JS-файле приложения QML

Невозможно получить доступ к i18n в JS-файле приложения QML

У меня возникли проблемы с импортом библиотеки i18n, включенной в Ubuntu.Components 0.1, для использования в файле JS. Первоначально я столкнулся со своим вопросом/проблемой во время взлома основного приложения Ubuntu Touch «Clock», но мне удалось воспроизвести поведение, используя значительно упрощенный фрагмент кода, поэтому я вставил его ниже.

Когда я запускаю этот код на своем рабочем столе 14.04 с использованием UbuntuSDK, я получаю сообщение об ошибке:

CurrencyConverter/ConverterUtils.js:5: TypeError: Свойство 'tr' объекта [object Object] не является функцией

Похоже, что либо я ссылаюсь на функцию, используя неправильный синтаксис, либо что-то не так с синтаксисом импорта.

Конвертер Валют.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. Это имеет смысл. Однако, поскольку приложение «Часы», где я изначально столкнулся с этой проблемой, использует директиву .pragma (якобы из соображений производительности), я не думаю, что ее удаление будет хорошим решением.

3) Я нашел синтаксис «.import» для импорта библиотек QML в файл JS здесь:http://www.qt-project.org/doc/qt-5/qtqml-javascript-imports.html Возможно, я неправильно понял, но мне кажется, что это правильно.

4) Интересное замечание: при редактировании этого кода с помощью UbuntuSDK (QtCreator) ввод "Foo." выводит "i18n" в качестве подсказки автодополнения. Ввод "Foo.i18n." выведет "tr()" в качестве одной из подсказок автодополнения. Так что, похоже, UbuntuSDK распознает мой квалификатор/пространство имен "Foo". Или, может быть, автодополнение не учитывает импортированные библиотеки. Просто подумал, что это интересно.

Итак, мой вопрос: кто-нибудь знает, что вызывает такое поведение? Я, вероятно, могу обойти проблему, вызвав i18n.tr() из файла QML, а не из библиотеки JS util, но мне интересно узнать, что я сделал не так. Есть предложения?

решение1

Итак, у меня есть частичное решение проблемы, с которой я столкнулся.

После просмотра кода для RSS Reader core-app, похоже, что при использовании директивы ".pragma library" модуль i18n необходимо передать в вызываемую функцию JavaScript. Это дает коду JavaScript возможность вызывать функции с использованием переданного объекта.

Например, JavaScript будет выглядеть примерно так:

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

Это не совсем отвечает на вопрос «почему» из моего первоначального вопроса, но для тех, кто столкнулся с этой проблемой, это может стать подходящим решением.

Связанный контент