背景:
在海外项目开发中,因为涉及多语言,翻译是很常见的一个需求,往往我们需要手工去翻译大量的自建表,数据元素,域,域值,结构,消息类等等一系列开发对象,这个过程很无聊也很费时,SAP又没有提供批量翻译的入口,只能在各自的开发界面,或者SE63去针对单个对象挨个翻译,所以懒惰促使我不得不开发一个批量翻译的工具,兼容ECC版本,可以在统一入口来批量维护。
2024.08.28更新:追加调用翻译API自动翻译功能,见下文。
2024.09.11更新:修复了批量保存时某些类型无法保存成功的bug,源码已更新。
2024.09.29更新:修复了选择条件输入上限时查询失败的bug,源码已更新。
2024.11.11更新:S4高版本调用'LXE_OBJ_TEXT_PAIR_READ_'函数时会多一个源语言o_r3_lang参数,不传入会引发dump,源码已更新。
2024.11.15更新:针对于ECC和S4版本之间参数差异的部分,代码已做兼容处理,直接可用无需调整,源码已更新。
2025.01.09更新:因为近期在做RAP的开发,CDS相关的描述也需要翻译,追加了CDS View + CDS Metadata Extensions的翻译,源码已更新。
程序界面:
作为开发的第一个版本,主要包括以下功能,后续根据实际需求再优化或者追加一些功能吧:
- 表翻译:表标题描述翻译、表中内置类型字段翻译。
- 视图:视图标题翻译。
- 结构:结构标题描述翻译,结构中内置类型字段翻译。
- 数据元素:数据元素描述翻译、数据元素长/中/短/标题描述翻译。
- 域:域描述翻译、域值翻译。
- 程序:程序标题翻译、程序屏幕标题翻译、程序屏幕内容翻译(菜单、GUI状态的翻译被注释掉了,有需要放开对应代码即可)。
- 函数组:函数组中所有函数描述翻译、函数参数翻译。
- 事务代码:事务代码描述翻译。
- 消息类:消息类描述翻译。
- 自动翻译:调用翻译API进行自动翻译。
- 请求传输:可将选中的数据包含到指定请求中,方便传输,无需跳转SLXT。
执行效果示例:
翻译步骤:
- 可以使用ALV标准下载功能下载至EXCEL,也可以直接在ALV中编辑;
- 在本地EXCEL中批量翻译好之后,点击ALV界面导入按钮①,全选后点击按钮②,即可保存翻译,黄灯代表已翻译,但与SAP标准建议翻译不一致,红灯代表尚未翻译或翻译失败,绿灯代表与SAP标准建议翻译一致;
- 选中需要传输的数据,点击按钮③即可将数据保存至指定请求中。
- 如需调用翻译API,则选中数据后,点击按钮④,选中需要使用的API,即可进行翻译,目前我只做了调用腾讯的机器翻译,后续有需求了再考虑追加实现其他翻译API。
代码部署注意点:
ECC和S4的参数差异源码已做调整,只需要创建GUI STATUS和GUI TITLE即可。
1.代码复制后需要创建GUI TITLE以及GUI STATUS:
2.如果需要翻译本程序未提供的翻译对象时,直接在翻译函数中打断点,查看前台是如何传参的,所有的前台翻译保存都会经过本代码中使用的函数,很多情况保存前要再次调用对应的READ函数,填充一些全局变量,代码中对此已经进行了处理。
翻译API的实现:
大概看过一些国内的API,每个月免费额度相对来说比较大的就是腾讯翻译还有小牛翻译,看了下小牛翻译是把翻译内容经过URL Encode后直接放在URL中的,相对来说不够安全,腾讯翻译使用的V3签名方法会更加安全,但也更加复杂,官方文档只提供了JAVA等常见的代码示例,ABAP端的代码主要是计算签名的时候花了点时间,查了些资料最终使用ABAP代码进行加密算法来生成相应的签名。
使用翻译API的步骤,以腾讯翻译为例:
1.机器翻译-文档中心-腾讯云 (tencent.com),参考快速入门指南完成开发者账号注册,记得保存好API密钥信息。
2.创建翻译术语库,这样对一些特殊术语可以按照自己指定的术语进行翻译,术语库ID会在调用API时传入,支持双向翻译。
3.查看签名生成过程:
4.参照提供的JAVA示例,将其转换为相应的ABAP代码:
术语库效果示例:
翻译前:
翻译后:
完整源码:
翻译API Key、API ID、术语库ID已做掩码处理,替换为自己的即可。
*&---------------------------------------------------------------------*
*& Report ZMULTIPLE_TRANSLATION
*&---------------------------------------------------------------------*
*& Author:DeveloprMrMeng
*& Usage :Used to translate common development objects
*& Date :2024.07.15
*&---------------------------------------------------------------------*
REPORT zmultiple_translation.
TABLES:tfdir.
*----------------------------------------------------------------------*
* Types Defination
*----------------------------------------------------------------------*
TYPES:
* Selection screen
BEGIN OF ty_screen,
package TYPE tdevc-devclass, "Package
author TYPE tadir-author, "Author
s_langu TYPE lxe_log-targlng, "Source Language
t_langu TYPE lxe_log-targlng, "Target Language
table TYPE rsrd1-tbma_val, "Table
structure TYPE rsrd1-stru_val, "Sturcture
data_element TYPE rsrd1-drma_val, "Data element
domain TYPE rsrd1-doma_val, "Domain
view TYPE rsrd1-vima_val, "View
cds TYPE rsrd1-ddtype_val, "CDS Data Source
cds_meta_ext TYPE rsrd1-ddtype_val, "CDS Metadata Extensions
program TYPE reposrc-progname, "Program
function_grp TYPE tlibg-area, "Function Group
function TYPE tfdir-funcname, "Fucntion
transaction TYPE tstc-tcode, "Transaction
message_class TYPE t100-arbgb, "Message class
message_no TYPE t100-msgnr, "Message number
END OF ty_screen,
BEGIN OF ty_tadir,
pgmid TYPE tadir-pgmid, "Program ID
object TYPE tadir-object, "Object Type
obj_name TYPE tadir-obj_name, "Object Name
srcsystem TYPE tadir-srcsystem, "Original System
author TYPE tadir-author, "Author
devclass TYPE tadir-devclass, "Package
END OF ty_tadir,
tt_tadir TYPE STANDARD TABLE OF ty_tadir,
BEGIN OF ty_fungrp,
fungrp TYPE tfdir-pname, "Function group
END OF ty_fungrp,
tt_fungrp TYPE STANDARD TABLE OF ty_fungrp,
BEGIN OF ty_tfdir,
funcname TYPE tfdir-funcname, "Function name
pname TYPE tfdir-pname, "Fucntion group full name
include TYPE tfdir-include, "index
END OF ty_tfdir,
tt_tfdir TYPE SORTED TABLE OF ty_tfdir
WITH UNIQUE KEY pname funcname,
BEGIN OF ty_d020s,
prog TYPE d020s-prog, "Program name
dnum TYPE d020s-dnum, "Screen number
END OF ty_d020s,
tt_d020s TYPE STANDARD TABLE OF ty_d020s
WITH NON-UNIQUE SORTED KEY prog COMPONENTS prog,
BEGIN OF ty_read_para,
objtype TYPE lxeobjtype, "Object type
objname TYPE lxeobjname, "Object name
END OF ty_read_para,
tt_read_para TYPE STANDARD TABLE OF ty_read_para,
BEGIN OF ty_func_para,
funcname TYPE fupararef-funcname,
r3state TYPE fupararef-r3state,
parameter TYPE fupararef-parameter,
paramtype TYPE fupararef-paramtype,
END OF ty_func_para,
tt_func_para TYPE STANDARD TABLE OF ty_func_para,
ty_translate TYPE string,
tt_translate TYPE STANDARD TABLE OF ty_translate,
ty_attobt TYPE lxe_attobt, "Translation object type description
tt_attobt TYPE SORTED TABLE OF ty_attobt
WITH UNIQUE KEY lang obj_type,
ty_lxe_log TYPE lxe_log, "Translation log
tt_lxe_log TYPE STANDARD TABLE OF ty_lxe_log,
ty_t100 TYPE t100, "Message
tt_t100 TYPE SORTED TABLE OF ty_t100
WITH UNIQUE KEY sprsl arbgb msgnr,
BEGIN OF ty_alv,
obj_type TYPE lxe_attobt-obj_type, "Object Type
ktext TYPE lxe_attobt-ktext, "Object Type Description
objname TYPE lxeobjname, "Object name
textkey TYPE lxe_pcx_s1-textkey, "Text key
icon TYPE icon_d, "Icon
s_text TYPE lxe_pcx_s1-s_text, "Source text
t_text TYPE lxe_pcx_s1-t_text, "Target text
sap_text TYPE lxe_pcx_s1-t_text, "Translation of SAP recommendations
texttype TYPE lxe_pcx_s1-texttype, "Text type
devclass TYPE tadir-devclass, "Package
author TYPE tadir-author, "Author
unitmlt TYPE lxe_pcx_s1-unitmlt, "Maximum Length of Translation Unit
uppcase TYPE lxe_pcx_s1-uppcase, "Only Uppercase Allowed
cbox TYPE cbox, "CheckBox
style TYPE lvc_t_styl,
color TYPE lvc_t_scol,
END OF ty_alv,
tt_alv TYPE STANDARD TABLE OF ty_alv
WITH NON-UNIQUE SORTED KEY cbox COMPONENTS cbox
WITH NON-UNIQUE SORTED KEY grp COMPONENTS obj_type ktext objname.
CONSTANTS:
gc_custmnr TYPE lxecustmnr VALUE cl_lxe_constants=>c_trl_area_local.
*&---------------------------------------------------------------------*
*& Global Pramaters Defination
*&---------------------------------------------------------------------*
DATA:
gs_screen TYPE ty_screen,
gt_tfdir TYPE tt_tfdir,
gt_alv TYPE tt_alv,
gt_attobt TYPE tt_attobt,
gt_d020s TYPE tt_d020s,
gt_t100 TYPE tt_t100,
gv_t_spras TYPE spras,
gv_s_spras TYPE spras,
gt_translate_s TYPE tt_translate,
gt_translate_t TYPE tt_translate.
FIELD-SYMBOLS:
<gs_alv> TYPE ty_alv.
DATA:
gt_r_object TYPE RANGE OF tadir-object,
gs_r_object LIKE LINE OF gt_r_object,
gt_r_obj_name TYPE RANGE OF tadir-obj_name,
gs_r_obj_name LIKE LINE OF gt_r_obj_name.
CONSTANTS:
gc_tencent_secret_id TYPE string VALUE 'AKIDTpyve***********************',
gc_tencent_secret_key TYPE string VALUE 'xkO8kQ2GL***********************',
gc_tencent_term_zh_en TYPE string VALUE 'ec23c76fa***********************'.
*&---------------------------------------------------------------------*
*& Selection Screen Defination
*&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK mode WITH FRAME TITLE gv_desc0.
PARAMETERS:
p_tabl AS CHECKBOX DEFAULT '' USER-COMMAND tabl,
p_view AS CHECKBOX DEFAULT '' USER-COMMAND view,
p_cds AS CHECKBOX DEFAULT '' USER-COMMAND ddls,
p_stru AS CHECKBOX DEFAULT '' USER-COMMAND stru,
p_dtel AS CHECKBOX DEFAULT '' USER-COMMAND dtel,
p_doma AS CHECKBOX DEFAULT '' USER-COMMAND doma,
p_prog AS CHECKBOX DEFAULT '' USER-COMMAND prog,
p_fugr AS CHECKBOX DEFAULT '' USER-COMMAND fugr,
p_tran AS CHECKBOX DEFAULT '' USER-COMMAND tran,
p_mess AS CHECKBOX DEFAULT '' USER-COMMAND mess.
SELECTION-SCREEN END OF BLOCK mode.
SELECTION-SCREEN BEGIN OF BLOCK tra WITH FRAME TITLE gv_desc1.
PARAMETERS:
p_sour TYPE ty_screen-s_langu,
p_targ TYPE ty_screen-t_langu.
SELECTION-SCREEN END OF BLOCK tra.
SELECTION-SCREEN BEGIN OF BLOCK opt WITH FRAME TITLE gv_desc2.
SELECT-OPTIONS:
s_pack FOR gs_screen-package,
s_auth FOR gs_screen-author.
SELECTION-SCREEN END OF BLOCK opt.
SELECTION-SCREEN BEGIN OF BLOCK ddic WITH FRAME TITLE gv_desc3.
SELECT-OPTIONS:
s_tabl FOR gs_screen-table MODIF ID tab,
s_view FOR gs_screen-view MODIF ID vie,
s_cds FOR gs_screen-cds MODIF ID cds,
s_cdsme FOR gs_screen-cds_meta_ext MODIF ID cds,
s_stru FOR gs_screen-structure MODIF ID str,
s_dtel FOR gs_screen-data_element MODIF ID dte,
s_doma FOR gs_screen-domain MODIF ID dom.
SELECTION-SCREEN END OF BLOCK ddic.
SELECTION-SCREEN BEGIN OF BLOCK prog WITH FRAME TITLE gv_desc4.
SELECT-OPTIONS:
s_prog FOR gs_screen-program MODIF ID pro.
SELECTION-SCREEN END OF BLOCK prog.
SELECTION-SCREEN BEGIN OF BLOCK func WITH FRAME TITLE gv_desc5.
SELECT-OPTIONS:
s_fugr FOR gs_screen-function_grp MODIF ID fug.
SELECTION-SCREEN END OF BLOCK func.
SELECTION-SCREEN BEGIN OF BLOCK trsc WITH FRAME TITLE gv_desc6.
SELECT-OPTIONS:
s_tran FOR gs_screen-transaction MODIF ID tra.
SELECTION-SCREEN END OF BLOCK trsc.
SELECTION-SCREEN BEGIN OF BLOCK mess WITH FRAME TITLE gv_desc7.
SELECT-OPTIONS:
s_mscl FOR gs_screen-message_class MODIF ID mes,
s_msno FOR gs_screen-message_no MODIF ID mes.
SELECTION-SCREEN END OF BLOCK mess.
PARAMETERS:
p_only AS CHECKBOX DEFAULT 'X'.
*&---------------------------------------------------------------------*
*& INITIALIZATION
*&---------------------------------------------------------------------*
INITIALIZATION.
* Initial some paramaters
PERFORM frm_initial.
*&---------------------------------------------------------------------*
*& SELECTION-SCREEN OUTPUT
*&---------------------------------------------------------------------*
AT SELECTION-SCREEN OUTPUT.
* Update screen defore screen output
PERFORM frm_update_screen.
*&---------------------------------------------------------------------*
*& SELECTION-SCREEN Search Help
*&---------------------------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_sour.
PERFORM frm_f4_for_language USING 'P_SOUR' CHANGING p_sour.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_targ.
PERFORM frm_f4_for_language USING 'P_TARG' CHANGING p_targ.
*&---------------------------------------------------------------------*
*& START-OF-SELECTION
*&---------------------------------------------------------------------*
START-OF-SELECTION.
* Process Start
PERFORM frm_start_process.
*&---------------------------------------------------------------------*
*& Form FRM_INITIAL
*&---------------------------------------------------------------------*
*& Initial some paramaters
*&---------------------------------------------------------------------*
FORM frm_initial .
gv_desc0 = 'Translation Scope'(000).
gv_desc1 = 'Translation Mode'(001).
gv_desc2 = 'Default Condition'(002).
gv_desc3 = 'DDIC Condition'(003).
gv_desc4 = 'Program Condition'(004).
gv_desc5 = 'Function Condition'(005).
gv_desc6 = 'Transaction Condition'(006).
gv_desc7 = 'Message Condition'(007).
%_p_tabl_%_app_%-text = 'Table'(008).
%_p_stru_%_app_%-text = 'Structure'(009).
%_p_dtel_%_app_%-text = 'Data Element'(010).
%_p_doma_%_app_%-text = 'Domain'(011).
%_p_view_%_app_%-text = 'View'(012).
%_p_cds_%_app_%-text = 'CDS'(032).
%_p_prog_%_app_%-text = 'Program'(013).
%_p_fugr_%_app_%-text = 'Function Group'(014).
%_p_tran_%_app_%-text = 'Transaction'(015).
%_p_mess_%_app_%-text = 'Message'(016).
%_p_sour_%_app_%-text = 'Source Language'(017).
%_p_targ_%_app_%-text = 'Target Language'(018).
%_s_pack_%_app_%-text = 'Package'(019).
%_s_auth_%_app_%-text = 'Author'(020).
%_s_tabl_%_app_%-text = 'Table Name'(021).
%_s_view_%_app_%-text = 'View Name'(022).
%_s_cds_%_app_%-text = 'CDS Name'(033).
%_s_cdsme_%_app_%-text = 'CDS Metadata Extensions'(034).
%_s_stru_%_app_%-text = 'Structure Name'(023).
%_s_dtel_%_app_%-text = 'Data Element Name'(024).
%_s_doma_%_app_%-text = 'Domain Name'(025).
%_s_prog_%_app_%-text = 'Program Name'(026).
%_s_fugr_%_app_%-text = 'Function Group Name'(027).
%_s_tran_%_app_%-text = 'Transaction Code'(028).
%_s_mscl_%_app_%-text = 'Message Class'(029).
%_s_msno_%_app_%-text = 'Message Number'(030).
%_p_only_%_app_%-text = 'Untranslated only'(031).
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_UPDATE_SCREEN
*&---------------------------------------------------------------------*
*& Update screen defore screen output
*&---------------------------------------------------------------------*
FORM frm_update_screen .
LOOP AT SCREEN.
IF screen-name = 'S_PACK-LOW' OR screen-name = 'P_SOUR' OR screen-name = 'P_TARG'.
screen-required = '2'.
ENDIF.
IF p_tabl = ''.
IF screen-group1 = 'TAB'.
screen-active = 0.
ENDIF.
ENDIF.
IF p_stru = ''.
IF screen-group1 = 'STR'.
screen-active = 0.
ENDIF.
ENDIF.
IF p_dtel = ''.
IF screen-group1 = 'DTE'.
screen-active = 0.
ENDIF.
ENDIF.
IF p_doma = ''.
IF screen-group1 = 'DOM'.
screen-active = 0.
ENDIF.
ENDIF.
IF p_view = ''.
IF screen-group1 = 'VIE'.
screen-active = 0.
ENDIF.
ENDIF.
IF p_cds = ''.
IF screen-group1 = 'CDS'.
screen-active = 0.
ENDIF.
ENDIF.
IF p_prog = ''.
IF screen-group1 = 'PRO'.
screen-active = 0.
ENDIF.
ENDIF.
IF p_fugr = ''.
IF screen-group1 = 'FUG'.
screen-active = 0.
ENDIF.
ENDIF.
IF p_tran = ''.
IF screen-group1 = 'TRA'.
screen-active = 0.
ENDIF.
ENDIF.
IF p_mess = ''.
IF screen-group1 = 'MES'.
screen-active = 0.
ENDIF.
ENDIF.
MODIFY SCREEN.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_START_PROCESS
*&---------------------------------------------------------------------*
*& Process Start
*&---------------------------------------------------------------------*
FORM frm_start_process .
* Check input
PERFORM frm_check_input.
* Get translation objects
PERFORM frm_get_object.
* Show result as ALV
PERFORM frm_display_alv.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CHECK_INPUT
*&---------------------------------------------------------------------*
*& Check input
*&---------------------------------------------------------------------*
FORM frm_check_input .
IF p_tabl IS INITIAL AND
p_view IS INITIAL AND
p_cds IS INITIAL AND
p_stru IS INITIAL AND
p_dtel IS INITIAL AND
p_doma IS INITIAL AND
p_prog IS INITIAL AND
p_fugr IS INITIAL AND
p_tran IS INITIAL AND
p_mess IS INITIAL.
MESSAGE 'Please select at least one transaction scope!'(m01) TYPE 'S' DISPLAY LIKE 'E'.
LEAVE LIST-PROCESSING.
ENDIF.
IF s_pack IS INITIAL.
* Fill out all required entry fields
MESSAGE s055(00) DISPLAY LIKE 'E'.
LEAVE LIST-PROCESSING.
ENDIF.
LOOP AT s_pack.
IF ( s_pack-low+0(1) <> 'Z' AND s_pack-low+0(1) <> 'Y' AND s_pack-low IS NOT INITIAL AND s_pack-low <> '$TMP' ) OR
( s_pack-high+0(1) <> 'Z' AND s_pack-high+0(1) <> 'Y' AND s_pack-high IS NOT INITIAL AND s_pack-high <> '$TMP' ).
MESSAGE 'You can select only objects in the custom namespace'(m02) TYPE 'S' DISPLAY LIKE 'E'.
LEAVE LIST-PROCESSING.
ENDIF.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_GET_OBJECT
*&---------------------------------------------------------------------*
*& Get translation objects
*&---------------------------------------------------------------------*
FORM frm_get_object .
* Build select condtion scope
PERFORM frm_build_scope_cond.
* Get tranlation list
PERFORM frm_get_list.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DISPLAY_ALV
*&---------------------------------------------------------------------*
*& Show result as ALV
*&---------------------------------------------------------------------*
FORM frm_display_alv .
DATA:
ls_layout TYPE lvc_s_layo,
lt_fieldcat TYPE lvc_t_fcat,
ls_fieldcat TYPE lvc_s_fcat,
lt_event_exit TYPE slis_t_event_exit,
ls_event_exit TYPE slis_event_exit.
* Set Layout
ls_layout-zebra = 'X'. "Alternating line color
ls_layout-sel_mode = 'C'. "SelectionMode
ls_layout-cwidth_opt = 'X'. "Optimize column width
ls_layout-box_fname = 'CBOX'. "Field name of internal table field
ls_layout-stylefname = 'STYLE'. "Field name of internal table field
ls_layout-ctab_fname = 'COLOR'. "Field name with complex cell color coding
* Set fieldcat
ls_fieldcat-fieldname = 'OBJ_TYPE'.
ls_fieldcat-scrtext_l = 'Translation Object Type'(f02).
APPEND ls_fieldcat TO lt_fieldcat.
CLEAR ls_fieldcat.
ls_fieldcat-fieldname = 'KTEXT'.
ls_fieldcat-scrtext_l = 'Object Type Description'(f03).
APPEND ls_fieldcat TO lt_fieldcat.
CLEAR ls_fieldcat.
ls_fieldcat-fieldname = 'OBJNAME'.
ls_fieldcat-scrtext_l = 'Object Name'(f04).
APPEND ls_fieldcat TO lt_fieldcat.
CLEAR ls_fieldcat.
ls_fieldcat-fieldname = 'TEXTKEY'.
ls_fieldcat-scrtext_l = 'Text Key'(f05).
APPEND ls_fieldcat TO lt_fieldcat.
CLEAR ls_fieldcat.
ls_fieldcat-fieldname = 'ICON'.
ls_fieldcat-just = 'C'.
ls_fieldcat-scrtext_l = 'Status'(f08).
APPEND ls_fieldcat TO lt_fieldcat.
CLEAR ls_fieldcat.
ls_fieldcat-fieldname = 'S_TEXT'.
ls_fieldcat-scrtext_l = 'Source Text'(f06).
APPEND ls_fieldcat TO lt_fieldcat.
CLEAR ls_fieldcat.
ls_fieldcat-fieldname = 'T_TEXT'.
ls_fieldcat-edit = 'X'.
ls_fieldcat-lowercase = 'X'.
ls_fieldcat-outputlen = 255.
ls_fieldcat-intlen = 255.
ls_fieldcat-dd_outlen = 255.
ls_fieldcat-scrtext_l = 'Target Text'(f07).
APPEND ls_fieldcat TO lt_fieldcat.
CLEAR ls_fieldcat.
ls_fieldcat-fieldname = 'SAP_TEXT'.
ls_fieldcat-scrtext_l = 'SAP recommendations'(f09).
APPEND ls_fieldcat TO lt_fieldcat.
CLEAR ls_fieldcat.
ls_fieldcat-fieldname = 'TEXTTYPE'.
ls_fieldcat-scrtext_l = 'Text Type'(f10).
APPEND ls_fieldcat TO lt_fieldcat.
CLEAR ls_fieldcat.
ls_fieldcat-fieldname = 'DEVCLASS'.
ls_fieldcat-scrtext_l = 'Package'(f11).
APPEND ls_fieldcat TO lt_fieldcat.
CLEAR ls_fieldcat.
ls_fieldcat-fieldname = 'AUTHOR'.
ls_fieldcat-scrtext_l = 'Author'(f12).
APPEND ls_fieldcat TO lt_fieldcat.
CLEAR ls_fieldcat.
* Show ALV
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = sy-repid
i_callback_pf_status_set = 'FRM_STATUS_SET'
i_callback_user_command = 'FRM_USER_COMMAND'
is_layout_lvc = ls_layout
it_fieldcat_lvc = lt_fieldcat
it_event_exit = lt_event_exit
i_save = 'A'
TABLES
t_outtab = gt_alv
EXCEPTIONS
program_error = 1
OTHERS = 2.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_BUILD_SCOPE_COND
*&---------------------------------------------------------------------*
*& Build select condtion scope
*&---------------------------------------------------------------------*
FORM frm_build_scope_cond .
gs_r_object-sign = 'I'.
gs_r_object-option = 'EQ'.
IF p_tabl = abap_on OR p_stru = abap_on.
gs_r_object-low = 'TABL'.
APPEND gs_r_object TO gt_r_object.
ENDIF.
IF p_view = abap_on.
gs_r_object-low = 'VIEW'.
APPEND gs_r_object TO gt_r_object.
ENDIF.
IF p_cds = abap_on.
gs_r_object-low = 'DDLS'.
APPEND gs_r_object TO gt_r_object.
gs_r_object-low = 'DDLX'.
APPEND gs_r_object TO gt_r_object.
ENDIF.
IF p_dtel = abap_on.
gs_r_object-low = 'DTEL'.
APPEND gs_r_object TO gt_r_object.
ENDIF.
IF p_doma = abap_on.
gs_r_object-low = 'DOMA'.
APPEND gs_r_object TO gt_r_object.
ENDIF.
IF p_prog = abap_on.
gs_r_object-low = 'PROG'.
APPEND gs_r_object TO gt_r_object.
ENDIF.
IF p_fugr = abap_on.
gs_r_object-low = 'FUGR'.
APPEND gs_r_object TO gt_r_object.
ENDIF.
IF p_tran = abap_on.
gs_r_object-low = 'TRAN'.
APPEND gs_r_object TO gt_r_object.
ENDIF.
IF p_mess = abap_on.
gs_r_object-low = 'MSAG'.
APPEND gs_r_object TO gt_r_object.
ENDIF.
* Fill object name table
PERFORM frm_fill_obj_name_tab USING s_tabl[].
PERFORM frm_fill_obj_name_tab USING s_view[].
PERFORM frm_fill_obj_name_tab USING s_cds[].
PERFORM frm_fill_obj_name_tab USING s_stru[].
PERFORM frm_fill_obj_name_tab USING s_dtel[].
PERFORM frm_fill_obj_name_tab USING s_doma[].
PERFORM frm_fill_obj_name_tab USING s_prog[].
PERFORM frm_fill_obj_name_tab USING s_fugr[].
PERFORM frm_fill_obj_name_tab USING s_tran[].
PERFORM frm_fill_obj_name_tab USING s_mscl[].
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_GET_LIST
*&---------------------------------------------------------------------*
*& Get tranlation list
*&---------------------------------------------------------------------*
FORM frm_get_list .
DATA:
lt_tadir TYPE tt_tadir,
lt_tadir_copy TYPE tt_tadir,
ls_tadir TYPE ty_tadir,
lt_fungrp TYPE tt_fungrp,
ls_fungrp TYPE ty_fungrp,
lt_attobt TYPE tt_attobt,
ls_attobt TYPE ty_attobt,
ls_t100 TYPE ty_t100.
* Get SPRAS
SELECT SINGLE r3_lang INTO gv_s_spras FROM lxe_t002x WHERE language = p_sour.
SELECT SINGLE r3_lang INTO gv_t_spras FROM lxe_t002x WHERE language = p_targ.
* Get check list for transaction
SELECT pgmid
object
obj_name
srcsystem
author
devclass
INTO TABLE lt_tadir
FROM tadir
WHERE pgmid = 'R3TR'
AND object IN gt_r_object
AND obj_name IN gt_r_obj_name
AND devclass IN s_pack
AND author IN s_auth
AND delflag = ''.
* If checked Function Group,get function list also.
IF p_fugr = abap_on.
LOOP AT lt_tadir INTO ls_tadir WHERE object = 'FUGR'.
ls_fungrp-fungrp = 'SAPL' && ls_tadir-obj_name.
COLLECT ls_fungrp INTO lt_fungrp.
CLEAR ls_fungrp.
ENDLOOP.
IF lt_fungrp IS NOT INITIAL.
* Get function list
SELECT funcname
pname
include
INTO TABLE gt_tfdir
FROM tfdir
FOR ALL ENTRIES IN lt_fungrp
WHERE pname = lt_fungrp-fungrp.
ENDIF.
ENDIF.
IF p_prog = abap_on.
lt_tadir_copy = lt_tadir.
DELETE lt_tadir_copy WHERE object <> 'PROG'.
IF lt_tadir_copy IS NOT INITIAL.
* Get program screen list
SELECT prog
dnum
INTO TABLE gt_d020s
FROM d020s
FOR ALL ENTRIES IN lt_tadir_copy
WHERE prog = lt_tadir_copy-obj_name.
ENDIF.
ENDIF.
IF p_mess = abap_on.
* Get message info
SELECT *
INTO TABLE gt_t100
FROM t100
WHERE sprsl = gv_s_spras
AND arbgb IN s_mscl
AND msgnr IN s_msno.
ENDIF.
* Get Texts for Object Attribute
SELECT *
INTO TABLE gt_attobt
FROM lxe_attobt
WHERE lang = sy-langu.
SORT lt_tadir BY object ASCENDING
obj_name ASCENDING.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
text = 'Data Processing...'(m07).
LOOP AT lt_tadir INTO ls_tadir.
* Get current translation info
PERFORM frm_obj_text_read USING ls_tadir.
ENDLOOP.
IF gt_alv IS INITIAL.
MESSAGE 'No data!'(m03) TYPE 'S'.
LEAVE LIST-PROCESSING.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_F4_FOR_LANGUAGE
*&---------------------------------------------------------------------*
*& F4 For Language
*&---------------------------------------------------------------------*
*& <-- CV_LANGUAGE Language
*&---------------------------------------------------------------------*
FORM frm_f4_for_language USING uv_fname CHANGING cv_language.
CALL FUNCTION 'LXE_T002_SELECT_LANGUAGE'
EXPORTING
dynpprog = sy-cprog
dynpnr = sy-dynnr
dynpfield = uv_fname
IMPORTING
language = cv_language
EXCEPTIONS
parameter_error = 1
no_values_found = 2
no_selection = 3
OTHERS = 4.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_OBJ_TEXT_READ
*&---------------------------------------------------------------------*
*& Get current translation info
*&---------------------------------------------------------------------*
*& --> US_TADIR
*&---------------------------------------------------------------------*
FORM frm_obj_text_read USING us_tadir TYPE ty_tadir.
DATA:
lt_read_para TYPE tt_read_para,
ls_read_para TYPE ty_read_para,
lt_alv TYPE tt_alv,
ls_alv TYPE ty_alv,
ls_color TYPE lvc_s_scol,
ls_tfdir TYPE ty_tfdir,
ls_attobt TYPE ty_attobt,
lv_fungrp TYPE tfdir-pname,
ls_d020s TYPE ty_d020s,
ls_t100 TYPE ty_t100,
lv_not_trans TYPE flag,
lv_ecc_flg TYPE flag.
DATA:
lt_pcx_s1 TYPE STANDARD TABLE OF lxe_pcx_s1,
ls_pcx_s1 TYPE lxe_pcx_s1,
lt_pcx_s2 TYPE STANDARD TABLE OF lxe_pcx_s2,
ls_pcx_s2 TYPE lxe_pcx_s2,
lv_domatyp TYPE lxedomatyp,
lv_domanam TYPE lxedomanam,
lv_pstatus TYPE lxestatprc,
lv_funcname TYPE rs38l_fnam.
CASE us_tadir-object.
* Table or Sturcture
WHEN 'TABL'.
ls_read_para-objtype = 'BEZD'. "Foreign Key
ls_read_para-objname = us_tadir-obj_name.
APPEND ls_read_para TO lt_read_para.
ls_read_para-objtype = 'TABT'. "Table and Built-in type description
ls_read_para-objname = us_tadir-obj_name.
APPEND ls_read_para TO lt_read_para.
* View
WHEN 'VIEW'.
ls_read_para-objtype = 'VIEW'.
ls_read_para-objname = us_tadir-obj_name. "View description
APPEND ls_read_para TO lt_read_para.
* CDS
WHEN 'DDLS'.
ls_read_para-objtype = 'DDLS'.
ls_read_para-objname = us_tadir-obj_name. "CDS View
APPEND ls_read_para TO lt_read_para.
* CDS Metadata Extensions
WHEN 'DDLX'.
ls_read_para-objtype = 'TLGS'.
ls_read_para-objname(4) = us_tadir-object.
ls_read_para-objname+4(40) = us_tadir-obj_name. "CDS Metadata Extensions
ls_read_para-objname+44 = '02'.
APPEND ls_read_para TO lt_read_para.
ls_read_para-objtype = 'TLGS'.
ls_read_para-objname(4) = us_tadir-object.
ls_read_para-objname+4(40) = us_tadir-obj_name. "CDS Metadata Extensions
ls_read_para-objname+44 = '06'.
APPEND ls_read_para TO lt_read_para.
* Data Element
WHEN 'DTEL'.
ls_read_para-objtype = 'DTEL'. "Data element and description
ls_read_para-objname = us_tadir-obj_name.
APPEND ls_read_para TO lt_read_para.
* Domain
WHEN 'DOMA'.
ls_read_para-objtype = 'DOMA'. "Domain description
ls_read_para-objname = us_tadir-obj_name.
APPEND ls_read_para TO lt_read_para.
ls_read_para-objtype = 'VALU'. "Domain value
ls_read_para-objname = us_tadir-obj_name.
APPEND ls_read_para TO lt_read_para.
* Program
WHEN 'PROG'.
ls_read_para-objtype = 'RPT4'. "Title
ls_read_para-objname = us_tadir-obj_name.
APPEND ls_read_para TO lt_read_para.
* ls_read_para-objtype = 'CA4'. "Menu
* ls_read_para-objname = us_tadir-obj_name.
* APPEND ls_read_para TO lt_read_para.
* ls_read_para-objtype = 'CAD4'. "GUI Status
* ls_read_para-objname = us_tadir-obj_name.
* APPEND ls_read_para TO lt_read_para.
LOOP AT gt_d020s INTO ls_d020s USING KEY prog WHERE prog = us_tadir-obj_name.
ls_read_para-objtype = 'SRH4'. "Screen title
CONCATENATE us_tadir-obj_name
ls_d020s-dnum
INTO ls_read_para-objname RESPECTING BLANKS. "Program name + Screen number
APPEND ls_read_para TO lt_read_para.
ls_read_para-objtype = 'SRT4'. "Screen texts
CONCATENATE us_tadir-obj_name
ls_d020s-dnum
INTO ls_read_para-objname RESPECTING BLANKS. "Program name + Screen number
APPEND ls_read_para TO lt_read_para.
ENDLOOP.
* Function Group
WHEN 'FUGR'.
ls_read_para-objtype = 'RPT1'. "Function group
ls_read_para-objname = us_tadir-obj_name.
APPEND ls_read_para TO lt_read_para.
lv_fungrp = 'SAPL' && us_tadir-obj_name.
LOOP AT gt_tfdir INTO ls_tfdir WHERE pname = lv_fungrp.
ls_read_para-objtype = 'FNC1'. "Function and parameters
CONCATENATE ls_tfdir-funcname
us_tadir-obj_name
INTO ls_read_para-objname RESPECTING BLANKS. "Function group + Function name
APPEND ls_read_para TO lt_read_para.
ENDLOOP.
* Transaction Code
WHEN 'TRAN'.
ls_read_para-objtype = 'TRAN'. "Transaction code
ls_read_para-objname = us_tadir-obj_name.
APPEND ls_read_para TO lt_read_para.
* Messages
WHEN 'MSAG'.
LOOP AT gt_t100 INTO ls_t100 WHERE arbgb = us_tadir-obj_name.
ls_read_para-objtype = 'MESS'. "Message
CONCATENATE ls_t100-arbgb
ls_t100-msgnr
INTO ls_read_para-objname RESPECTING BLANKS. "Message class + Message number
APPEND ls_read_para TO lt_read_para.
ENDLOOP.
WHEN OTHERS.
ENDCASE.
LOOP AT lt_read_para INTO ls_read_para.
* Get translation info
CALL FUNCTION 'LXE_OBJ_TEXT_PAIR_READ'
EXPORTING
t_lang = p_targ
s_lang = p_sour
custmnr = gc_custmnr
objtype = ls_read_para-objtype
objname = ls_read_para-objname
read_only = ''
IMPORTING
domatyp = lv_domatyp
domanam = lv_domanam
pstatus = lv_pstatus
TABLES
lt_pcx_s1 = lt_pcx_s1.
* Get best translation
lv_funcname = 'LXE_PP1_PROPOSALS_GET'.
CALL FUNCTION lv_funcname
EXPORTING
s_lang = p_sour
t_lang = p_targ
custmnr = gc_custmnr
objtype = ls_read_para-objtype
domatyp = lv_domatyp
domanam = lv_domanam
IMPORTING
pstatus = lv_pstatus
TABLES
t_pcx_s1 = lt_pcx_s1
t_pcx_s2 = lt_pcx_s2
lt_pcx_s1 = lt_pcx_s1
lt_pcx_s2 = lt_pcx_s2.
IF lt_pcx_s1 IS NOT INITIAL.
READ TABLE gt_attobt INTO ls_attobt
WITH KEY lang = sy-langu
obj_type = ls_read_para-objtype.
LOOP AT lt_pcx_s1 INTO ls_pcx_s1.
ls_alv-obj_type = ls_read_para-objtype. "Translation OType
ls_alv-ktext = ls_attobt-ktext. "Translation OType description
ls_alv-objname = ls_read_para-objname. "Object name
ls_alv-textkey = ls_pcx_s1-textkey. "Text key
ls_alv-s_text = ls_pcx_s1-s_text. "Source text
ls_alv-t_text = ls_pcx_s1-t_text. "Target text
ls_alv-unitmlt = ls_pcx_s1-unitmlt. "Maximum Length of Translation Unit
ls_alv-uppcase = ls_pcx_s1-uppcase. "Only Uppercase Allowed
ls_alv-devclass = us_tadir-devclass. "Package
ls_alv-author = us_tadir-author. "Author
READ TABLE lt_pcx_s2 INTO ls_pcx_s2
WITH KEY textkey = ls_pcx_s1-textkey.
IF sy-subrc = 0.
ls_alv-sap_text = ls_pcx_s2-best_prop. "Translation of SAP recommendations
ENDIF.
ls_alv-texttype = ls_pcx_s1-texttype. "Text type
IF ls_alv-t_text IS NOT INITIAL.
IF ls_alv-t_text = ls_alv-sap_text.
ls_alv-icon = icon_led_green. "Green
ELSE.
ls_alv-icon = icon_led_yellow. "Yellow
ENDIF.
ELSE.
ls_alv-icon = icon_led_red. "Red
ENDIF.
IF ls_alv-t_text IS INITIAL.
lv_not_trans = abap_true.
ENDIF.
APPEND ls_alv TO lt_alv.
CLEAR:ls_alv.
ENDLOOP.
* IF Untranslated only selected,Delete objects that are not translated at all
IF p_only = abap_on.
IF lv_not_trans = ''.
CLEAR lt_alv.
ENDIF.
ENDIF.
IF lt_alv IS NOT INITIAL.
APPEND LINES OF lt_alv TO gt_alv.
ENDIF.
CLEAR:
lt_alv,
lv_not_trans.
ENDIF.
CLEAR:
lt_pcx_s1,
ls_pcx_s1,
lt_pcx_s2,
ls_pcx_s2.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_STATUS_SET
*&---------------------------------------------------------------------*
*& Set GUI Status
*&---------------------------------------------------------------------*
*& --> RT_EXTAB Excluding Button
*&---------------------------------------------------------------------*
FORM frm_status_set USING rt_extab TYPE slis_t_extab.
DATA:
lv_title TYPE string.
SELECT SINGLE text
INTO lv_title
FROM trdirt
WHERE name = sy-repid
AND sprsl = sy-langu.
lv_title = lv_title && ` (` && p_sour && `->` && p_targ && `)`.
SET PF-STATUS 'STATUS'.
SET TITLEBAR 'TITLE' WITH lv_title.
ENDFORM. "FRM_STATUS_SET
*&---------------------------------------------------------------------*
*& Form FRM_USER_COMMAND
*&---------------------------------------------------------------------*
*& User Command
*&---------------------------------------------------------------------*
*& --> R_UCOMM User Command Code
*& --> RS_SELFIELD Filed Info
*&---------------------------------------------------------------------*
FORM frm_user_command USING r_ucomm LIKE sy-ucomm
rs_selfield TYPE slis_selfield.
DATA:
lo_grid TYPE REF TO cl_gui_alv_grid,
ls_stable TYPE lvc_s_stbl,
lv_valid TYPE char1,
ls_layout TYPE lvc_s_layo,
lv_refresh TYPE char1.
ls_stable-row = 'X'.
ls_stable-col = 'X'.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = lo_grid.
CALL METHOD lo_grid->check_changed_data
IMPORTING
e_valid = lv_valid
CHANGING
c_refresh = lv_refresh.
CASE r_ucomm.
WHEN 'UPLOAD'.
* Upload excel
PERFORM frm_process_upload.
WHEN 'TRANSPORT'.
* Transport object to TR
PERFORM frm_process_transport.
WHEN 'SAVE'.
* Save Change
PERFORM frm_process_save.
WHEN 'TRANSLATE'.
* Call translate API
PERFORM frm_process_translate.
WHEN OTHERS.
ENDCASE.
CALL METHOD lo_grid->get_frontend_layout
IMPORTING
es_layout = ls_layout.
ls_layout-cwidth_opt = 'X'.
CALL METHOD lo_grid->set_frontend_layout
EXPORTING
is_layout = ls_layout.
CALL METHOD lo_grid->refresh_table_display
EXPORTING
is_stable = ls_stable
EXCEPTIONS
finished = 1
OTHERS = 2.
ENDFORM. "FRM_USER_COMMAND
*&---------------------------------------------------------------------*
*& Form FRM_PROCESS_SAVE
*&---------------------------------------------------------------------*
*& Save Change
*&---------------------------------------------------------------------*
FORM frm_process_save .
DATA:
lt_pcx_s1 TYPE STANDARD TABLE OF lxe_pcx_s1,
lt_pcx_s1_read TYPE STANDARD TABLE OF lxe_pcx_s1,
ls_pcx_s1 TYPE lxe_pcx_s1,
lt_alv TYPE tt_alv,
ls_alv TYPE ty_alv,
lv_pstatus TYPE lxestatprc,
lv_objname TYPE lxeobjname,
lv_err_msg TYPE lxestring.
FIELD-SYMBOLS:
<ls_alv> TYPE ty_alv.
lt_alv = gt_alv.
DELETE lt_alv WHERE cbox = ''.
IF lt_alv IS INITIAL.
MESSAGE 'Please select any line and try again'(m08) TYPE 'S' DISPLAY LIKE 'E'.
RETURN.
ENDIF.
SORT lt_alv BY obj_type ASCENDING
ktext ASCENDING
objname ASCENDING.
DELETE ADJACENT DUPLICATES FROM lt_alv
COMPARING obj_type ktext objname.
LOOP AT lt_alv INTO ls_alv.
LOOP AT gt_alv ASSIGNING <gs_alv> USING KEY grp
WHERE obj_type = ls_alv-obj_type
AND ktext = ls_alv-ktext
AND objname = ls_alv-objname.
MOVE-CORRESPONDING <gs_alv> TO ls_pcx_s1.
APPEND ls_pcx_s1 TO lt_pcx_s1.
AT END OF objname.
* Initial some global variable
PERFORM frm_get_global_var USING <gs_alv>-obj_type <gs_alv>-objname.
* Write Translation Data
CALL FUNCTION 'LXE_OBJ_TEXT_PAIR_WRITE'
EXPORTING
t_lang = p_targ
s_lang = p_sour
custmnr = gc_custmnr
objtype = <gs_alv>-obj_type
objname = <gs_alv>-objname
* AUTODIST =
* RFC_COPY =
IMPORTING
pstatus = lv_pstatus
* err_msg = lv_err_msg
TABLES
lt_pcx_s1 = lt_pcx_s1.
IF lv_pstatus = 'S'.
LOOP AT gt_alv ASSIGNING <ls_alv> USING KEY grp
WHERE obj_type = <gs_alv>-obj_type
AND ktext = <gs_alv>-ktext
AND objname = <gs_alv>-objname.
IF <ls_alv>-t_text = <ls_alv>-sap_text.
<ls_alv>-icon = icon_led_green.
ELSE.
<ls_alv>-icon = icon_led_yellow.
ENDIF.
ENDLOOP.
ENDIF.
CLEAR:
lt_pcx_s1,
ls_pcx_s1,
lt_pcx_s1_read,
lv_pstatus,
lv_err_msg.
ENDAT.
ENDLOOP.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_PROCESS_UPLOAD
*&---------------------------------------------------------------------*
*& Upload excel
*&---------------------------------------------------------------------*
FORM frm_process_upload .
DATA:
lv_file TYPE rlgrap-filename,
lv_begin_row TYPE numc4 VALUE 2.
DATA:
lv_filename TYPE string,
lt_records TYPE solix_tab,
lv_headerxstring TYPE xstring,
lv_filelength TYPE i.
DATA:
lo_excel_ref TYPE REF TO cl_fdt_xl_spreadsheet,
lo_data_ref TYPE REF TO data.
DATA:
lt_worksheets TYPE STANDARD TABLE OF string,
ls_worksheets TYPE string.
FIELD-SYMBOLS:
<lt_data> TYPE STANDARD TABLE.
* Get file path
CALL FUNCTION 'F4_FILENAME'
IMPORTING
file_name = lv_file.
IF lv_file IS INITIAL.
MESSAGE 'Canceled upload!'(m04) TYPE 'S'.
RETURN.
ENDIF.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
text = 'Importing...'(m05).
lv_filename = lv_file.
* Uplaod file
CALL FUNCTION 'GUI_UPLOAD'
EXPORTING
filename = lv_filename
filetype = 'BIN'
IMPORTING
filelength = lv_filelength
header = lv_headerxstring
TABLES
data_tab = lt_records
EXCEPTIONS
file_open_error = 1
file_read_error = 2
no_batch = 3
gui_refuse_filetransfer = 4
invalid_type = 5
no_authority = 6
unknown_error = 7
bad_data_format = 8
header_not_allowed = 9
separator_not_allowed = 10
header_too_long = 11
unknown_dp_error = 12
access_denied = 13
dp_out_of_memory = 14
disk_full = 15
dp_timeout = 16
OTHERS = 17.
IF sy-subrc <> 0.
MESSAGE 'Please close excel and try again.'(m06) TYPE 'S'.
RETURN.
ENDIF.
* Convert binary to XString
CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
EXPORTING
input_length = lv_filelength
IMPORTING
buffer = lv_headerxstring
TABLES
binary_tab = lt_records
EXCEPTIONS
failed = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid
TYPE sy-msgty
NUMBER sy-msgno
WITH sy-msgv1
sy-msgv2
sy-msgv3
sy-msgv4.
RETURN.
ENDIF.
TRY.
CREATE OBJECT lo_excel_ref
EXPORTING
document_name = lv_filename
xdocument = lv_headerxstring.
CATCH cx_fdt_excel_core .
ENDTRY.
IF lo_excel_ref IS BOUND.
* Get sheet list
lo_excel_ref->if_fdt_doc_spreadsheet~get_worksheet_names(
IMPORTING
worksheet_names = lt_worksheets ).
IF lt_worksheets IS NOT INITIAL.
* Get data from first sheet
READ TABLE lt_worksheets INTO ls_worksheets INDEX 1.
lo_data_ref = lo_excel_ref->if_fdt_doc_spreadsheet~get_itab_from_worksheet( ls_worksheets ).
ASSIGN lo_data_ref->* TO <lt_data>.
CLEAR gt_alv.
* Convert to internal table
PERFORM frm_data_conv TABLES gt_alv
USING <lt_data>
lv_begin_row.
ENDIF.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DATA_CONV
*&---------------------------------------------------------------------*
* Convert to internal table
*----------------------------------------------------------------------*
* <--CT_TABLE ALV table
* -->UT_DATA Any table
* -->UV_BEGIN_ROW Begin row
*----------------------------------------------------------------------*
FORM frm_data_conv TABLES ct_table
USING ut_data TYPE STANDARD TABLE
uv_begin_row TYPE numc4.
DATA:lo_typedescr TYPE REF TO cl_abap_typedescr,
lo_structdescr TYPE REF TO cl_abap_structdescr,
lo_tabledescr TYPE REF TO cl_abap_tabledescr,
lo_result_ref TYPE REF TO data,
lo_newline_ref TYPE REF TO data.
DATA:lv_index TYPE i.
FIELD-SYMBOLS:
<ls_itab> TYPE data,
<ls_newline> TYPE data,
<ls_source_value> TYPE data,
<ls_target_value> TYPE data.
* Get result table type
CALL METHOD cl_abap_structdescr=>describe_by_data
EXPORTING
p_data = ct_table
RECEIVING
p_descr_ref = lo_typedescr.
lo_structdescr ?= lo_typedescr.
* Create work area refrence
CREATE DATA lo_newline_ref TYPE HANDLE lo_structdescr.
ASSIGN lo_newline_ref->* TO <ls_newline>.
* Data Mapping
LOOP AT ut_data ASSIGNING <ls_itab> FROM uv_begin_row.
DO.
ADD 1 TO lv_index.
ASSIGN COMPONENT lv_index OF STRUCTURE <ls_itab> TO <ls_source_value>.
ASSIGN COMPONENT lv_index OF STRUCTURE <ls_newline> TO <ls_target_value>.
IF <ls_source_value> IS ASSIGNED AND <ls_target_value> IS ASSIGNED.
<ls_target_value> = <ls_source_value>.
ELSE.
EXIT.
ENDIF.
UNASSIGN:
<ls_source_value>,
<ls_target_value>.
ENDDO.
IF <ls_newline> IS NOT INITIAL.
APPEND <ls_newline> TO ct_table.
ENDIF.
CLEAR:
<ls_newline>,
lv_index.
ENDLOOP.
IF ct_table[] IS INITIAL.
MESSAGE 'No data!'(m03) TYPE 'S'.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_PROCESS_TRANSPORT
*&---------------------------------------------------------------------*
*& Transport object to TR
*&---------------------------------------------------------------------*
FORM frm_process_transport .
DATA:
lt_lxe_log TYPE tt_lxe_log,
ls_lxe_log TYPE ty_lxe_log,
lt_alv TYPE tt_alv,
lv_has_err TYPE flag.
DATA:
ls_request TYPE trwbo_request_header.
DATA:
lv_pstatus TYPE lxestatprc,
lt_objlist TYPE STANDARD TABLE OF e071,
lt_keylist TYPE STANDARD TABLE OF e071k.
lt_alv = gt_alv.
DELETE lt_alv WHERE cbox = ''.
IF lt_alv IS INITIAL.
MESSAGE 'Please select any line and try again'(m08) TYPE 'S' DISPLAY LIKE 'E'.
RETURN.
ENDIF.
DELETE lt_alv WHERE t_text IS INITIAL.
IF lt_alv IS INITIAL.
MESSAGE 'The object is still untranslated and cannot be transferred'(m09) TYPE 'S' DISPLAY LIKE 'E'.
RETURN.
ENDIF.
READ TABLE lt_alv TRANSPORTING NO FIELDS WITH KEY devclass = '$TMP'.
IF sy-subrc = 0.
MESSAGE 'Local object cannot be transferred'(m10) TYPE 'S' DISPLAY LIKE 'E'.
RETURN.
ENDIF.
* Get translation log
SELECT *
INTO TABLE lt_lxe_log
FROM lxe_log
FOR ALL ENTRIES IN lt_alv
WHERE custmnr = gc_custmnr
AND targlng = p_targ
AND objtype = lt_alv-obj_type
AND objtype <> cl_lxe_constants=>c_objtype_dems
AND objname = lt_alv-objname
AND uname IN s_auth.
CHECK lt_lxe_log IS NOT INITIAL.
* Select or Create a TR
CALL FUNCTION 'TR_REQUEST_CHOICE'
EXPORTING
iv_request_types = 'TK'
IMPORTING
es_request = ls_request
EXCEPTIONS
invalid_request = 1
invalid_request_type = 2
user_not_owner = 3
no_objects_appended = 4
enqueue_error = 5
cancelled_by_user = 6
recursive_call = 7
OTHERS = 8.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid
TYPE 'S'
NUMBER sy-msgno
WITH sy-msgv1
sy-msgv2
sy-msgv3
sy-msgv4
DISPLAY LIKE 'E'.
RETURN.
ENDIF.
LOOP AT lt_lxe_log INTO ls_lxe_log.
CALL FUNCTION 'LXE_OBJ_CREATE_TRANSPORT_ENTRY'
EXPORTING
language = p_targ
custmnr = gc_custmnr
objtype = ls_lxe_log-objtype
objname = ls_lxe_log-objname
tabkey = ls_lxe_log-tabkey
* ADD_TADIR = ''
IMPORTING
* TADIR_OBJECT =
* TADIR_OBJ_NAME =
pstatus = lv_pstatus
TABLES
ex_e071 = lt_objlist
ex_e071k = lt_keylist.
IF lv_pstatus = 'S'.
CALL FUNCTION 'TR_REQUEST_CHOICE'
EXPORTING
iv_suppress_dialog = 'X'
iv_request_types = 'TK'
iv_request = ls_request-trkorr
it_e071 = lt_objlist
it_e071k = lt_keylist
iv_with_error_log = 'X'
iv_no_owner_check = 'X'
* IMPORTING
* ES_REQUEST =
EXCEPTIONS
invalid_request = 1
invalid_request_type = 2
user_not_owner = 3
no_objects_appended = 4
enqueue_error = 5
cancelled_by_user = 6
recursive_call = 7
OTHERS = 8.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid
TYPE 'S'
NUMBER sy-msgno
WITH sy-msgv1
sy-msgv2
sy-msgv3
sy-msgv4
DISPLAY LIKE 'E'.
RETURN.
ENDIF.
ENDIF.
ENDLOOP.
MESSAGE 'Successfully added to the request list'(m11) TYPE 'S'.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_PROCESS_TRANSLATE
*&---------------------------------------------------------------------*
*& Call translate API
*&---------------------------------------------------------------------*
FORM frm_process_translate .
DATA:
lt_alv TYPE tt_alv,
lv_err_msg TYPE lxestring,
ls_translate_s TYPE ty_translate,
ls_translate_t TYPE ty_translate.
DATA:
lt_spopli TYPE rsec_t_spopli,
ls_spopli TYPE spopli,
lv_answer TYPE char1.
FIELD-SYMBOLS:
<ls_alv> TYPE ty_alv.
lt_alv = gt_alv.
DELETE lt_alv WHERE cbox = ''.
IF lt_alv IS INITIAL.
MESSAGE 'Please select any line and try again'(m08) TYPE 'S' DISPLAY LIKE 'E'.
RETURN.
ENDIF.
* Collect the characters that need to be translated
CLEAR gt_translate_s.
LOOP AT gt_alv ASSIGNING <gs_alv> USING KEY cbox WHERE cbox = 'X'.
ls_translate_s = <gs_alv>-s_text.
COLLECT ls_translate_s INTO gt_translate_s.
CLEAR ls_translate_s.
ENDLOOP.
* Build translate API list
ls_spopli-selflag = '1'.
ls_spopli-varoption = 'Tencent Cloud Api'.
APPEND ls_spopli TO lt_spopli.
*--------------------------------------------------------------------*
* If you want to use other apis, you can add them by yourself
*--------------------------------------------------------------------*
* ls_spopli-selflag = '2'.
* ls_spopli-varoption = 'Your API'.
* APPEND ls_spopli TO lt_spopli.
*--------------------------------------------------------------------*
* Call decide list popup to choose API which you want
CALL FUNCTION 'POPUP_TO_DECIDE_LIST'
EXPORTING
start_row = 5
textline1 = 'Please select the translation API you want to use'(m12)
* TEXTLINE2 = ' '
* TEXTLINE3 = ' '
titel = ''
* DISPLAY_ONLY = ' '
IMPORTING
answer = lv_answer
TABLES
t_spopli = lt_spopli
EXCEPTIONS
not_enough_answers = 1
too_much_answers = 2
too_much_marks = 3
OTHERS = 4.
CASE lv_answer.
WHEN 'A'.
MESSAGE 'User cancelld'(m13) TYPE 'S'.
RETURN.
WHEN '1'.
* Call tencent translate API
PERFORM frm_call_tencent_translate.
WHEN ''.
* ...your api
WHEN OTHERS.
ENDCASE.
* Mapping result to target text
IF gt_translate_t IS NOT INITIAL.
LOOP AT gt_alv ASSIGNING <gs_alv> USING KEY cbox WHERE cbox = 'X'.
READ TABLE gt_translate_s INTO ls_translate_s
WITH KEY table_line = <gs_alv>-s_text.
READ TABLE gt_translate_t INTO ls_translate_t INDEX sy-tabix.
<gs_alv>-t_text = ls_translate_t.
ENDLOOP.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CALL_TENCENT_TRANSLATE
*&---------------------------------------------------------------------*
*& Call tencent translate API
*&---------------------------------------------------------------------*
FORM frm_call_tencent_translate .
DATA:
lv_service TYPE string VALUE 'tmt',
lv_host TYPE string VALUE 'tmt.tencentcloudapi.com',
lv_region TYPE string VALUE 'ap-shanghai',
lv_action TYPE string VALUE 'texttranslatebatch',
lv_version TYPE string VALUE '2018-03-21',
lv_algorithm TYPE string VALUE 'TC3-HMAC-SHA256',
lv_timestamp TYPE string,
lv_timestamp_utc TYPE timestamp,
lv_timestamp_utc_string TYPE string,
lv_date_utc TYPE datum,
lv_time_utc TYPE uzeit,
lv_date TYPE string,
lv_date_char TYPE char10,
lv_httprequestmethod TYPE string,
lv_canonicaluri TYPE string,
lv_canonicalquerystring TYPE string,
lv_canonicalheaders TYPE string,
lv_signedheaders TYPE string,
lv_payload TYPE string,
lv_hashedrequestpayload TYPE string,
lv_canonicalrequest TYPE string,
lv_credentialscope TYPE string,
lv_hashedcanonicalrequest TYPE string,
lv_stringtosign TYPE string,
lv_secretkey_tc3 TYPE string,
lv_secretkey_tc3_xstring TYPE xstring,
lv_secretdate_xstring TYPE xstring,
lv_secretdate_string TYPE string,
lv_secretservice_xstring TYPE xstring,
lv_secretservice_string TYPE string,
lv_secretsigning_xstring TYPE xstring,
lv_secretsigning_string TYPE string,
lv_signature_xstring TYPE xstring,
lv_signature_string TYPE string,
lv_authorization TYPE string,
lv_tencent_term_id TYPE string.
DATA:
lv_request_data TYPE string,
lv_responsex TYPE xstring,
lo_http_client TYPE REF TO if_http_client,
lv_url TYPE string,
lv_response TYPE string,
lv_msgtx TYPE string.
DATA:
lv_sourcelist_json TYPE string.
TRY.
* Get UTC timestamp
CALL METHOD cl_abap_tstmp=>systemtstmp_syst2utc
EXPORTING
syst_date = sy-datum
syst_time = sy-uzeit
IMPORTING
utc_tstmp = lv_timestamp_utc.
CATCH cx_parameter_invalid_range .
ENDTRY.
lv_timestamp_utc_string = lv_timestamp_utc.
lv_date_utc = lv_timestamp_utc_string+0(8).
lv_time_utc = lv_timestamp_utc_string+8(6).
* Time correction(If your system time is correct, you don't need correct it)
lv_time_utc = lv_time_utc - 13.
CALL METHOD cl_pco_utility=>convert_abap_timestamp_to_java
EXPORTING
iv_date = lv_date_utc
iv_time = lv_time_utc
iv_msec = 000
IMPORTING
ev_timestamp = lv_timestamp.
lv_timestamp = lv_timestamp / 1000.
* Format date to YYYY-MM-DD
WRITE lv_date_utc TO lv_date_char USING EDIT MASK '____-__-__'.
lv_date = lv_date_char.
CONDENSE lv_timestamp NO-GAPS.
* Get sourcelist JSON
PERFORM frm_get_sourcelist_json CHANGING lv_sourcelist_json.
* Get tencent term bank id
PERFORM frm_get_tencent_term_id CHANGING lv_tencent_term_id.
**********************************************************************
* STEP 1: Concatenate POST header info
**********************************************************************
lv_httprequestmethod = 'POST'.
lv_canonicaluri = '/'.
lv_canonicalquerystring = ''.
lv_canonicalheaders = 'content-type:application/json; charset=utf-8' && cl_abap_char_utilities=>cr_lf+1(1) &&
'host:' && lv_host && cl_abap_char_utilities=>cr_lf+1(1) &&
'x-tc-action:' && lv_action && cl_abap_char_utilities=>cr_lf+1(1).
lv_signedheaders = 'content-type;host;x-tc-action'.
lv_payload = '{"Source":"' && p_sour+0(2) &&
'","Target":"' && p_targ+0(2) &&
'","ProjectId":0,"SourceTextList":' && lv_sourcelist_json &&
',"TermRepoIDList":["' && lv_tencent_term_id && '"]}'.
* SHA-256 encrypt
PERFORM frm_digest_sha256hex USING lv_payload CHANGING lv_hashedrequestpayload.
lv_canonicalrequest = lv_httprequestmethod && cl_abap_char_utilities=>cr_lf+1(1) &&
lv_canonicaluri && cl_abap_char_utilities=>cr_lf+1(1) &&
lv_canonicalquerystring && cl_abap_char_utilities=>cr_lf+1(1) &&
lv_canonicalheaders && cl_abap_char_utilities=>cr_lf+1(1) &&
lv_signedheaders && cl_abap_char_utilities=>cr_lf+1(1) &&
lv_hashedrequestpayload.
**********************************************************************
* STEP 2: Concatenate the reception signature string
**********************************************************************
lv_credentialscope = lv_date && '/' && lv_service && '/' && 'tc3_request'.
* SHA-256 encrypt
PERFORM frm_digest_sha256hex USING lv_canonicalrequest CHANGING lv_hashedcanonicalrequest.
lv_stringtosign = lv_algorithm && cl_abap_char_utilities=>cr_lf+1(1) &&
lv_timestamp && cl_abap_char_utilities=>cr_lf+1(1) &&
lv_credentialscope && cl_abap_char_utilities=>cr_lf+1(1) &&
lv_hashedcanonicalrequest.
**********************************************************************
* STEP 3: Calculate signature
**********************************************************************
lv_secretkey_tc3 = 'TC3' && gc_tencent_secret_key.
CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
EXPORTING
text = lv_secretkey_tc3
* MIMETYPE = ' '
encoding = '4110'
IMPORTING
buffer = lv_secretkey_tc3_xstring
EXCEPTIONS
failed = 1
OTHERS = 2.
PERFORM frm_calculate_hmacsha256 USING lv_secretkey_tc3_xstring
lv_date
CHANGING lv_secretdate_string
lv_secretdate_xstring.
PERFORM frm_calculate_hmacsha256 USING lv_secretdate_xstring
lv_service
CHANGING lv_secretservice_string
lv_secretservice_xstring.
PERFORM frm_calculate_hmacsha256 USING lv_secretservice_xstring
'tc3_request'
CHANGING lv_secretsigning_string
lv_secretsigning_xstring.
PERFORM frm_calculate_hmacsha256 USING lv_secretsigning_xstring
lv_stringtosign
CHANGING lv_signature_string
lv_signature_xstring.
TRANSLATE lv_signature_string TO LOWER CASE.
CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
EXPORTING
text = lv_signature_string
* MIMETYPE = ' '
encoding = '4110'
IMPORTING
buffer = lv_signature_xstring
EXCEPTIONS
failed = 1
OTHERS = 2.
**********************************************************************
* STEP 4: Concatenate Authorization
**********************************************************************
lv_authorization = lv_algorithm && ` ` &&
'Credential=' && gc_tencent_secret_id && '/' &&
lv_credentialscope && `, ` &&
'SignedHeaders=' && lv_signedheaders && `, ` &&
'Signature=' && lv_signature_string.
**********************************************************************
* STEP 5: Call translation API begin
**********************************************************************
lv_url = 'https://tmt.tencentcloudapi.com' .
CALL METHOD cl_http_client=>create_by_url
EXPORTING
url = lv_url
IMPORTING
client = lo_http_client
EXCEPTIONS
argument_not_found = 1
plugin_not_active = 2
internal_error = 3
OTHERS = 4.
IF sy-subrc <> 0.
* Implement suitable error handling here
MESSAGE ID sy-msgid
TYPE sy-msgty
NUMBER sy-msgno
WITH sy-msgv1
sy-msgv2
sy-msgv3
sy-msgv4.
ENDIF.
* Set header
lo_http_client->request->set_header_field(
name = 'content-type'
value = 'application/json; charset=utf-8'
).
lo_http_client->request->set_header_field(
name = 'host'
value = 'tmt.tencentcloudapi.com'
).
lo_http_client->request->set_header_field(
name = 'x-tc-action'
value = 'TextTranslateBatch'
).
lo_http_client->request->set_header_field(
name = 'X-TC-Timestamp'
value = lv_timestamp
).
lo_http_client->request->set_header_field(
name = 'X-TC-Version'
value = '2018-03-21'
).
lo_http_client->request->set_header_field(
name = 'X-TC-Region'
value = 'ap-shanghai'
).
lo_http_client->request->set_header_field(
name = 'Authorization'
value = lv_authorization
).
* Set content-type
lo_http_client->request->set_content_type(
content_type = 'application/json; charset=utf-8'
).
* Content of translation request data
lv_request_data = lv_payload.
* Set request body
lo_http_client->request->set_cdata( data = lv_request_data ).
* Set request method
lo_http_client->request->set_method( 'POST' ).
* Send request
lo_http_client->send(
EXCEPTIONS
http_communication_failure = 1
http_invalid_state = 2
).
IF sy-subrc <> 0.
lo_http_client->get_last_error( IMPORTING message = lv_msgtx ).
MESSAGE lv_msgtx TYPE 'S' DISPLAY LIKE 'E'.
RETURN.
ENDIF.
* Receive response data
CALL METHOD lo_http_client->receive
EXCEPTIONS
http_communication_failure = 1
http_invalid_state = 2
http_processing_failed = 3.
IF sy-subrc <> 0 .
lo_http_client->get_last_error( IMPORTING message = lv_msgtx ).
MESSAGE lv_msgtx TYPE 'S' DISPLAY LIKE 'E'.
RETURN.
ENDIF.
* Get response body
lv_response = lo_http_client->response->get_cdata( ).
* Collect tencent API response
PERFORM frm_collect_tencent_response USING lv_response.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DIGEST_SHA256HEX
*&---------------------------------------------------------------------*
*& SHA-256加密
*&---------------------------------------------------------------------*
*& --> UV_STRING
*& <-- UV_STRING
*&---------------------------------------------------------------------*
FORM frm_digest_sha256hex USING uv_string TYPE string
CHANGING cv_hashstring TYPE string.
DATA:
lo_cx_abap_message_digest TYPE REF TO cx_abap_message_digest,
lv_exception_err_text TYPE string.
TRY.
CALL METHOD cl_abap_message_digest=>calculate_hash_for_char
EXPORTING
if_algorithm = 'SHA-256'
if_data = uv_string
if_length = 0
IMPORTING
ef_hashstring = cv_hashstring
* ef_hashxstring =
* ef_hashb64string =
* ef_hashx =
.
CATCH cx_abap_message_digest INTO lo_cx_abap_message_digest.
lv_exception_err_text = lo_cx_abap_message_digest->get_text( ).
WRITE lv_exception_err_text.
ENDTRY.
TRANSLATE cv_hashstring TO LOWER CASE.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CALCULATE_HMACSHA256
*&---------------------------------------------------------------------*
*& SHA256加密
*&---------------------------------------------------------------------*
*& --> UV_KEY_XSTRING
*& --> UV_DATA
*& <-- CV_HMACSTRING
*& <-- CV_HMACXSTRING
*&---------------------------------------------------------------------*
FORM frm_calculate_hmacsha256 USING VALUE(uv_key_xstring)
uv_data TYPE string
CHANGING cv_hmacstring TYPE string
cv_hmacxstring TYPE xstring.
DATA:
lo_cx_abap_message_digest TYPE REF TO cx_abap_message_digest,
lv_exception_err_text TYPE string.
TRY.
CALL METHOD cl_abap_hmac=>calculate_hmac_for_char
EXPORTING
if_algorithm = 'SHA256'
if_key = uv_key_xstring
if_data = uv_data
* if_length = 0
IMPORTING
ef_hmacstring = cv_hmacstring
ef_hmacxstring = cv_hmacxstring.
CATCH cx_abap_message_digest INTO lo_cx_abap_message_digest.
lv_exception_err_text = lo_cx_abap_message_digest->get_text( ).
WRITE lv_exception_err_text.
ENDTRY.
TRANSLATE cv_hmacstring TO LOWER CASE.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_GET_SOURCELIST_JSON
*&---------------------------------------------------------------------*
*& Get sourcelist JSON
*&---------------------------------------------------------------------*
*& <-- CV_SOURCELIST_JSON
*&---------------------------------------------------------------------*
FORM frm_get_sourcelist_json CHANGING cv_sourcelist_json.
DATA:
lo_writer TYPE REF TO cl_sxml_string_writer,
lv_len TYPE i,
lv_off_begin TYPE i,
lv_off_end TYPE i.
* Internal table to JSON
lo_writer = cl_sxml_string_writer=>create( type = if_sxml=>co_xt_json ).
CALL TRANSFORMATION id SOURCE source = gt_translate_s RESULT XML lo_writer.
TRY .
cl_abap_conv_in_ce=>create( )->convert(
EXPORTING
input = lo_writer->get_output( )
IMPORTING
data = cv_sourcelist_json ).
CATCH cx_sy_conversion_codepage.
CATCH cx_sy_codepage_converter_init.
CATCH cx_parameter_invalid_type.
ENDTRY.
IF cv_sourcelist_json IS NOT INITIAL.
FIND FIRST OCCURRENCE OF '[' IN cv_sourcelist_json MATCH OFFSET lv_off_begin.
FIND FIRST OCCURRENCE OF ']' IN cv_sourcelist_json MATCH OFFSET lv_off_end.
lv_len = lv_off_end - lv_off_begin + 1.
cv_sourcelist_json = cv_sourcelist_json+lv_off_begin(lv_len).
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_COLLECT_TENCENT_RESPONSE
*&---------------------------------------------------------------------*
*& Collect tencent API response
*&---------------------------------------------------------------------*
*& --> UV_RESPONSE Response payload
*&---------------------------------------------------------------------*
FORM frm_collect_tencent_response USING uv_response TYPE string.
DATA:
lv_len TYPE i,
lv_off_begin TYPE i,
lv_off_end TYPE i,
lv_json TYPE string.
CLEAR gt_translate_t.
IF uv_response CS '"Error":'.
cl_demo_output=>display( uv_response ).
ELSE.
lv_json = uv_response.
FIND FIRST OCCURRENCE OF '[' IN lv_json MATCH OFFSET lv_off_begin.
FIND FIRST OCCURRENCE OF ']' IN lv_json MATCH OFFSET lv_off_end.
lv_len = lv_off_end - lv_off_begin + 1.
lv_json = lv_json+lv_off_begin(lv_len).
lv_json = '{"RESULT":' && lv_json && '}'.
CALL TRANSFORMATION id SOURCE XML lv_json RESULT result = gt_translate_t.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_GET_TENCENT_TERM_ID
*&---------------------------------------------------------------------*
*& Get tencent term bank id
*&---------------------------------------------------------------------*
*& <-- CV_TENCENT_TERM_ID Tencent term bank id
*&---------------------------------------------------------------------*
FORM frm_get_tencent_term_id CHANGING cv_tencent_term_id.
IF ( p_sour = 'zhCN' AND p_targ = 'enUS' ) OR ( p_sour = 'enUS' AND p_targ = 'zhCN' ).
cv_tencent_term_id = gc_tencent_term_zh_en.
ENDIF.
* If others...
* IF ( ).
* cv_tencent_term_id = xxxx
* ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_GET_GLOBAL_VAR
*&---------------------------------------------------------------------*
*& Initial some global variable
*&---------------------------------------------------------------------*
*& --> <GS_ALV>_OBJ_TYPE
*& --> <GS_ALV>_OBJNAME
*&---------------------------------------------------------------------*
FORM frm_get_global_var USING uv_obj_type TYPE lxeobjtype
uv_objname TYPE lxeobjname.
DATA:
lv_function_name TYPE rs38l_fnam,
lv_objname TYPE lxeobjname,
lt_pcx_s1_read TYPE STANDARD TABLE OF lxe_pcx_s1,
lv_o_r3_lang TYPE spras,
lv_orig_lang TYPE lxeisolang.
IF uv_obj_type = 'FNC1'.
lv_objname = uv_objname+0(30).
ELSE.
lv_objname = uv_objname.
ENDIF.
CALL FUNCTION 'LXE_OBJ_GET_TECH_INFO'
EXPORTING
custmnr = gc_custmnr
objtype = uv_obj_type
objname = lv_objname
IMPORTING
orig_lang = lv_orig_lang.
SELECT SINGLE r3_lang INTO lv_o_r3_lang FROM lxe_t002x WHERE language = lv_orig_lang.
lv_function_name = 'LXE_OBJ_TEXT_PAIR_READ_' && uv_obj_type.
SELECT SINGLE * FROM tfdir WHERE funcname = lv_function_name.
IF sy-subrc = 0.
* Get translation info
CALL FUNCTION lv_function_name
EXPORTING
t_r3_lang = gv_t_spras
s_r3_lang = gv_s_spras
o_r3_lang = lv_o_r3_lang
objtype = uv_obj_type
objname = lv_objname
read_only = ''
TABLES
lt_pcx_s1 = lt_pcx_s1_read.
ELSE.
* Get translation info
CALL FUNCTION 'LXE_OBJ_TEXT_PAIR_READ'
EXPORTING
t_lang = p_targ
s_lang = p_sour
custmnr = gc_custmnr
objtype = uv_obj_type
objname = uv_objname
read_only = ''
TABLES
lt_pcx_s1 = lt_pcx_s1_read.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_FILL_OBJ_NAME_TAB
*&---------------------------------------------------------------------*
*& Fill object name table
*&---------------------------------------------------------------------*
*& --> UT_SEL_OPTION Selection option
*&---------------------------------------------------------------------*
FORM frm_fill_obj_name_tab USING ut_sel_option TYPE ANY TABLE.
FIELD-SYMBOLS <ls_sel_option>.
LOOP AT ut_sel_option ASSIGNING <ls_sel_option>.
MOVE-CORRESPONDING <ls_sel_option> TO gs_r_obj_name.
APPEND gs_r_obj_name TO gt_r_obj_name.
CLEAR gs_r_obj_name.
ENDLOOP.
ENDFORM.
以上。