У меня возникли проблемы с импортом библиотеки i18n, включенной в Ubuntu.Components 0.1 для использования в JS-файле. Сначала я столкнулся с вопросом / проблемой, взломав основное приложение «Clock» Ubuntu Touch, но я смог воспроизвести поведение с помощью упрощенного фрагмента кода, поэтому я вставил это ниже.
Когда я запускаю этот код на своем рабочем столе 14.04 с помощью UbuntuSDK, я получаю сообщение об ошибке:
CurrencyConverter / ConverterUtils.js: 5: TypeError: свойство 'tr' объекта [object Object] не является функцией
Кажется, что либо я ссылаюсь на функцию с использованием неправильного синтаксиса, либо что-то не так с моим синтаксисом импорта.
CurrencyConverter.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()
}
}
[d6 ] ConverterUtils.js
.pragma library
.import Ubuntu.Components 0.1 as Foo
function getTitle() {
return i18n.tr("Currency Converter");
}
Примечания
1) « CurrencyConverter / ConverterUtils.js: 5: TypeError: свойство 'tr' объекта [object Object] является а не функция "(насколько мне известно):« Загружайте только одну версию этой библиотеки и делитесь ею между всеми местами, в которые этот JS включен в это приложение. http: // qt- project.org/doc/qt-4.8/qdeclarativejavascript.html
2) W Я удаляю строку «.pragma library», как ссылка выше подсказок, JS-файл наследует импорт файла QML, из которого он используется. Поэтому, когда я удаляю эту строку, я могу получить доступ к i18n. Это имеет смысл. Однако, поскольку приложение «Часы», где я впервые столкнулся с этой проблемой, использует директиву .pragma (якобы по соображениям производительности), я не думаю, что удаление является хорошим решением.
3) Я нашел Синтаксис «.import» для импорта библиотек QML в JS-файл здесь: http://qt-project.org/doc/qt-4.8/qdeclarativejavascript.html Возможно, я неправильно интерпретировал его, но он выглядит прямо на меня.
4) Интересно отметить, что при редактировании этого кода с помощью UbuntuSDK (QtCreator), набрав «Foo». вызывает «i18n» как предложение автозаполнения. Ввод «Foo.i18n». выведет «tr ()» в качестве одного из предложений автозаполнения. Таким образом, похоже, UbuntuSDK распознает мое «Foo» Qualifier / namespace. Или, может быть, автозаполнение не учитывает импортированные библиотеки. Просто подумал, что это интересно.
Итак, мой вопрос: кто-нибудь знает, что вызывает такое поведение? Вероятно, я могу решить проблему, вызвав i18n.tr () из файла QML, а не в библиотеку JS util, но мне любопытно узнать, что я сделал неправильно. Любые предложения?