无法访问 QML 应用程序的 JS 文件中的 i18n

无法访问 QML 应用程序的 JS 文件中的 i18n

我在导入 Ubuntu.Components 0.1 中包含的 i18n 库以用于 JS 文件时遇到了麻烦。我最初在破解“时钟”Ubuntu Touch 核心应用程序时遇到了我的问题/问题,但我能够使用一个简化得多的代码片段重现该行为,因此我将其粘贴在下面。

当我使用 UbuntuSDK 在 14.04 桌面上运行此代码时,收到错误消息:

CurrencyConverter/ConverterUtils.js:5:TypeError:对象 [object Object] 的属性“tr”不是函数

看起来要么我使用错误的语法引用了该函数,要么我的导入语法有问题。

货币转换器.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)我在这里找到了将 QML 库导入 JS 文件的“.import”语法:http://www.qt-project.org/doc/qt-5/qtqml-javascript-imports.html 我可能误解了它,但在我看来它是正确的。

4) 有趣的是,在使用 UbuntuSDK (QtCreator) 编辑此代码时,输​​入“Foo.”会出现“i18n”作为自动完成建议。输入“Foo.i18n.”会出现“tr()”作为自动完成建议之一。因此,UbuntuSDK 似乎识别了我的“Foo”限定符/命名空间。或者自动完成功能可能没有考虑导入的库。只是觉得这很有趣。

所以我的问题是:有人知道是什么导致了这种行为吗?我可能可以通过从 QML 文件而不是 JS 实用程序库调用 i18n.tr() 来解决该问题,但我很想知道我做错了什么。有什么建议吗?

答案1

所以我对我所看到的问题有一个部分解决方案。

查看 RSS 阅读器核心应用程序的代码后,发现使用“.pragma library”指令时,需要将 i18n 模块传递给正在调用的 JavaScript 函数。这使 JavaScript 代码能够使用传入的对象调用函数。

例如,JavaScript 看起来类似于:

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

这并没有真正回答我最初的问题的“为什么”,但对于遇到此问题的任何人来说,这应该是一个合适的解决方法。

相关内容