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:
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
Messages are translated using message classes, ensuring that translations are managed centrally and can be maintained easily in different languages:
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 retrieve and display the short, medium, or long descriptions of data elements (DD04T). Here's how to access these text types programmatically:
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.