Search code examples
jsoninternationalizationsapui5resourcebundle

Can I use i18n resource bundle within json data?


I have an SAPUI5 (V1.24) master-detail application wherein I have to display a list of about 25 static items and each item displays a static image when clicked.

I have the list titles stored in an i18n file which is instantiated as a ResourceBundle within the Component.js file.

Now instead of adding 25 rows of StandardListItem objects in my Master.xml.view file I was wondering if I could store all titles in a JSON file under mockdata folder and bind a JSONModel to my sap.m.List. But since the values in my JSON "key":"value"are nothing but the list titles I was looking for a way to bind the i18n texts with the JSON. Something like this:

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

But it didn't work at runtime. Instead it displayed the value as-is, as shown below: Master-Detail demo

Adding as many list items in the view doesn't feel right. What if tomorrow the list increases from 25 to 50? Please help.

Thanks.


Solution

  • After our chat discussion I came up with the following solution

    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])
        });
    }
    

    You can then use oJSON to create a new JSON model which can be bound to your masterlist


    Edit: I modified the beginning of the snippet. This adds a fallback solution if there is no i18n file for the current locale. This is tested against SAPUI5 v1.30.