掘金 后端 ( ) • 2024-05-06 15:21

在外企开发中,因为是全球业务,所以开发一个程序需要经常在中英环境下进行开发禾测试。本文就介绍了如何使应用程序为国际化和本地化做好准备。

不要对文本进行硬编码

切勿将文本编写为内联文本文字 - 它们很难找到并且无法翻译。

不推荐使用比如,在程序中使用 sy-langu 判断的方式:

IF sy-langu = '1'.
    gv_functxt-icon_text = '下载模板'.
    gv_functxt-quickinfo = '下载模板'.
ELSE.
    gv_functxt-icon_text = 'Download Template'.
    gv_functxt-quickinfo = 'Download Template'.
ENDIF.

请改用消息类别或文本符号(Text Symbols)。

image.png

如果是消息类,使用 SE91,而不是硬编码:

image.png

推荐使用:

IF wa_zekpo-zreason IS NOT INITIAL AND gs_item-loekz IS INITIAL.  
    MESSAGE e060(zsd) WITH gs_item-ebelp .  
    ch_failed = 'X'.  
ENDIF.

拒绝使用:

IF sy-langu EQ '1'.
  MESSAGE line_matnr && ' 物料不能在' && line_ebelp && '行的' && lv_country && '国家进行销售!' TYPE 'E'.
ELSE.
  MESSAGE line_matnr && ' cannnot be sold in ' &&  lv_country && 'in' && line_ebelp TYPE 'E'.
ENDIF.

不要使用文本常量

不要使用常量来存储文本(除非它不是文本而是字符常量)。文本常量无法翻译。请改用消息类别或文本符号。

使用文本表在数据库中存储文本

不要将文本与其他数据存储在同一字典表中。创建文本表并通过外键将它们分配给主表。文本表格有一些优点:

  • 他们支持翻译;
  • 同一对象可以处理多个文本(例如短文本、中文本、长文本等);
  • 无需搜索帮助。文本表中的文本将自动添加到值列表中;
  • 无需额外维护。文本列将自动添加到维护视图中;
  • 翻译可以通过事务 SE63 完成。

翻译编辑器事务码 SE63

image.png

对项目中的所有对象使用相同的原始语言

选择一种语言并在创建新对象时将其用作源。将来维护和翻译会更容易。

原始语言

创建新的资源库对象(如程序、类或 ABAP 词典中的数据库表)时,必须指定其原始语言。这将作为当前登录语言的一部分隐式指定。作为开发项目中开发对象的一部分而创建的所有可翻译文本(包括描述性短文本和长文本、程序的文本元素以及数据类型或接口的文档)都将指定原始语言。这些文本在翻译过程中(由开发触发)用其他语言创建,从原始语言翻译成目标语言。

一旦指定,目前还没有在整个项目中用另一种语言替换原始语言的技术支持。

原则:在项目级别定义原始语言

在实施之前,请仔细考虑您想要在项目级别的存储库对象中使用哪种原始语言。开发人员只能使用为此项目(或有时是子项目)定义的原始语言创建其开发对象。

定义原始语言时按如下步骤进行:

  • 如果一个项目涉及的所有开发组共享一种母语,则将该语言定义为所有开发对象的原始语言(这称为单语言开发)。
  • 如果开发小组是多语言的:
    • 那么所有开发对象的原始语言要么是所有涉及的开发人员都能理解的语言(通常是英语,也称为单语言开发)
    • 或者在项目的主要开发人员共享母语的那些部分中使用开发对象的原始语言(多语言开发)。

单语言开发小组是最好的情况,但现在并不总是可行。多语言开发组的两种可能的场景,无论是单语言还是多语言开发,都满足两个不同且相互矛盾的要求:

  • 当您以原始语言以外的语言登录到系统时,在以适当的目标语言创建相关文本的翻译之前,没有有效的方法来处理开发对象(无论是新的还是正在开发的)。翻译通常在后续翻译系统中进行,并且必须传输回开发系统。这意味着只有在整个项目一开始就定义一种原始语言,特别是在国际开发团队中(通常在多个地点工作),才能实现高效的开发过程。所有参与开发和验证过程的人员都可以使用该产品,即使只是出于测试目的。如果单语言开发是在多语言开发组中实现的,那么项目中的一些(如果不是全部)开发人员需要使用其母语以外的语言创建文本。
  • 通常没有工具或流程可用于对开发人员使用其母语以外的语言编写的 UI 文本和文档进行语言和风格检查。理想情况下,处理用户对话框和文档的开发人员应该以其母语创建文本,然后由经过培训的翻译人员使用预定义的术语将这些文本翻译成他们自己的母语。

第二点是为什么英语不需要成为所有开发项目的唯一原始语言的原因,也是为什么单语开发团队应该可以自由地使用其母语工作,并在需要时进行后续翻译的原因。

