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