使用本地化数据、代码清单和通用重用类型

Objectives

After completing this lesson, you will be able to:
  • 提供应用数据的本地化版本
  • 提供代码清单
  • 使用常用重用类型 国家/地区 和 货币

本地化数据

在本课中,我们将了解如何为文本应用程序数据提供翻译。例如,可能需要以不同语言维护书的标题。

首先,我们将了解如何声明本地化数据。

声明本地化数据

localized 修饰符用于声明本地化数据。用于识别需要翻译文本的实体元素。在下图中,相应标记 Books 实体的标题元素:

幕后

根据之前的定义,cds 编译器会自动生成各种内容。除其他内容外,会生成单独的 Books.texts 实体来保存翻译的文本。此实体具有以下结构:

Code Snippet
12345
entity Books.texts { key locale : sap.common.Locale; key ID : UUID; title : String(255); }

Books.texts 实体具有两个关键字段区域设置ID

关键字段区域设置的数据类型为 sap.common.Locale,这是上述 @sap/cds/common 模型中的常见重用类型。最终,此类型用于定义长度为 14 的字符串。区域设置字段用于存储语言代码,例如 ende

第二个关键字段 ID 对应于 Books 实体的主键。

使用 Books.texts 实体,可以为每个工作簿保存每个语言代码(区域设置)的已翻译标题,即每个 ID

Books.texts 实体外,还通过生成的 SQL DDL 创建附加视图,以便读取本地化文本。

提供本地化数据

借助生成的视图,服务运行时的通用处理器会自动以用户的首选语言提供读取请求。在我们的示例中,用户会自动收到其首选语言的书名,如果没有此语言的翻译,则使用备用语言接收书标题。然后,这是标题,因为它存储在属于 Books 实体的表中。

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

Code Snippet
1
GET <your_service_url>/Books?sap-locale=de

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

Code Snippet
12
GET <your_service_url>/Books Accept-Language: de

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

现在,让我们了解一下最初如何为应用程序提供本地化数据。

添加初始数据

观看视频,了解如何添加初始数据。

在下一节中,我们将讨论 @sap/cds/common 模型中的 CodeList 方面以及 CountryCurrency 类型。

代码列表

代码列表的用途

现在,让我们讨论 CAP 提供的代码清单概念。它提供了一种提供可翻译值清单的标准化方法。

观看视频以获取代码列表的概览。

接下来,我们来看一下如何使用代码列表。

方面 sap.common.CodeList

sap.common.CodeList 方面为 CAP 中的代码清单提供基本定义。它属于 @sap/cds/common 模型。通过 context 指令在此设置命名空间 sap.common(请参阅下图)。该指令用于定义中的嵌套命名空间部分。

方面 sap.common.CodeList 定义了两个元素 namedescr,这两个元素用之前讨论的 localized 修饰符进行标记。这样,就可以在已解释的情况下为这些字段提供翻译文本。

在先前定义中使用的注释中,注释 @cds.autoexpose 在此处尤为重要:我们稍后将以实体的形式实施自己的代码列表 Epochs,我们将使用 sap.common.CodeList 进行扩展。这意味着我们的 Epochs 实体从 @cds.autoexpose 继承 sap.common.CodeList。因此,我们的 Epochs 代码列表实体将自动公开在包含与 Epochs 实体有关联的实体的服务中。在我们的场景中,作者实体将定义与 Epochs 实体的此类关联。这意味着,无需我们进行任何进一步操作,生成的 OData 服务随后将公开 Epochs 实体的实体集。

创建自己的代码清单

要创建自己的代码列表,请通过 sap.common.CodeList 指令从 @sap/cds/common 模型导入 using 方面。在下图的示例中,这是通过 using 的 ES6 式解构器变式完成的。

在示例中,CodeList 方面用作 include 以相应地扩展 Epochs 实体。实体最终具有以下结构:

Code Snippet
12345
entity Epochs { key ID : Integer; name : localized String(255); descr : localized String(1000); }

