
Estou tendo problemas para importar a biblioteca i18n incluída no Ubuntu.Components 0.1 para uso em um arquivo JS. Inicialmente me deparei com minha pergunta/problema enquanto hackeava o aplicativo principal 'Clock' do Ubuntu Touch, mas consegui reproduzir o comportamento usando um trecho de código muito simplificado, então colei-o abaixo.
Quando executo este código em meu desktop 14.04 usando o UbuntuSDK, recebo a mensagem de erro:
CurrencyConverter/ConverterUtils.js:5: TypeError: A propriedade 'tr' do objeto [objeto Objeto] não é uma função
Parece que estou referenciando a função usando a sintaxe errada ou há algo errado com minha sintaxe de importação.
Conversor de moeda.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");
}
Notas
1) O "biblioteca .pragma"(até onde eu entendi) existe para dizer: "carregue apenas uma versão desta biblioteca e compartilhe-a entre todos os lugares em que este JS está incluído neste aplicativo. http://qt-project.org/doc/qt-4.8/qdeclarativejavascript.html
2) Quando eu removo o "biblioteca .pragma", como sugere o link acima, o arquivo JS herda as importações do arquivo QML do qual é usado. Portanto, quando eu removo essa linha, posso acessar i18n. Isso faz sentido. No entanto, como o aplicativo 'Relógio', onde eu originalmente encontrei esse problema, usa a diretiva .pragma (aparentemente por motivos de desempenho). Não acho que removê-la seja uma boa solução.
3) Encontrei a sintaxe ".import" para importar bibliotecas QML para um arquivo JS aqui:http://www.qt-project.org/doc/qt-5/qtqml-javascript-imports.html Posso ter interpretado mal, mas parece certo para mim.
4) Uma observação interessante é que ao editar este código usando o UbuntuSDK (QtCreator), digite “Foo”. traz "i18n" como sugestão de preenchimento automático. Digitando "Foo.i18n." exibirá "tr()" como uma das sugestões de preenchimento automático. Parece que o UbuntuSDK reconhece meu qualificador/namespace "Foo". Ou talvez o preenchimento automático não leve em consideração as bibliotecas importadas. Apenas pensei que era interessante.
Então minha pergunta é: alguém sabe o que está causando esse comportamento? Provavelmente posso contornar o problema chamando i18n.tr() de um arquivo QML em vez de uma biblioteca de utilitários JS, mas estou curioso para saber o que fiz de errado. Alguma sugestão?
Responder1
Portanto, tenho uma solução parcial para o problema que estava vendo.
Depois de examinar o código do aplicativo principal do RSS Reader, parece que quando a diretiva "biblioteca .pragma" é usada, o módulo i18n precisa ser passado para a função JavaScript que está sendo chamada. Isso dá ao código JavaScript a capacidade de chamar funções usando o objeto passado.
Por exemplo, o JavaScript seria algo como:
function getTitle(i18n) {
return i18n.tr("CurrencyConverter");
}
Isso realmente não responde ao "porquê" da minha pergunta inicial, mas para qualquer pessoa que esteja enfrentando esse problema, essa deve ser uma solução alternativa adequada.