SAP ABAP批量翻译工具(手工翻译+自动翻译+请求传输)

背景:

在海外项目开发中,因为涉及多语言,翻译是很常见的一个需求,往往我们需要手工去翻译大量的自建表,数据元素,域,域值,结构,消息类等等一系列开发对象,这个过程很无聊也很费时,SAP又没有提供批量翻译的入口,只能在各自的开发界面,或者SE63去针对单个对象挨个翻译,所以懒惰促使我不得不开发一个批量翻译的工具,兼容ECC版本,可以在统一入口来批量维护。

2024.08.28更新:追加调用翻译API自动翻译功能,见下文。

2024.09.11更新:修复了批量保存时某些类型无法保存成功的bug,源码已更新。


程序界面:

作为开发的第一个版本,主要包括以下功能,后续根据实际需求再优化或者追加一些功能吧:

  • 表翻译:表标题描述翻译、表中内置类型字段翻译。
  • 视图:视图标题翻译。
  • 结构:结构标题描述翻译,结构中内置类型字段翻译。
  • 数据元素:数据元素描述翻译、数据元素长/中/短/标题描述翻译。
  • :域描述翻译、域值翻译。
  • 程序:程序标题翻译、程序屏幕标题翻译、程序屏幕内容翻译(菜单、GUI状态的翻译被注释掉了,有需要放开对应代码即可)。
  • 函数组:函数组中所有函数描述翻译、函数参数翻译。
  • 事务代码:事务代码描述翻译。
  • 消息类:消息类描述翻译。
  • 自动翻译:调用翻译API进行自动翻译。
  • 请求传输:可将选中的数据包含到指定请求中,方便传输,无需跳转STXL。

执行效果示例:

翻译步骤:

  1. 可以使用ALV标准下载功能下载至EXCEL,也可以直接在ALV中编辑;
  2. 在本地EXCEL中批量翻译好之后,点击ALV界面导入按钮,全选后点击按钮,即可保存翻译,黄灯代表已翻译,但与SAP标准建议翻译不一致,红灯代表尚未翻译或翻译失败,绿灯代表与SAP标准建议翻译一致;
  3. 选中需要传输的数据,点击按钮即可将数据保存至指定请求中。
  4. 如需调用翻译API,则选中数据后,点击按钮,选中需要使用的API,即可进行翻译,目前我只做了调用腾讯的机器翻译,后续有需求了再考虑追加实现其他翻译API。

代码部署注意点:

1.ECC和S4版本中部分参数有差异,目前发现以下位置需要调整:

2.代码复制后需要创建GUI TITLE以及GUI STATUS:

3.如果发现翻译保存不成功时,直接在翻译函数中打断点,查看前台是如何传参的,所有的前台翻译保存都会经过本代码中使用的函数,保存不成功的原因多半是需要保存前再次调用对应的READ函数,填充一些全局变量。


翻译API的实现:

大概看过一些国内的API,每个月免费额度相对来说比较大的就是腾讯翻译还有小牛翻译,看了下小牛翻译是把翻译内容经过URL Encode后直接放在URL中的,相对来说不够安全,腾讯翻译使用的V3签名方法会更加安全,但也更加复杂,官方文档只提供了JAVA等常见的代码示例,ABAP端的代码主要是计算签名的时候花了点时间,查了些资料最终使用ABAP代码进行加密算法来生成相应的签名。

使用翻译API的步骤,以腾讯翻译为例:

1.机器翻译-文档中心-腾讯云 (tencent.com),参考快速入门指南完成开发者账号注册,记得保存好API密钥信息。

2.创建翻译术语库,这样对一些特殊术语可以按照自己指定的术语进行翻译,术语库ID会在调用API时传入,支持双向翻译。

3.查看签名生成过程:

4.参照提供的JAVA示例,将其转换为相应的ABAP代码:


术语库效果示例:

翻译前:

翻译后:


完整源码:

*&---------------------------------------------------------------------*
*& Report ZMULTIPLE_TRANSLATION
*&---------------------------------------------------------------------*
*& Author:DeveloprMrMeng
*& Usage :Used to translate common development objects
*& Date  :2024.07.15
*&---------------------------------------------------------------------*
REPORT zmultiple_translation.
*----------------------------------------------------------------------*
* 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
    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,

  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 'AKIDhQ6f************************',
  gc_tencent_secret_key TYPE string VALUE 'CbwBMXgb************************',
  gc_tencent_term_zh_en TYPE string VALUE '80e18b0a************************'.

*&---------------------------------------------------------------------*
*& 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_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_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_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_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_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_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_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.

  APPEND LINES OF s_tabl TO gt_r_obj_name.
  APPEND LINES OF s_view TO gt_r_obj_name.
  APPEND LINES OF s_stru TO gt_r_obj_name.
  APPEND LINES OF s_dtel TO gt_r_obj_name.
  APPEND LINES OF s_doma TO gt_r_obj_name.
  APPEND LINES OF s_prog TO gt_r_obj_name.
  APPEND LINES OF s_fugr TO gt_r_obj_name.
  APPEND LINES OF s_tran TO gt_r_obj_name.
  APPEND LINES OF s_mscl TO gt_r_obj_name.
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.

  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.

  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.
*   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.
    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
    CALL FUNCTION 'LXE_PP1_PROPOSALS_GET'
      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.

    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.

  WRITE:lv_canonicalrequest.
  NEW-LINE.

**********************************************************************
* 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.

  WRITE:lv_stringtosign.
  NEW-LINE.

**********************************************************************
* 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.

  IF uv_obj_type = 'FNC1'.
    lv_objname = uv_objname+0(30).
  ELSE.
    lv_objname = uv_objname.
  ENDIF.

  lv_function_name = 'LXE_OBJ_TEXT_PAIR_READ_' && uv_obj_type.

  CALL FUNCTION lv_function_name
    EXPORTING
      t_r3_lang = gv_t_spras
      s_r3_lang = gv_s_spras
      objtype   = uv_obj_type
      objname   = lv_objname
      read_only = ''
    TABLES
      lt_pcx_s1 = lt_pcx_s1_read.
ENDFORM.

以上。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DeveloperMrMeng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值