SAPUI5中的语言切换

ale*_*exP 5 javascript sapui5

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

如果我执行例如:

sap.ui.getCore().getConfiguration().setLanguage("de");
Run Code Online (Sandbox Code Playgroud)

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

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

sap-ui-language=DE
Run Code Online (Sandbox Code Playgroud)

但我不能在我的例子中使用参数。任何想法?

小智 5

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

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

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

我只是想补充一点,控件(例如FilterBar)最好使用钩子方法:

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

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


Nab*_*abi 3

我可以通过测试探索的应用程序示例轻松确认您所描述的行为。在那里,只需打开控制台并点击sap.ui.getCore().getConfiguration().setLanguage("de");

我还检查了FacetFilter 的实现,我将其称为 Control 实现中的错误。它来自文本在控件内的加载方式。以防万一您有兴趣:

  1. 消息包都包含FACETFILTER_INFOBAR_NO_FILTERS的正确翻译(对于 en ,翻译来自“默认”包):

  2. FacetFilter 有一个隐藏的聚合,称为 SummaryBar。摘要栏包含您看到的文本。当然,本文来自一个捆绑包

  3. 但是,该包在 init() 中通过调用sap.ui.getCore().getLibraryResourceBundle("sap.m"); 被初始化一次。这里 API 文档说:

    如果仅给出一个参数,则假定它是库名称。然后区域设置会回退到当前会话区域设置。

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

解决方案是在捆绑包加载到 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));
Run Code Online (Sandbox Code Playgroud)

您可以在上面链接的探索应用程序中尝试一下,它对我来说效果很好......

我刚刚在 github 上打开了一个问题