我有一份报告,其中写了不同语言的翻译,但现在我将其移至一个我无权编写翻译的系统中。
这样,报告只能以英语运行:如果用户以另一种语言访问系统,则所有的文本符号均不起作用。
考虑到这一点,是否可以在load-of-program
事件中编写一些内容以检查翻译是否存在,如果不存在,请将SY-LANGU
设置为英语?
现在,我有一个简单的if sy-langu <> 'E'. sy-langu = 'E'. endif.
(英语中的“ E”)
它可以正常工作,但是无论如何,我仍然希望有一种方法来找出是否有翻译,然后将其设置为英语。
答案 0 :(得分:5)
文本符号是Text Elements的一部分,它们是程序的多语言文本池的一部分。
1)使用READ TEXTPOOL
获取另一种语言的文本元素:
“ READ TEXTPOOL 。该语句从存储库中读取lang中指定语言的文本池和prog中指定的程序的文本元素,并将它们放入内部表itab中。”
data itab type standard table of textpool.
READ TEXTPOOL prog INTO itab LANGUAGE lang.
2)使用辅助语言或使用SET LANGUAGE
来更改文本元素的语言,如ABAP documentation中所述:
“当程序加载到内部会话中时,默认情况下将导入登录语言的文本池的文本元素。如果该文本池不存在,则 {{3} } 在AS ABAP中使用。如果这些文本池都不存在,则将加载没有文本元素的空文本池。“
“执行程序时,可以使用语句 secondary language 加载其他语言的文本池。”
如果使用辅助语言不令人满意,请使用以下代码:
LOAD-OF-PROGRAM.
constants lc_english type sylangu value `E`.
data lt_text_symbols type standard table of textpool.
read textpool sy-repid into lt_text_symbols language sy-langu.
if sy-subrc <> 0.
SET LANGUAGE lc_english.
endif.
PS:
RZ11
(辅助语言zcsa/second_language
)查看配置文件参数。习惯使用if sy-subrc <> 0
而不是if lines( lt_text_symbols ) = 0.
,因为在其他情况下,如果lt_text_symbols
包含在READ TEXTPOOL
之前的内容,则如果没有,则不会清除其内容所需语言的文本库。
在LOAD-OF-PROGRAM
事件内部,更喜欢使用sy-repid
而不是sy-cprog
,尽管从技术上讲,它们此时包含相同的内容,因为后者具有另一个SET LANGUAGE:
“在外部调用的过程中,为调用程序的名称;否则为当前程序的名称。如果外部调用的过程在调用另一个外部过程,则sy-cprog包含主程序的名称,并且未设置为后续调用程序的主程序的名称。”
请勿更改sy-langu
的值,直接更改meaning:
“它们只能用于读取”
如果要更改sy-langu
,请使用System Fields。它还有其他作用,请仔细阅读文档。 不要将与SET LANGUAGE混淆。