本地化错误消息

Objective

After completing this lesson, you will be able to 提供本地化错误消息

文本包文件

我们在场景的管理服务的实施类和 CatalogService 的实施类中使用消息 API 中的 req.error() 方法。如果验证失败,我们使用此方法输出错误消息。到目前为止,我们已将报告的消息硬编码为文本文字。

在本课中,我们将了解如何将消息国际化。 它们不是硬编码的,而是在单独的文件(所谓的文本包)中作为键值对进行维护。然后,应用程序代码使用这些键值访问相应的文本。这意味着键值是实际语言特定文本。为了支持不同的语言,维护了为相同键值提供翻译文本的不同文件(请参阅下图)。 

创建用于国际化错误消息的包文件

详细过程如下:在名为 _i18ni18nassets/i18n 的文件夹中创建名为 messages.properties 的文件。messages.properties 文件的文件夹必须位于项目目录正下方,或位于包含用于定义服务模型的文件的目录中(例如我们项目中的 srv 目录)。

注意

可以使用 cds.i18n.folders 属性在项目的 package.json 文件中配置 CAP 搜索文本包的文件夹的名称。缺省情况下,这些是文件夹名称 _18ni18nassets/i18n

所需文本在 messages.properties 文件中作为键值对进行维护。通常,文本以英语维护。可使用占位符,其格式为 "{n} "。n 遍历从 0 开始的自然数。

为支持其他语言,根据以下命名规则,在与 messages.properties 文件相同的文件夹中创建附加文件:messages<_languageCode><_countryCode>.properties。国家/地区代码是可选的。此类文件名的示例为 messages_de.propertiesmessages_fr_CA.propertiesmessages_es_MX.properties

附加文件使用与 messages.properties 文件相同的密钥。但是,代码的值根据语言代码以及文件名中的国家/地区代码(如果适用)进行翻译。

在所示示例中,已创建两个 .properties 文件:带有英语文本的 messages.properties 和具有相应德语翻译的 messages_de.properties

回退链

假设在处理请求时通过键值查询文本,其中已为语言确定德语。如果为 messages_de.properties 文件中的键值维护文本,则应用程序会使用此文本。但是,如果没有 messages_de.properties 文件或使用的密钥未在现有 messages_de.properties 文件中维护,CAP 将返回到 messages.properties 文件,并尝试通过此文件确定键值。如果可以,应用程序将使用相应的文本。如果 messages.properties 也不包含匹配条目,则应用程序使用密钥名称作为文本。

注意

文本包的基本名称消息是必需的。这意味着创建的文件必须命名如下:messages<_languageCode><_countryCode>.properties。但是,从技术上讲,无需创建不含名为 messages.properties 的后缀的原始文件。英语文本也可以在名为 messages_en.properties 的文件中维护。但是,在这种情况下,您将无法从上述后备机制中受益。此机制确保在没有为特定语言创建 .properties 文件或没有为相关 .properties 文件中的特定语言维护特定键值时,使用 messages.properties 文件中的文本。

访问本地化消息

可以通过消息 API 访问文本包中维护的文本,例如,通过方法 req.error()req.warn()。为此,仅将相应键值传递到这些方法,而不是实际消息(请参阅下图)。

或者,可以将具有占位符值的数组作为最后一个参数从消息 API 传递到方法。然后,数组中的第一个值用于占位符 {0},即占位符 {1} 的数组中的第二个值,依此类推。

测试

您可以使用 URL 参数 sap-locale 测试不同的语言。在以下示例中,请求德语文本:

Code Snippet
1234567
POST <service_url>/submitOrder?sap-locale=de Content-Type: application/json { "book": "0ec991dc-95c5-4d8f-91e6-f81a92744781", "quantity": 0 }

或者,您还可以使用具有相应 Accept-Language 标头的请求:

Code Snippet
12345678
POST <service_url>/submitOrder Accept-Language: de Content-Type: application/json { "book": "0ec991dc-95c5-4d8f-91e6-f81a92744781", "quantity": 0 }

URL 参数 sap-locale 的首选项最高。如果也应设置 Accept-Language 标头,则将其覆盖。

演示 & 练习:使用本地化错误消息

注意

在练习中,在 SAP Business Application Studio 中自行执行以下演示中的分步说明。

作为练习的起点,如果已成功完成 CAP 服务实施中的先前练习使用查询的结果,请使用该练习的结果。或者,您还可以使用以下 GitHub 资源库中的分支 14_queries 作为起点:

https://github.com/SAP-samples/cap-development-learning-journey

可在 GitHub 资源库的 15_error_messages 分支中找到模拟的完整实施。

有关资源库内容及其使用方法的详细信息,可在此处找到。

观看视频,了解如何使用本地化错误消息。