在 ABAP 中使用可翻译文本

学习目标

  • 描述 ABAP 开发的翻译流程。

  • 使用文本元素使开发可翻译。

ABAP 开发的翻译

某些 ABAP 开发对象包含可在应用程序的用户界面 (UI) 上显示的文本。例如,在 ABAP RESTful 应用程序编程模型中,UI 上显示以下文本:

  • 数据定义和元数据扩展中注释的标签和标头。

  • 数据元素中的标签

  • 消息类中的消息

对于使用不同登录语言启动应用的最终用户,这些文本需要不同。

注意

在 ABAP 开发工具中,您可以在编辑器视图下的属性标签上找到开发对象的原始语言。

当然,人们无法期望开发人员能够以每种不同的语言提供文本。观看此视频,了解 ABAP 开发如何处理不同语言。

视频:本节含 SAP 官方视频(视频 ID 1_8aeev2rc),需在 learning.sap.com 在线观看。

文本池和文本元素

如上所述,缺省情况下,数据元素、数据定义、元数据扩展、消息类等中的语言相关文本可翻译。但是,ABAP 源代码中的文本呢?默认情况下,它们也可以翻译吗?

答案是不,文字是不可翻译的!文字的内容始终相同,与用户登录语言无关。

如果文字包含语言相关文本,并且此文本到达 UI,则在某些时候,必须使用文本符号替换文字。

文本符号

文本符号(有时也称为文本元素)存储在全局 ABAP 类的文本池中。

文本符号由三个字符的 ID 标识,该标识在文本池中必须唯一。文本符号的标识由数字、字母或两者的组合组成。文本符号标识不区分大小写。在文本池编辑器中,始终以大写字母显示。

在我们的示例中,文本池包含文本符号 001 和文本符号 HAU。

注意

不要将文本标识与消息标识混淆。对于消息类中的消息,仅允许数字。

每个文本符号均以 ABAP 类的原始语言定义文本。文本长度的技术限制为 255 个字符。除此技术限制外,还必须为每个文本符号定义语义最大长度。最大长度必须介于实际长度和技术限制之间。

在我们的示例中,文本符号 HAU 的实际长度为 12,最大长度为 30。

警告

最大长度定义译员的硬限制。应明显高于实际长度,以避免翻译文本元素中需要隐蔽缩写。

有两种方法可以访问 ABAP 中的文本符号:

  • 独立,含文本,后跟连字符和文本标识

  • 附加到文本文字,即文本文字后面紧跟括号内的 ID。

在第二个变式中,文本文字用作回退类型。如果当前加载的文本池中存在文本符号,则使用文本符号的内容而不是文字,否则使用文字。

注意

为避免混淆,文本符号的文本和文字中的文本应始终匹配。ATC 中的"扩展程序检查(SLIN)"包含字符串检查。如果文字和文本符号不同,此检查将发出警告。

翻译文本符号后,ABAP 运行时使用适合用户登录语言的文本。

如何使用文本符号的快速修复

尽管可以手动编辑文本池,但使用 ABAP 编辑器中的快速修复创建和维护文本符号更加容易。观看此演示,了解如何使用文本符号的快速修复。

视频:本节含 SAP 官方视频(视频 ID 1_uvuq0uya),需在 learning.sap.com 在线观看。

创建和使用文本符号

您注意到控制台输出不可翻译。在本练习中,使用文本池中的文本符号替换字符串模板中的文字文本。

模板:

  • /LRN/CL_S4D401_TCS_TIMESTAMP(全局类)

解决方案:

  • /LRN/CL_S4D401_TCS_TEXT_POOL(全局类)

任务 1: 复制模板(可选)

复制模板类 /LRN/CL_S4D401_TCS_TIMESTAMP。如果已完成上一练习,则可以跳过此任务并继续编辑类 ZCL_##_SOLUTION

