Skip to content

Translation

Standard UI5 apps handle translations with i18n files stored as frontend artifacts. Since abap2UI5 apps live entirely on the ABAP backend, use ABAP's built-in translation tools instead — text elements, message classes, or data element descriptions.

Text Element

ABAP text elements translate messages, so they show up in different languages without code changes:

abap
  METHOD z2ui5_if_app~main.

  DATA(lv_msg_translated) = `this is a translatable message in english`(001).
  client->message_box_display( lv_msg_translated ).

ENDMETHOD.

Messages

Message classes translate messages and unify translation handling, making multi-language maintenance simpler:

abap
  METHOD z2ui5_if_app~main.

  MESSAGE ID `NET` TYPE `I` NUMBER `001` INTO DATA(lv_msg_translated).
  client->message_box_display( lv_msg_translated ).

ENDMETHOD.

Data Element

You can also read and show the short, medium, or long descriptions of data elements (DD04T). The helper class below reads them programmatically. It uses two approaches for backward compatibility: it first tries classic DDIC introspection via cl_abap_elemdescr and GET_DDIC_FIELD (available on all ABAP releases). If that fails (e.g., in ABAP Cloud, which restricts classic DDIC APIs), it falls back to the XCO library (XCO_CP_ABAP_DICTIONARY). Dynamic method calls (CALL METHOD ... =>( )) keep the code compiling even on systems without XCO installed:

abap
  METHOD z2ui5_if_app~main.

  DATA(ls_product_label) = lcl_help=>get_data_element_text( `PRODUCT` ).
  client->message_box_display( |{ ls_product_label-short }: 100 | ).

ENDMETHOD.
abap
CLASS lcl_help DEFINITION
  CREATE PUBLIC.

  PUBLIC SECTION.

    TYPES:
      BEGIN OF ty_s_data_element_text,
        header TYPE string,
        short  TYPE string,
        medium TYPE string,
        long   TYPE string,
      END OF ty_s_data_element_text.

    CLASS-METHODS get_data_element_text
      IMPORTING
        i_data_element_name TYPE string
      RETURNING
        VALUE(result)       TYPE ty_s_data_element_text.

ENDCLASS.

CLASS lcl_help IMPLEMENTATION.

  METHOD get_data_element_text.

    DATA ddic_ref     TYPE REF TO data.
    DATA data_element TYPE REF TO object.
    DATA content      TYPE REF TO object.
    DATA: BEGIN OF ddic,
            reptext   TYPE string,
            scrtext_s TYPE string,
            scrtext_m TYPE string,
            scrtext_l TYPE string,
          END OF ddic.
    DATA exists TYPE abap_bool.

    DATA(data_element_name) = i_data_element_name.

    TRY.
        cl_abap_typedescr=>describe_by_name( `T100` ).

        DATA(struct_desrc) = CAST cl_abap_structdescr( cl_abap_structdescr=>describe_by_name( `DFIES` ) ).

        CREATE DATA ddic_ref TYPE HANDLE struct_desrc.
        ASSIGN ddic_ref->* TO FIELD-SYMBOL(<ddic>).
        ASSERT sy-subrc = 0.

        cl_abap_elemdescr=>describe_by_name( EXPORTING  p_name      = data_element_name
                                             RECEIVING  p_descr_ref = DATA(lo_typedescr)
                                             EXCEPTIONS OTHERS      = 1 ).
        IF sy-subrc <> 0.
          RETURN.
        ENDIF.

        DATA(data_descr) = CAST cl_abap_datadescr( lo_typedescr ).

        CALL METHOD data_descr->(`GET_DDIC_FIELD`)
          RECEIVING
            p_flddescr   = <ddic>
          EXCEPTIONS
            not_found    = 1
            no_ddic_type = 2
            OTHERS       = 3.
        IF sy-subrc <> 0.
          RETURN.
        ENDIF.

        ddic = CORRESPONDING #( <ddic> ).
        result-header = ddic-reptext.
        result-short  = ddic-scrtext_s.
        result-medium = ddic-scrtext_m.
        result-long   = ddic-scrtext_l.

      CATCH cx_root.
        TRY.
            DATA(xco_cp_abap_dictionary) = `XCO_CP_ABAP_DICTIONARY`.
            CALL METHOD (xco_cp_abap_dictionary)=>(`DATA_ELEMENT`)
              EXPORTING
                iv_name         = data_element_name
              RECEIVING
                ro_data_element = data_element.

            CALL METHOD data_element->(`IF_XCO_AD_DATA_ELEMENT~EXISTS`)
              RECEIVING
                rv_exists = exists.

            IF exists = abap_false.
              RETURN.
            ENDIF.

            CALL METHOD data_element->(`IF_XCO_AD_DATA_ELEMENT~CONTENT`)
              RECEIVING
                ro_content = content.

            CALL METHOD content->(`IF_XCO_DTEL_CONTENT~GET_HEADING_FIELD_LABEL`)
              RECEIVING
                rs_heading_field_label = result-header.

            CALL METHOD content->(`IF_XCO_DTEL_CONTENT~GET_SHORT_FIELD_LABEL`)
              RECEIVING
                rs_short_field_label = result-short.

            CALL METHOD content->(`IF_XCO_DTEL_CONTENT~GET_MEDIUM_FIELD_LABEL`)
              RECEIVING
                rs_medium_field_label = result-medium.

            CALL METHOD content->(`IF_XCO_DTEL_CONTENT~GET_LONG_FIELD_LABEL`)
              RECEIVING
                rs_long_field_label = result-long.

          CATCH cx_root.
        ENDTRY.
    ENDTRY.

  ENDMETHOD.

ENDCLASS.