在 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。
步骤
将类
/LRN/CL_S4D401_TCS_TIMESTAMP复制到您自己的包中的类(建议名称:ZCL_##_SOLUTION,其中 ## 代表组编号)。在项目浏览器中,右键单击类
/LRN/CL_S4D401_TCS_TIMESTAMP以打开上下文菜单。从上下文菜单中,选择复制....
在包字段中输入包的名称。在名称字段中,输入
ZCL_##_SOLUTION,其中 ## 代表组编号。选择下一步。
确认传输请求并选择完成。
激活复制。
按
Ctrl + F3激活类。
任务 2: 启用输出翻译
确保使用全局类的原始语言登录。然后调整本地类 LCL_CARRIER 的方法 GET_OUTPUT 的实施。将字符串模板中的文字文本替换为文本池中的可翻译文本。
步骤
显示 ABAP 类的原始语言,并确保您以相同的语言登录。
打开全局类
ZCL_##_SOLUTION的源代码。从编辑器下方的选项卡中选择*"属性*"选项卡。
记录原始语言属性。应将其设置为 EN。
在项目浏览器中,分析 ABAP 云项目的描述。在系统标识、登录客户端和用户标识之后,将显示登录语言。
如果登录语言与 ABAP 类的原始语言不匹配,则使用正确的登录语言创建新项目。
导航到本地类
LCL_CARRIER中方法GET_OUTPUT的实施。例如,您可以在编辑器中打开局部类型标签并搜索
METHOD get_output。或者,您可以在左侧的概要视图中展开 ZCL_##_SOLUTION→LCL_CARRIER,然后选择 GET_OUTPUT。
调整第一个 APPEND 语句中的字符串模板。将文本文字替换为嵌入式文本文字。
提示
请注意,嵌入表达式的大括号需要至少一个空格。
如下调整代码:
APPEND |{ 'Carrier Name:' } { me->name }| TO r_result.
将嵌入式文本文字链接到文本符号(文本符号的建议标识:
001)。
提示
请注意,标识括号内或标识的右引号和左括号之间不允许有空格。
如下调整代码:
APPEND |{ 'Carrier Name:'(001) } { me->name }| TO r_result.
对其他字符串模板中的文本文字重复此操作(文本符号的建议标识:
002、003、004)。如下调整代码:
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.
使用快速修复在文本池中创建最大长度为
20的第一个文本。将光标置于
(001)上并按Ctrl + 1。选择 在文本池中创建文本 001 。
使用滑块将最大长度设置为
20,然后选择完成。每次都使用相同的最大长度,重复上一步骤以在文本池中创建其他文本。
照常执行该步骤。
分析并激活文本池。
按住
Ctrl键并选择任意文本标识以导航到文本池。文本池应如下所示:
@MaxLength:20
001=Carrier Name:
@MaxLength:20
002=Passenger Flights:
@MaxLength:20
003=Average free seats:
@MaxLength:20
004=Cargo Flights:
在文本池中按
Ctrl + F3。激活全局类并将其作为控制台应用进行测试。
注意
您不应注意到任何差异。改进是文本现在可翻译。但是,这只有在系统管理员实际创建翻译项目时才会起作用。这超出了本课程的范围。
返回到方法
GET_OUTPUT的实施。按
Ctrl + F3。按
F9。