如何为SAPUI5库提供缺少的翻译文件?

如何为SAPUI5库提供缺少的翻译文件?,sapui5,ui5-tooling,Sapui5,Ui5 Tooling,我有一个SAPUI5应用程序,它试图加载一些基于用户语言的翻译文件,但这些语言在SAP的原始库中丢失 例如,它尝试加载带有falocale的翻译,如下所示: https://webidetestingXXXXXXX.dispatcher.hana.ondemand.com/webapp/resources/sap/m/messagebundle_fa.properties 可以看到,它试图从sap.m名称空间读取翻译 现在的问题是,由于我可以访问此资源的英文翻译文件,我如何激活回调机制,当翻

我有一个SAPUI5应用程序,它试图加载一些基于用户语言的翻译文件,但这些语言在SAP的原始库中丢失

例如,它尝试加载带有
fa
locale的翻译,如下所示:

https://webidetestingXXXXXXX.dispatcher.hana.ondemand.com/webapp/resources/sap/m/messagebundle_fa.properties

可以看到,它试图从
sap.m
名称空间读取翻译

现在的问题是,由于我可以访问此资源的英文翻译文件,我如何激活回调机制,当翻译文件丢失时,它会查看我的i18n文件夹,如果在那里找不到该文件,则加载默认翻译

例如,我可以下载英文文件,并在
webapp\i18n\sap\m\messagebundle\u fa.properties
下提供波斯语翻译,当无法在原始位置找到文件时,请从本地文件夹中读取


请注意,WebIDE中我的
webapp\i18n
文件夹的实际地址类似于
https://webidetestingXXXX.dispatcher.hana.ondemand.com/~1595255696000~/webapp/i18n/
~1595255696000~
引用了run app的当前实例。正如您所看到的,无法加载的文件丢失了它

UI5中没有针对资源包的特定重定向或回调机制

我能想到的唯一解决办法是,使用UI5模块加载器的路径映射功能将库中所有语言文件的请求重定向到您自己的丰富副本(a),或者预加载它们并在加载器(B)中以预期名称注册它们

在UI5尝试访问您想要充实的库中的任何文本之前,必须尽早应用这两种变体

注意:我没有完全测试这些变通方法(它们可能包含打字错误或映射/资源可能需要修改),,这是不好的部分,它们只适用于UI5版本<1.78。从1.78开始,UI5知道每个库存在哪些*.properties文件,不请求任何其他文件

变量A(映射)
sap.ui.loader.config({
路径:{
“sap/m/messagebundle.properties”:“my/enriched/copy/messagebundle.properties”
}
});
  • Pro:使用公共API
  • 缺点:麻烦,因为所有语言都必须复制(和更新),并且只有在不需要太多库的情况下才可以管理
变量B(预加载)
//以某种方式加载sap.m的“fa”文本(理想情况下为异步)
var sapmtext=。。。;
//然后在加载之前将其注册到加载程序的预加载缓存中
sap.ui.require.preload({
“sap/m/messagebundle\u fa.properties”:sapmtext
});
  • 缺点:
    sap.ui.require.preload
    不是公共API

可能会有所帮助,有趣的是,看看UI5控件库是如何完全忽略波斯语的,但完全支持波斯语日历和波斯语CLDR文件的。如果有足够的需求,我可以想象控制开发人员可以将
messagebundle\u fa.properties
包含到他们的lib中(除非有法律限制)。如果您可以在GitHub上创建一个增强请求,这样人们就可以给出他们的As 1.78(),并且正如下面codeworrior所提到的,控制库现在在内部使用回退区域设置来避免404请求,那就太好了。如果请求
messagebundle\u fa.properties
,则使用
messagebundle\u en.properties
。是的,由于对伊朗的制裁,该语言被忽略。但正如我所知,波斯日历有时甚至在一些iTernalDB算法中使用,因为它很精确。因此,对于一些内部用例,他们可能需要它。老实说,我不需要翻译。整个项目都是为了学习。看来这就是答案,让我来测试一下。只是一个小问题,我可以把映射放在manifest.json中吗?对于第二种方法:我必须把它放在哪里?我把它放在组件的
onInit
功能中,它失败了!当它在ui5内核尝试加载文件后加载文件时!对不起,没有人工作!我甚至测试了基于的第一种方法,但它没有重定向请求。似乎我记错了解决方法。ResourceBundle始终从同一位置加载所有语言,将单个弓箭步映射到不同位置不起作用。因此,您必须将所有请求重定向到您的位置,并在那里复制所有资源包。那是最麻烦的部分。对于第二个变体,您必须在加载库之前提前执行。否则,框架可能已经尝试加载资源包。我发现了问题。这似乎是UI5中的一个bug<代码>\u fa必须删除,然后它将重定向请求!