Não é possível acessar i18n no arquivo JS do aplicativo QML

Não é possível acessar i18n no arquivo JS do aplicativo QML

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.

informação relacionada