注意

必须使用完全限定名称 sap.common.CodeList 进行导入。之后,通过非限定名称使用导入的方面 CodeList

我们从关于 localized 修饰符的讨论中了解到,cds 编译器根据之前的定义生成单独的 Epochs.texts 实体来保存翻译的文本。此实体具有以下定义,以便能够为每个标识的每个语言代码(区域设置)存储名称和描述的翻译:

Code Snippet
123456
entity Epochs.texts { key locale : sap.common.Locale; key ID : Integer; name : String(255); descr : String(1000); }

提供初始数据

对于代码列表,您可以按照书目描述的相同方式提供初始数据。为此,首先需要一个包含所有缺省语言数据的 .csv 文件。

在我们的场景中,这是文件 com.sap.learning-Epochs.csv。此文件中的条目如下所示,其中在示例中仅使用缺省语言英语维护名称和描述:

然后,可以通过相应的第二个 .csv 文件创建应用程序支持的其他语言的翻译。在示例中,这是文件 com.sap.learning-Epochs.texts.csv,其条目如下所示,以为纪元名称提供德语翻译。

使用代码列表

我们使用作者实体中的 Epochs 代码列表将纪元分配给作者。为此,我们创建一个名为 epoch 的托管对一关联,从 Authors 实体到 Epochs 实体,如下图所示:

我们已经知道如何通过 CAP 实现管理的一对一关联纪元:由于 Epochs 代码列表具有关键字段标识,因此在为"作者"实体生成的数据库表中创建名为 epoch_ID 的外键字段:

SQL
1234
CREATE TABLE com_sap_learning_Authors ( ... epoch_ID INTEGER );

此外键字段用于存储作者和在数据库中将其分配到的时间段之间的关系。

预定义类型国家/地区和货币

对于国家/地区、货币和语言,CAP 通过 @sap/cds/common 模型提供预定义代码列表 sap.common.Countriessap.common.Currenciessap.common.Languages

但是,在您自己的模型中,您很少直接引用这些代码列表。相反,您将使用包含在 @sap/cds/common 模型中的重用类型 CountryCurrencyLanguage,它们定义了与这些代码列表的相应关联。

在以下部分中,我们将详细了解如何使用 CountryCurrency 类型。您可以在 CAP 文档中找到语言的更多详细信息。

类型 Country

通用重用类型 Country@sap/cds/common 中定义为与代码列表实体 sap.common.Countries 的托管对一关联,如下图所示:

代码列表实体 sap.common.Countries 旨在将 ISO 3166-1 两个字母的 alpha 代码用作主键。例如,这意味着相应的关键字段代码包含德国的值 "DE"。

提示

如图所示,代码元素定义为 String(3),因此您可以根据需要输入三个字母的代码。

先前对 sap.common.Countries 实体的定义(其中 sap.common.CodeList 用作包含文件)最终通过解析 include 语句导致具有以下结构的实体:

Code Snippet
12345
entity sap.common.Countries { key code : String(3); name : localized String(255); descr : localized String(1000); }

正如所讨论的那样,cds 编译器又在此基础上生成一个单独的 sap.common.Countries.texts 实体来保存翻译文本。此实体具有以下定义,能够为每个国家/地区(代码)的每个语言代码(区域设置)存储名称和描述的翻译:

Code Snippet
123456
entity sap.common.Countries.texts { key locale : sap.common.Locale; key code : String(3); name : String(255); descr : String(1000); }

类型 Currency

通用重用类型 Currency 的定义类似于类型 Country。它指定与代码列表实体 sap.common.Currencies 的托管到一关联:

代码列表实体 sap.common.Currencies 旨在将 ISO 4217 三个字母的 alpha 代码用作主键。这意味着相应的关键字段代码包含 "USD"(美元)。此外,此代码列表包含通用货币符号的元素和小数位数形式的次要单位的元素。

