【问题标题】:Can I use i18n resource bundle within json data?我可以在 json 数据中使用 i18n 资源包吗?
【发布时间】:2016-02-18 10:17:10
【问题描述】:

我有一个 SAPUI5 (V1.24) 主从应用程序,其中我必须显示大约 25 个静态项目的列表,并且每个项目在单击时显示一个静态图像。

我将列表标题存储在一个 i18n 文件中,该文件在 Component.js 文件中实例化为 ResourceBundle

现在不是在我的Master.xml.view 文件中添加25 行StandardListItem 对象,我想知道是否可以将所有标题存储在mockdata 文件夹下的JSON 文件中,并将JSONModel 绑定到我的sap.m.List。但是由于我的 JSON "key":"value" 中的值只不过是列表标题,因此我正在寻找一种将 i18n 文本与 JSON 绑定的方法。像这样的:

{
  "List": [
    {
      "Key": "'{i18n>value1}'"
    },
    {
      "Key": "'{i18n>value2}'"
    },
    ...
  ]
}

但它在运行时不起作用。相反,它按原样显示值,如下所示:

在视图中添加尽可能多的列表项感觉不对。如果明天名单从 25 增加到 50 怎么办?请帮忙。

谢谢。

【问题讨论】:

  • 动态创建 JSON 模型是否适合您(而不是单独的模拟数据文件)?
  • 我确实想过这个问题,但是有没有办法可以循环浏览我的 i18n 文本?在实践中,键不命名为“value1”、“value2”,而是更有意义的文本,没有任何可观察的模式。谢谢。
  • 您可以为它们添加前缀。 Masterlist.Apple = An AppleMasterlist.Banana = A banana
  • 马克,我没跟上。你能详细说明一下吗?
  • 您说不会有模式,因为名称会有意义(而不是 value1 到 value25)。但是您可以在有意义的名称前面加上一个模式 (MyPattern.value1 ...),然后选择 i18n 文件中以 MyPattern. 开头的每个元素

标签: json internationalization sapui5 resourcebundle


【解决方案1】:

经过我们的聊天讨论,我想出了以下解决方案

var aAllKeys = [],
    aMasterKeys = [],
    oProperties = {},
    oJSON = {
        items: []
    };
// Get the current locale (for example "de-DE")
var sCurrentLocale = sap.ui.getCore().getConfiguration().getLanguage();
// This creates an array of locale fallback solutions.
// For example ["de-DE", "de", "en", ""]
var aFallbacks = jQuery.sap.resources._getFallbackLocales(sCurrentLocale);
// iterate all locales
for (var i = 0; i < aFallbacks.length; ++i) {
    var sLocale = aFallbacks[i];
    // try to load i18n file for each locale
    oProperties = jQuery.sap.properties({
        url: "i18n/i18n" + (sLocale ? "_" + sLocale : "") + ".properties"
    });
    // if the i18n file exists (i. e. contains keys)
    if (oProperties.getKeys().length > 0) {
        aAllKeys = oProperties.getKeys();
        break;
    }
}

// find all keys of items to display in master (the prefixed ones)
for (i = 0; i < aAllKeys.length; ++i) {
    if (aAllKeys[i].indexOf("MyPrefix.") > -1) {
        aMasterKeys.push(aAllKeys[i]);
    }
}

// find all values of items to display in master
for (i = 0; i < aMasterKeys.length; ++i) {
    oJSON.items.push({
        key: aMasterKeys[i],
        value: oProperties.getProperty(aMasterKeys[i])
    });
}

然后您可以使用oJSON 创建一个可以绑定到您的主列表的新 JSON 模型


编辑:我修改了sn-p的开头。如果当前语言环境没有 i18n 文件,这将添加一个备用解决方案。这是针对 SAPUI5 v1.30 进行测试的。

【讨论】:

  • Marc,显然 getText() 确实是回退所必需的。那天我必须在我的浏览器调试控制台上早些时候完成它,所以不需要再做一次(或者那里的工作方式可能不同)。但是当我在我的代码中使用这个解决方案时,我不得不“退回”到非空数组来开始工作。我做了类似 oBundle.getText("A") 的事情,因为我的资源包中没有。虽然这对我来说非常好,但你认为还有其他方法吗?再次感谢!
  • 我更新了我的解决方案..正如我在聊天中告诉你的那样,我预计会发生这种情况:(但是这个扩展的解决方案应该可以工作。
【解决方案2】:

查看我在类似主题中提供的解决方案:How is localized data binding set up with JSON files and XML views?

最好的部分,它只需要一个单行辅助方法:-)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    • 2012-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多