如何在.json文件中引用i18n条目?

时间:2017-04-20 10:10:41

标签: javascript json internationalization sapui5

我目前正在使用SAP UI5开发UI,并希望将其中的所有文本国际化。

这是我的.xml格式视图的一部分。使用{}括号中的占位符获取特定语言的文本在这里工作正常。

<headerToolbar>
    <Toolbar>
        <Title text="{i18n>orderDetails}"/>
    </Toolbar>
</headerToolbar>
<columns>
    <Column>
        <Text text="{i18n>statisticsSubject}"/>
    </Column>
    <Column>
        <Text text="{i18n>statisticsNumber}"/>
    </Column>
</columns>

我在视图中也有一个Tile Container,它从.json文件中获取它的内容。

<TileContainer
    tiles="{/Tiles}"
    height="200pt">
    <StandardTile
        icon="{icon}"
        type="{type}"
        number="{number}"
        numberUnit="{numberUnit}"
        title="{title}"
        info="{info}"
        infoState="{infoState}"/>
</TileContainer>

这是.json文件的相关部分:

  "Tiles":
  [
    {
      "title":"Anmelden",
      "icon":"sap-icon://inspect"
    },
    {
      "title":"Abmelden",
      "icon":"sap-icon://inspect-down"
    },
    {
      "title":"Liste",
      "icon":"sap-icon://activity-items"
    }
  ],

由于瓷砖的标题目前只有德国版,我还想通过使用i18n将它们国际化。当我在{}括号中将标题更改为占位符时,我只能在最终的UI结果中看到占位符,而不是相应的翻译。是否有可能在.json文件中使用i18n或者我是否需要找到一种不同的解决方案来存储瓷砖的数据?

提前致谢!

1 个答案:

答案 0 :(得分:0)

没有内置机制可以使用JsonModel对JSON文件进行国际化。但这并不意味着你不能自己制作一个。您可以在此处找到示例:https://github.com/serban-petrescu/serban-petrescu.github.io/blob/master/model/models.js#L53

简而言之,您必须首先使用jQuery.ajax读取JSON。收到数据后,您可以检查以下3种情况:

  • 如果它是一个字符串并且它与您想要的i18n标记模式匹配(例如i18n>myTranslatableKey),那么您将用i18n包中的文本替换该字符串。
  • 如果是数组,则遍历其索引并递归调用每个元素上的函数。
  • 如果它是一个对象,则迭代其键并递归调用每个成员的函数。

您可以在适当的位置进行这些更改(即链接从jQuery.ajax调用中收到的对象),也可以创建对象的副本(如上例所示)。

另一种可能性(不太好)是使用factory function而不是使用XML中的模板绑定聚合。在工厂功能中,您必须实例化您的瓷砖,并且您可以按照以下方式执行操作:

buildTile: function(sId, oContext) {
  return new StandardTile({
    icon: "{icon}",
    type: "{type}",
    number: "{number}",
    numberUnit: "{numberUnit}",
    info: "{info}",
    infoState: "{infoState}",

    // if title is {i18n>someKey} it will bind the
    // title property against the i18n model
    title: oContext.getProperty("title")
  });
}