無法在 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 util 庫調用 i18n.tr() 來解決這個問題,但我很想知道我做錯了什麼。有什麼建議麼?

答案1

所以我對我所看到的問題有一個部分解決方案。

在查看 RSS 閱讀器核心應用程式的程式碼後,看起來當使用「.pragma library」指令時,需要將 i18n 模組傳遞給正在呼叫的 JavaScript 函數。這使得 JavaScript 程式碼能夠使用傳入的物件呼叫函數。

例如,JavaScript 看起來像:

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

這並不能真正回答我最初問題的“原因”,但對於遇到此問題的任何人來說,這應該是一個合適的解決方法。

相關內容