实体 sap.common.Currencies 的先前定义(其中 sap.common.CodeList 用作包含文件),通过解析 include 最终导致具有以下结构的实体:

Code Snippet
1234567
entity sap.common.Currencies { key code : String(3); symbol : String(5); minorUnit : Int16; name : localized String(255); descr : localized String(1000); }

cds 编译器还创建一个单独的实体 sap.common.Currencies.texts 来保存翻译的文本。此实体具有以下定义,可以为每个货币(代码)的每个语言代码(区域设置)存储名称和描述的翻译:

Code Snippet
123456
entity sap.common.Currencies.texts { key locale : sap.common.Locale; key code : String(3); name : String(255); descr : String(1000); }

提供初始数据

要为国家/地区和货币代码列表提供初始数据,请在 db/data 目录中创建以下 .csv 文件:

文件名内容
sap.common-Countries.csv缺省语言的国家/地区列表
sap.common-Countries.texts.csv国家/地区列表的翻译
sap.common-Currencies.csv缺省语言的货币清单
sap.common-Currencies.texts.csv币种列表的翻译

下图显示了国家/地区代码列表的两个文件的示例。为简单起见,此处不维护描述字段。sap.common-Countries.texts.csv 文件包含 sap.common-Countries.csv 中国家/地区名称的德语翻译:

相应地,以下示例显示货币代码清单的两个文件。此处仅维护代码名称和符号字段。不需要翻译货币名称,这就是 sap.common-Currencies.texts.csv 文件仅包含列标题而不包含换算条目的原因:

注意

@sap/cds-common-content 包含代码列表 sap.common.Countriessap.common.Currenciessap.common.Languages 的预构建数据。代码的名称和描述将翻译为 SAP 支持的最重要语言。阅读包文档,了解如何将此包及其数据集成到应用程序中。

使用 CountryCurrency 类型

为了能够使用上述 CountryCurrency 类型,请通过 using 指令导入它们,如下图所示:

将导入的类型分配到定义中的相应元素,以便最终定义与 sap.common.Countriessap.common.Currencies 代码列表的关联。

在该示例中, Books 实体的 publCountry 元素的数据类型为 Country,因此实现与 sap.common.Countries 代码列表的关联。相应地, Books 实体价格元素的货币组成部分定义与 sap.common.Currencies 代码列表的关联。

由于分配的类型,元素 pubCountryprice_currency 将成为生成的 OData 服务中的导航属性。

注意

请记住,诸如 Books 实体的价格元素等结构化元素用下划线展平。这意味着 Books 实体最终具有平面结构,其中包含两个名为 price_amountprice_currency 的字段。

由于基本类型 sap.common.CodeList 中的 @cds.autoexpose 注释,PublCountryprice_currency 的导航目标(即代码清单实体 sap.common.Countriessap.common.Currencies)在 OData 服务中自动公开为实体集。我们已使用 Authors 实体的纪元元素示例讨论了上述行为。我们将此导航属性作为与自定义 Epochs 代码列表的关联实施。

在为 Books 实体生成的数据库表中,通过相应的外键字段实现与代码列表的关联。由于 sap.common.Countries 代码列表具有关键字段代码,因此在为 Books 实体生成的数据库表中创建名为 publCountry_code 的外键字段。因此,为与 sap.common.Currencies 代码列表的关联创建外键字段 price_currency_code

SQL
12345
CREATE TABLE com_sap_learning_Books ( ... publCountry_code NVARCHAR(3), price_currency_code NVARCHAR(3) );

外键字段用于存储书和分配的出版国家/地区之间的关系,以及数据库中分配的货币。

演示和练习:使用本地化数据、代码清单和通用重用类型

注意

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

如果成功完成,请使用上一练习使用预定义方面的结果作为练习的起点。或者,您还可以使用以下 GitHub 资源库中的分支 6_common_reuse_seconics 作为起点:

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

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

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

观看视频,了解如何使用本地化数据、代码清单和通用重用类型。