步骤

  1. 将类 /LRN/CL_S4D401_TCS_TIMESTAMP 复制到您自己的包中的类(建议名称:ZCL_##_SOLUTION,其中 ## 代表组编号)。

  2. 在项目浏览器中,右键单击类 /LRN/CL_S4D401_TCS_TIMESTAMP 以打开上下文菜单。

  3. 从上下文菜单中,选择复制....

  4. 在包字段中输入的名称。在名称字段中,输入 ZCL_##_SOLUTION,其中 ## 代表组编号。

  5. 选择下一步

  6. 确认传输请求并选择完成

  7. 激活复制。

  8. Ctrl + F3 激活类。

任务 2: 启用输出翻译

确保使用全局类的原始语言登录。然后调整本地类 LCL_CARRIER 的方法 GET_OUTPUT 的实施。将字符串模板中的文字文本替换为文本池中的可翻译文本。

步骤

  1. 显示 ABAP 类的原始语言,并确保您以相同的语言登录。

  2. 打开全局类 ZCL_##_SOLUTION 的源代码。

  3. 从编辑器下方的选项卡中选择*"属性*"选项卡。

  4. 记录原始语言属性。应将其设置为 EN

  5. 在项目浏览器中,分析 ABAP 云项目的描述。在系统标识、登录客户端和用户标识之后,将显示登录语言。

  6. 如果登录语言与 ABAP 类的原始语言不匹配,则使用正确的登录语言创建新项目。

  7. 导航到本地类 LCL_CARRIER 中方法 GET_OUTPUT 的实施。

  8. 例如,您可以在编辑器中打开局部类型标签并搜索 METHOD get_output

  9. 或者,您可以在左侧的概要视图中展开 ZCL_##_SOLUTIONLCL_CARRIER,然后选择 GET_OUTPUT

  10. 调整第一个 APPEND 语句中的字符串模板。将文本文字替换为嵌入式文本文字。

提示

请注意,嵌入表达式的大括号需要至少一个空格。

  1. 如下调整代码:

APPEND |{ 'Carrier Name:' } { me->name }| TO r_result.
  1. 将嵌入式文本文字链接到文本符号(文本符号的建议标识:001)。

提示

请注意,标识括号内或标识的右引号和左括号之间不允许有空格。

  1. 如下调整代码:

APPEND |{ 'Carrier Name:'(001) } { me->name }| TO r_result.
  1. 对其他字符串模板中的文本文字重复此操作(文本符号的建议标识:002003004)。

  2. 如下调整代码:

APPEND |{ 'Carrier Name:'(001)       } { me->name }| TO r_result.
APPEND |{ 'Passenger Flights:'(002)  } { lines( passenger_flights ) }| TO r_result.
APPEND |{ 'Average free seats:'(003) } { get_average_free_seats( )  }| TO r_result.
APPEND |{ 'Cargo Flights:'(004)      } { lines( cargo_flights )     }| TO r_result.
  1. 使用快速修复在文本池中创建最大长度为 20 的第一个文本。

  2. 将光标置于 (001) 上并按 Ctrl + 1

  3. 选择 在文本池中创建文本 001

  4. 使用滑块将最大长度设置为 20,然后选择完成

  5. 每次都使用相同的最大长度,重复上一步骤以在文本池中创建其他文本。

  6. 照常执行该步骤。

  7. 分析并激活文本池。

  8. 按住 Ctrl 键并选择任意文本标识以导航到文本池。

  9. 文本池应如下所示:

@MaxLength:20
001=Carrier Name:
@MaxLength:20
002=Passenger Flights:
@MaxLength:20
003=Average free seats:
@MaxLength:20
004=Cargo Flights:
  1. 在文本池中按 Ctrl + F3

  2. 激活全局类并将其作为控制台应用进行测试。

注意

您不应注意到任何差异。改进是文本现在可翻译。但是,这只有在系统管理员实际创建翻译项目时才会起作用。这超出了本课程的范围。

  1. 返回到方法 GET_OUTPUT 的实施。

  2. Ctrl + F3

  3. F9