SAPUI5中的语言切换

时间:2016-12-08 12:29:55

标签: javascript sapui5

我的SAPUI5控件存在语言问题。

如果我执行例如:

sap.ui.getCore().getConfiguration().setLanguage( "de" );

我的i18n文件已正确加载,所有标签都已翻译为德语。但控制仍然是英文。

获取德语控件的唯一方法是使用url参数:

sap-ui-language=DE

但我不能在我的案例中使用参数。有什么想法吗?

2 个答案:

答案 0 :(得分:4)

请注意sap.ui.getCore().setLanguage()明确说明

  

该框架不保证此调用将更新已创建的语言相关对象。因此,应用程序尽早切换语言仍然是最佳做法,例如在创建任何语言相关对象之前。需要支持语言更多动态更改的应用程序应该监听localizationChanged事件并调整他们使用的所有语言相关对象(例如,通过重建他们的UI)。

除此之外,我完全支持Nabi的回答(但我不允许对其进行投票)。

我只想添加控件(比如FilterBar)更好地使用钩子方法:

FilterBar.prototype.onlocalizationChanged = function(oEvent) {
  // .. same bundle update code as in Nabi's proposal
}

在控件中使用钩子可以避免在init / exit中添加attach + detach调用,并使事件注册表保持较小。

答案 1 :(得分:1)

我可以通过测试Explored App Example轻松确认您描述的行为。在那里,只需打开控制台并点击sap.ui.getCore().getConfiguration().setLanguage("de");

我还检查了implementation of the FacetFilter,我将其称为Control实现中的一个错误。它来自于如何在控件内加载文本。万一你有兴趣:

  1. 消息包都包含 FACETFILTER_INFOBAR_NO_FILTERS 的正确翻译(因为翻译来自"默认"捆绑):

  2. FacetFilter有一个hidden aggregation called SummaryBar。 SummaryBar包含您看到的文本。当然,这是text comes from a bundle

  3. 但是,通过调用initialized exactly once in init(),该捆绑包为sap.ui.getCore().getLibraryResourceBundle("sap.m");。这里的API文档说:

      

    如果只给出一个参数,则假定它是libraryName。   然后,语言环境将回退到当前会话区域设置。

  4. 这意味着捆绑包已缓存,因此本地化(例如语言)的更改不会触发捆绑包加载新的转换文件。因此,无论我们尝试什么,我们总会看到初始语言(即使重新渲染()也无济于事。)

  5. 解决方案是在捆绑包加载到init之后立即添加以下代码来修复控件:

    sap.ui.getCore().attachLocalizationChanged(function(oEvent){
        var oChanges = oEvent.getParameter("changes");    
        if (oChanges && oChanges.language){
            this._bundle = sap.ui.getCore().getLibraryResourceBundle("sap.m", oChanges.language);
            this.rerender();
        }
    }.bind(this));
    

    你可以在上面链接的探索过的应用中试试这个,它对我来说很好......

    我刚开了issue on github