我的SAPUI5控件存在语言问题。
如果我执行例如:
sap.ui.getCore().getConfiguration().setLanguage( "de" );
我的i18n文件已正确加载,所有标签都已翻译为德语。但控制仍然是英文。
获取德语控件的唯一方法是使用url参数:
sap-ui-language=DE
但我不能在我的案例中使用参数。有什么想法吗?
答案 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实现中的一个错误。它来自于如何在控件内加载文本。万一你有兴趣:
消息包都包含 FACETFILTER_INFOBAR_NO_FILTERS 的正确翻译(因为翻译来自"默认"捆绑):
FacetFilter有一个hidden aggregation called SummaryBar。 SummaryBar包含您看到的文本。当然,这是text comes from a bundle。
但是,通过调用initialized exactly once in init(),该捆绑包为sap.ui.getCore().getLibraryResourceBundle("sap.m");。这里的API文档说:
如果只给出一个参数,则假定它是libraryName。 然后,语言环境将回退到当前会话区域设置。
这意味着捆绑包已缓存,因此本地化(例如语言)的更改不会触发捆绑包加载新的转换文件。因此,无论我们尝试什么,我们总会看到初始语言(即使重新渲染()也无济于事。)
解决方案是在捆绑包加载到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。