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

How can I provide missing translation files for SAPUI5 libraries?

我有一个 SAPUI5 应用程序,它尝试根据用户语言加载一些翻译文件,但 SAP 的原始库中缺少这些语言。

例如,它会尝试加载 fa 语言环境的翻译,如下所示:

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

可以看出它试图从 sap.m 命名空间读取翻译!

现在的问题是,既然我可以访问这个资源的英文翻译文件,我该如何激活一个回调机制,当翻译文件丢失时,它会查看我的 i18n 文件夹,然后如果它在那里找不到文件,然后加载默认翻译!?

例如,我可以下载英语文件并在 webapp\i18n\sap\m\messagebundle_fa.properties 下提供波斯语翻译,当在原始位置找不到文件时,然后从我的本地文件夹中读取它!

请注意我的 webapp\i18n 文件夹在 WebIDE 中的实际地址类似于 https://webidetestingXXXX.dispatcher.hana.ondemand.com/~1595255696000~/webapp/i18n/~1595255696000~ 指的是 运行 应用程序的当前实例。如您所见,加载失败的文件丢失了!

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

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

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

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

变体 A(映射)

sap.ui.loader.config({
  paths: {
    "sap/m/messagebundle.properties": "my/enriched/copy/messagebundle.properties"
  }
});
  • Pro: 使用 public API.
  • 缺点:所有语言都必须复制(和更新),而且只有在不需要太多库时才易于管理。

变体 B(预加载)

// somehow load the 'fa' texts for sap.m (ideally async)
var sapmtext = ...;

// then register it in the preload cache of the loader before 
sap.ui.require.preload({
  "sap/m/messagebundle_fa.properties": sapmtext
});
  • 缺点:sap.ui.require.preload 不是 public API。