Translation, i18n
In standard UI5 apps, translations are managed through i18n files stored as frontend artifacts. Since abap2UI5 apps live entirely on the ABAP backend, you can use ABAP's built-in translation mechanisms instead -- text elements, message classes, or data element descriptions.
Text Element
Messages can be translated using the ABAP text elements, making them available in different languages without changing the code:
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
Messages are translated using message classes, ensuring that translations are managed centrally and can be maintained easily in different languages:
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 retrieve and display the short, medium, or long descriptions of data elements (DD04T). Here's how to access these text types 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 where classic DDIC APIs are restricted), it falls back to the XCO library (XCO_CP_ABAP_DICTIONARY). Dynamic method calls (CALL METHOD ... =>( )) are used so the code compiles even on systems where XCO is not 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.