Skip to content

Translation, i18n

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). To access them programmatically:

The helper class below 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.