我的 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 中添加附加 + 分离调用,并保持事件注册表较小。
我可以通过测试探索的应用程序示例轻松确认您所描述的行为。在那里,只需打开控制台并点击sap.ui.getCore().getConfiguration().setLanguage("de");
我还检查了FacetFilter 的实现,我将其称为 Control 实现中的错误。它来自文本在控件内的加载方式。以防万一您有兴趣:
消息包都包含FACETFILTER_INFOBAR_NO_FILTERS的正确翻译(对于 en ,翻译来自“默认”包):
FacetFilter 有一个隐藏的聚合,称为 SummaryBar。摘要栏包含您看到的文本。当然,本文来自一个捆绑包。
但是,该包在 init() 中通过调用sap.ui.getCore().getLibraryResourceBundle("sap.m"); 被初始化一次;。这里 API 文档说:
如果仅给出一个参数,则假定它是库名称。然后区域设置会回退到当前会话区域设置。
这意味着捆绑包已被缓存,因此对本地化(例如语言)的更改不会触发捆绑包加载新的翻译文件。因此,无论我们尝试什么,我们总是会看到初始语言(即使 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)
您可以在上面链接的探索应用程序中尝试一下,它对我来说效果很好......
| 归档时间: |
|
| 查看次数: |
18590 次 |
| 最近记录: |