No se puede acceder a i18n en el archivo JS de la aplicación QML

No se puede acceder a i18n en el archivo JS de la aplicación QML

Tengo problemas para importar la biblioteca i18n incluida en Ubuntu.Components 0.1 para usarla en un archivo JS. Inicialmente me encontré con mi pregunta/problema mientras pirateaba la aplicación principal 'Reloj' de Ubuntu Touch, pero pude reproducir el comportamiento usando un fragmento de código mucho más simplificado, así que lo pegué a continuación.

Cuando ejecuto este código en mi escritorio 14.04 usando UbuntuSDK, aparece el mensaje de error:

CurrencyConverter/ConverterUtils.js:5: TypeError: la propiedad 'tr' del objeto [objeto Objeto] no es una función

Parece que estoy haciendo referencia a la función usando la sintaxis incorrecta o hay algún problema con mi sintaxis de importación.

Convertidor de divisas.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) El "biblioteca .pragma"La línea (según tengo entendido) está ahí para decir: "solo cargue una versión de esta biblioteca y compártala entre todos los lugares en los que se incluye este JS en esta aplicación. http://qt-project.org/doc/qt-4.8/qdeclarativejavascript.html

2) Cuando elimino el "biblioteca .pragma", como sugiere el enlace anterior, el archivo JS hereda las importaciones del archivo QML desde el que se utiliza. Entonces, cuando elimino esa línea puedo acceder a i18n. Esto tiene sentido. Sin embargo, desde la aplicación 'Reloj', donde originalmente Encontré este problema, usa la directiva .pragma (aparentemente por razones de rendimiento). No creo que eliminarla sea una buena solución.

3) Aquí encontré la sintaxis ".import" para importar bibliotecas QML en un archivo JS:http://www.qt-project.org/doc/qt-5/qtqml-javascript-imports.html Puede que lo haya malinterpretado, pero me parece correcto.

4) Una nota interesante es que al editar este código usando UbuntuSDK (QtCreator), escriba "Foo". muestra "i18n" como sugerencia de autocompletar. Escribiendo "Foo.i18n". Aparecerá "tr()" como una de las sugerencias de autocompletar. Entonces parece que UbuntuSDK reconoce mi calificador/espacio de nombres "Foo". O tal vez el autocompletado no tenga en cuenta las bibliotecas importadas. Solo pensé que era interesante.

Entonces mi pregunta es: ¿alguien sabe qué está causando este comportamiento? Probablemente pueda solucionar el problema llamando a i18n.tr() desde un archivo QML en lugar de una biblioteca de utilidades JS, pero tengo curiosidad por saber qué hice mal. ¿Alguna sugerencia?

Respuesta1

Entonces tengo una solución parcial para el problema que estaba viendo.

Después de observar el código de la aplicación principal RSS Reader, parece que cuando se usa la directiva "biblioteca .pragma", el módulo i18n debe pasarse a la función JavaScript que se llama. Esto le da al código JavaScript la capacidad de llamar funciones usando el objeto pasado.

Por ejemplo, JavaScript se vería así:

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

Esto realmente no responde al "por qué" de mi pregunta inicial, pero para cualquiera que se encuentre con este problema, esta debería ser una solución alternativa adecuada.

información relacionada