如果开发组是多语言的,则每个开发对象的原始语言必须根据具体情况决定。一般来说,第一点胜出,因为国际开发团队需要单语言开发才能最有效地利用其开发资源来完成特定项目。在某些情况下,例如子项目需要创建大量文本,最好将开发人员的母语定义为原始语言。这对于 SAP 的内部开发团队尤其重要,许多德语开发人员继续在该团队工作。

在多语言项目中,最好用单一语言开发相关的业务功能(至少在包级别)。表格内容也应该以单一语言创建。

Notes:

  • 原始语言被定义为创建存储库对象时的登录语言,这就是为什么特意使用登录语言来创建和编辑存储库对象

  • 无论开发项目是单语还是多语,都必须为项目中创建并全面使用的所有文本定义一致的术语。在多语言开发项目中,如果可能的话,应在开发开始前完成术语到相关语言的翻译,以便开发人员可以使用这些术语。还必须遵循 UI 文本和文档的现有标准。

牢记翻译

请记住,所有文本、消息、名称等都可以翻译。不同语言中的短语会有不同的长度(甚至不同的理由)。为其留一些可用空间。

英语短语比其他最常用的语言短得多。

开发对象仅使用英文命名

当您命名一些编程对象(如变量、方法或类名)或字典对象(如类型、结构、表等)时,仅使用英文名称。

不要使用其他语言,不要将它们组合起来。英语在大多数国家/地区都是可以理解的,使您的代码国际化是有用且礼貌的。也许它会得到另一个国家的另一个团队的支持。

这只是编程世界中的一个标准和最佳实践。别做野蛮人

在 UI 中仅使用可翻译文本

原则:仅向用户发送可翻译的文本,例如消息、OTR、文本符号等。将程序用于与用户通信的所有文本指定为可翻译的系统文本。创建可翻译的系统文本时,必须有足够的空间用于翻译。

在 ABAP 程序中,文本被用作处理数据的一部分,同时也被用作与用户通信的一种手段。后者称为系统文本,由 ABAP 应用程序提供。 ABAP Workbench 以这样的方式管理系统文本,即可以将系统文本从原始语言翻译成独立于实际开发对象的其他语言。以下是可翻译系统文本的示例:

  • ABAP 词典中数据元素的文本和文档
  • 本地类组件的简短文本和文档
  • Web Dynpro 应用程序和菜单条目中的 dynpros UI 文本
  • 消息文本
  • ABAP 程序的文本池,包含程序的文本元素,例如文本符号
  • 在线文本存储库 (OTR) 的文本

除了可翻译的系统文本之外,ABAP 程序还可以包含不可翻译的文本。这些通常是作为源代码的一部分存储的字符文字和注释。

这条规则不仅在国际环境中使用程序时至关重要,而且在国际环境中使用程序时也很重要。它也适用于在多语言开发小组中工作。禁止在 ABAP 源代码中对与用户对话框相关的所有文本使用字符文字就是源于此规则。字符文字无法翻译。它们的内容独立于各自的登录语言。应使用文本符号或与文本符号关联的字符文字,而不是字符文字。这也在扩展程序检查中进行检查。

创建系统文本时,必须有足够的空间。在翻译过程中通常不可能改变文本长度,因此翻译者依赖于有足够的空间来在开发阶段定义合理的翻译。这对于较长的文本非常重要,特别是如果原始语言是英语,因为与其他语言相比,英语通常可以用更少的单词来表达事实。对于短文本,例如“Feld”(德语)和“field”(英语),或者用英语写成两个或多个单词的复合词,情况恰恰相反。

对于不需要翻译的纯技术文本(例如HTML标签或正则表达式),可以使用字符文字或字符串模板的文字内容。这些应该被标记为与使用编译指示的扩展程序检查的翻译无关

例如:

html_line = '<title>' && 'Some Title'(ttl) && '</title>'.

APPEND html_line TO html_body.
...

以上源代码显示了如何处理源代码中与翻译相关和与翻译无关的文本元素: 与翻译无关的技术文本被指定为字符文字。其他文本与文本符号相关联。如果添加的 CONCATENATE 语句不起任何作用(例如,SEPARATED BY),则最好使用链接运算符 &&,如此处所示,因为这会使源代码更清晰。

在消息中使用编号占位符

使用编号占位符 &1 - &4 而不是只有匿名占位符 & 。不同语言中插入单词的顺序可能不同。翻译者在翻译消息文本时可能需要改变替换文本的顺序。对于匿名占位符,这是不可能的。

错误的消息文本示例可能如下所示:

"In Tabelle & wurde der Eintrag & nicht gefunden"

如果此消息文本被翻译为:

"In table & the entry & was not found"

这不会造成任何问题。

如果此消息文本被翻译为:

The entry & was not found in table &

用英语登录时,MESSAGE 语句会产生不正确的文本。

好的习惯

以下消息文本纠正了错误示例:

In Tabelle &1 wurde der Eintrag &2 nicht gefunden

对于这两种翻译:

In table &1 the entry &2 was not found

The entry &2 was not found in table &1

以英语登录时,MESSAGE 语句将生成正确的文本。