diff --git a/src/objects/aff/zcl_abapgit_json_path.clas.abap b/src/objects/aff/zcl_abapgit_json_path.clas.abap
new file mode 100644
index 000000000..47f65ca64
--- /dev/null
+++ b/src/objects/aff/zcl_abapgit_json_path.clas.abap
@@ -0,0 +1,39 @@
+CLASS zcl_abapgit_json_path DEFINITION PUBLIC CREATE PUBLIC.
+ PUBLIC SECTION.
+ METHODS: serialize
+ IMPORTING iv_json TYPE string
+ RETURNING VALUE(rt_result) TYPE string_table
+ RAISING zcx_abapgit_exception.
+ PROTECTED SECTION.
+ PRIVATE SECTION.
+ENDCLASS.
+
+CLASS zcl_abapgit_json_path IMPLEMENTATION.
+
+ METHOD serialize.
+ DATA: lo_json_path TYPE REF TO lcl_json_path,
+ lv_json_xstring TYPE xstring,
+ lt_root_path TYPE string_table,
+ lo_reader TYPE REF TO if_sxml_reader,
+ lx_parse_error TYPE REF TO cx_sxml_parse_error.
+
+ lv_json_xstring = zcl_abapgit_convert=>string_to_xstring_utf8( iv_json ).
+ lo_reader = cl_sxml_string_reader=>create( input = lv_json_xstring ).
+
+ TRY.
+ IF lo_reader->read_next_node( ) IS INITIAL.
+ RETURN.
+ ENDIF.
+ CATCH cx_sxml_parse_error INTO lx_parse_error.
+ zcx_abapgit_exception=>raise_with_text( lx_parse_error ).
+ ENDTRY.
+
+ APPEND `$` TO lt_root_path.
+
+ CREATE OBJECT lo_json_path.
+ lo_json_path->serialize_rec( EXPORTING io_reader = lo_reader
+ it_path = lt_root_path
+ CHANGING ct_json_paths = rt_result ).
+ ENDMETHOD.
+
+ENDCLASS.
diff --git a/src/objects/aff/zcl_abapgit_json_path.clas.locals_imp.abap b/src/objects/aff/zcl_abapgit_json_path.clas.locals_imp.abap
new file mode 100644
index 000000000..c19685295
--- /dev/null
+++ b/src/objects/aff/zcl_abapgit_json_path.clas.locals_imp.abap
@@ -0,0 +1,182 @@
+*"* use this source file for the definition and implementation of
+*"* local helper classes, interface definitions and type
+*"* declarations
+
+CLASS lcl_json_path DEFINITION CREATE PUBLIC.
+
+ PUBLIC SECTION.
+ METHODS:
+ serialize_rec
+ IMPORTING io_reader TYPE REF TO if_sxml_reader
+ it_path TYPE string_table
+ CHANGING ct_json_paths TYPE string_table.
+
+ PROTECTED SECTION.
+ PRIVATE SECTION.
+
+ METHODS:
+ is_array
+ IMPORTING io_reader TYPE REF TO if_sxml_reader
+ RETURNING VALUE(rv_result) TYPE abap_bool.
+ METHODS:
+ is_string_open
+ IMPORTING io_reader TYPE REF TO if_sxml_reader
+ RETURNING VALUE(rv_result) TYPE abap_bool.
+ METHODS:
+ is_object
+ IMPORTING io_reader TYPE REF TO if_sxml_reader
+ RETURNING VALUE(rv_result) TYPE abap_bool.
+ METHODS:
+ serialize_rec_array
+ IMPORTING io_reader TYPE REF TO if_sxml_reader
+ it_path TYPE string_table
+ CHANGING ct_json_paths TYPE string_table.
+ METHODS:
+ get_json_path
+ IMPORTING it_path TYPE string_table
+ RETURNING VALUE(rv_result) TYPE string.
+
+ENDCLASS.
+
+CLASS lcl_json_path IMPLEMENTATION.
+
+ METHOD is_array.
+ rv_result = boolc( io_reader->name = 'array' ).
+ ENDMETHOD.
+
+ METHOD is_string_open.
+ rv_result = boolc( io_reader->name = 'str' AND io_reader->node_type = if_sxml_node=>co_nt_element_open ).
+ ENDMETHOD.
+
+ METHOD is_object.
+ rv_result = boolc( io_reader->name = 'object' ).
+ ENDMETHOD.
+
+ METHOD serialize_rec.
+ DATA: lt_new_path TYPE string_table,
+ lv_key TYPE string.
+
+ lt_new_path = it_path.
+
+ IF io_reader->read_next_node( ) IS INITIAL.
+ RETURN.
+ ENDIF.
+
+ IF is_string_open( io_reader ) = abap_true.
+
+ APPEND io_reader->value TO lt_new_path.
+ lv_key = get_json_path( lt_new_path ).
+
+ io_reader->read_next_node( ).
+ lv_key = |{ lv_key }={ io_reader->value }|.
+ APPEND lv_key TO ct_json_paths.
+
+ io_reader->read_next_node( ).
+ DELETE lt_new_path INDEX lines( lt_new_path ).
+
+ serialize_rec( EXPORTING io_reader = io_reader
+ it_path = lt_new_path
+ CHANGING ct_json_paths = ct_json_paths ).
+
+ ELSEIF is_object( io_reader ) = abap_true AND io_reader->node_type = if_sxml_node=>co_nt_element_open.
+
+ APPEND io_reader->value TO lt_new_path.
+ serialize_rec( EXPORTING io_reader = io_reader
+ it_path = lt_new_path
+ CHANGING ct_json_paths = ct_json_paths ).
+
+ ELSEIF is_array( io_reader ) = abap_true AND io_reader->node_type = if_sxml_node=>co_nt_element_open.
+
+ APPEND io_reader->value TO lt_new_path.
+ serialize_rec_array( EXPORTING io_reader = io_reader
+ it_path = lt_new_path
+ CHANGING ct_json_paths = ct_json_paths ).
+
+ ELSEIF ( is_object( io_reader ) = abap_true OR is_array( io_reader ) = abap_true )
+ AND io_reader->node_type = if_sxml_node=>co_nt_element_close.
+
+ DELETE lt_new_path INDEX lines( lt_new_path ).
+ serialize_rec( EXPORTING io_reader = io_reader
+ it_path = lt_new_path
+ CHANGING ct_json_paths = ct_json_paths ).
+
+ ENDIF.
+
+ ENDMETHOD.
+
+
+ METHOD serialize_rec_array.
+ DATA: lt_new_path TYPE string_table,
+ lv_json_path TYPE string,
+ lv_array_key TYPE string.
+
+ lt_new_path = it_path.
+
+ IF io_reader->read_next_node( ) IS INITIAL.
+ RETURN.
+ ENDIF.
+
+ IF is_string_open( io_reader ) = abap_true.
+
+ APPEND io_reader->value TO lt_new_path.
+ lv_json_path = get_json_path( lt_new_path ).
+
+ io_reader->read_next_node( ).
+ lv_json_path = |{ lv_json_path }={ io_reader->value }|.
+ APPEND lv_json_path TO ct_json_paths.
+ io_reader->read_next_node( ).
+
+ serialize_rec( EXPORTING io_reader = io_reader
+ it_path = lt_new_path
+ CHANGING ct_json_paths = ct_json_paths ).
+
+ ELSEIF is_object( io_reader ) = abap_true AND io_reader->node_type = if_sxml_node=>co_nt_element_open.
+
+ io_reader->read_next_node( ).
+ lv_array_key = io_reader->value.
+ io_reader->read_next_node( ).
+ lv_array_key = |[?(@.{ lv_array_key }=='{ io_reader->value }')]|.
+ APPEND lv_array_key TO lt_new_path.
+ io_reader->read_next_node( ).
+
+ io_reader->read_next_node( ).
+ APPEND io_reader->value TO lt_new_path.
+ lv_json_path = get_json_path( lt_new_path ).
+
+ io_reader->read_next_node( ).
+ lv_json_path = |{ lv_json_path }={ io_reader->value }|.
+ APPEND lv_json_path TO ct_json_paths.
+ io_reader->read_next_node( ).
+
+ DELETE lt_new_path INDEX lines( lt_new_path ).
+ serialize_rec_array( EXPORTING io_reader = io_reader
+ it_path = lt_new_path
+ CHANGING ct_json_paths = ct_json_paths ).
+
+ ELSEIF is_array( io_reader ) = abap_true AND io_reader->node_type = if_sxml_node=>co_nt_element_open.
+
+ APPEND io_reader->value TO lt_new_path.
+ serialize_rec_array( EXPORTING io_reader = io_reader
+ it_path = lt_new_path
+ CHANGING ct_json_paths = ct_json_paths ).
+
+ ELSEIF ( is_object( io_reader ) = abap_true OR is_array( io_reader ) = abap_true )
+ AND io_reader->node_type = if_sxml_node=>co_nt_element_close.
+
+ DELETE lt_new_path INDEX lines( lt_new_path ).
+ serialize_rec_array( EXPORTING io_reader = io_reader
+ it_path = lt_new_path
+ CHANGING ct_json_paths = ct_json_paths ).
+
+ ENDIF.
+
+ ENDMETHOD.
+
+ METHOD get_json_path.
+ rv_result = concat_lines_of( table = it_path
+ sep = `.` ).
+ REPLACE ALL OCCURRENCES OF `.[` IN rv_result WITH `[`.
+
+ ENDMETHOD.
+
+ENDCLASS.
diff --git a/src/objects/aff/zcl_abapgit_json_path.clas.testclasses.abap b/src/objects/aff/zcl_abapgit_json_path.clas.testclasses.abap
new file mode 100644
index 000000000..3300b75d0
--- /dev/null
+++ b/src/objects/aff/zcl_abapgit_json_path.clas.testclasses.abap
@@ -0,0 +1,142 @@
+CLASS ltcl_json_path DEFINITION FINAL FOR TESTING
+ DURATION SHORT
+ RISK LEVEL HARMLESS.
+
+ PRIVATE SECTION.
+ DATA: mt_act TYPE string_table,
+ mt_exp TYPE string_table,
+ ms_data TYPE zif_abapgit_aff_intf_v1=>ty_main.
+ METHODS:
+ flat_structure FOR TESTING RAISING cx_static_check,
+ array FOR TESTING RAISING cx_static_check,
+ array_nested FOR TESTING RAISING cx_static_check.
+ METHODS:
+ serialize
+ IMPORTING is_data TYPE zif_abapgit_aff_intf_v1=>ty_main
+ RETURNING VALUE(rt_result) TYPE string_table
+ RAISING zcx_abapgit_ajson_error
+ zcx_abapgit_exception.
+ENDCLASS.
+
+
+CLASS ltcl_json_path IMPLEMENTATION.
+
+ METHOD serialize.
+ DATA:
+ lo_ajson TYPE REF TO zif_abapgit_ajson,
+ lo_cut TYPE REF TO zcl_abapgit_json_path.
+
+
+ lo_ajson = zcl_abapgit_ajson=>new( iv_keep_item_order = abap_true
+ )->set( iv_path = '/'
+ iv_val = is_data
+ )->map( zcl_abapgit_ajson_mapping=>create_to_camel_case( )
+ )->filter( zcl_abapgit_ajson_filter_lib=>create_empty_filter( ) ).
+
+ lo_ajson->delete( '/category/' ).
+ lo_ajson->delete( '/proxy/' ).
+
+ CREATE OBJECT lo_cut.
+ rt_result = lo_cut->serialize( lo_ajson->stringify( ) ).
+ ENDMETHOD.
+
+
+ METHOD flat_structure.
+ DATA lv_header_descr TYPE string.
+ lv_header_descr = `$.header.description=Text`.
+
+ ms_data-header-description = 'Text'.
+
+ mt_act = serialize( ms_data ).
+ APPEND lv_header_descr TO mt_exp.
+
+ cl_abap_unit_assert=>assert_equals( exp = mt_exp
+ act = mt_act ).
+
+ ENDMETHOD.
+
+ METHOD array.
+ DATA lv_header_descr TYPE string.
+ DATA lv_descr_meth_1 TYPE string.
+ DATA lv_descr_meth_2 TYPE string.
+ DATA ls_meth_desc TYPE zif_abapgit_aff_oo_types_v1=>ty_method.
+
+ lv_header_descr = `$.header.description=Text`.
+ lv_descr_meth_1 = `$.descriptions.methods[?(@.name=='METH1')].description=Sonne`.
+ lv_descr_meth_2 = `$.descriptions.methods[?(@.name=='METH2')].description=Mond`.
+
+ APPEND lv_header_descr TO mt_exp.
+ APPEND lv_descr_meth_1 TO mt_exp.
+ APPEND lv_descr_meth_2 TO mt_exp.
+
+
+ ms_data-header-description = 'Text'.
+
+ ls_meth_desc-name = `METH1`.
+ ls_meth_desc-description = `Sonne`.
+ APPEND ls_meth_desc TO ms_data-descriptions-methods.
+ CLEAR ls_meth_desc.
+ ls_meth_desc-name = `METH2`.
+ ls_meth_desc-description = `Mond`.
+ APPEND ls_meth_desc TO ms_data-descriptions-methods.
+
+
+ mt_act = serialize( ms_data ).
+
+ cl_abap_unit_assert=>assert_equals( exp = mt_exp
+ act = mt_act ).
+
+ ENDMETHOD.
+
+ METHOD array_nested.
+ DATA lv_header_descr TYPE string.
+ DATA lv_descr_meth_1 TYPE string.
+ DATA lv_descr_meth_1_param_1 TYPE string.
+ DATA lv_descr_meth_1_param_2 TYPE string.
+ DATA lv_descr_meth_2 TYPE string.
+ DATA ls_meth_desc TYPE zif_abapgit_aff_oo_types_v1=>ty_method.
+ DATA ls_meth_param TYPE zif_abapgit_aff_oo_types_v1=>ty_component_description.
+
+ lv_header_descr = `$.header.description=Text`.
+ lv_descr_meth_1 = `$.descriptions.methods[?(@.name=='METH1')].description=Sonne`.
+ lv_descr_meth_1_param_1 =
+ `$.descriptions.methods[?(@.name=='METH1')].parameters[?(@.name=='param1')].description=Parameter A`.
+ lv_descr_meth_1_param_2 =
+ `$.descriptions.methods[?(@.name=='METH1')].parameters[?(@.name=='param2')].description=Parameter B`.
+ lv_descr_meth_2 = `$.descriptions.methods[?(@.name=='METH2')].description=Mond`.
+
+ APPEND lv_header_descr TO mt_exp.
+ APPEND lv_descr_meth_1 TO mt_exp.
+ APPEND lv_descr_meth_1_param_1 TO mt_exp.
+ APPEND lv_descr_meth_1_param_2 TO mt_exp.
+ APPEND lv_descr_meth_2 TO mt_exp.
+
+
+
+ ls_meth_param-name = 'param1'.
+ ls_meth_param-description = 'Parameter A'.
+ APPEND ls_meth_param TO ls_meth_desc-parameters.
+
+ ls_meth_param-name = 'param2'.
+ ls_meth_param-description = 'Parameter B'.
+ APPEND ls_meth_param TO ls_meth_desc-parameters.
+
+ ls_meth_desc-name = `METH1`.
+ ls_meth_desc-description = `Sonne`.
+ APPEND ls_meth_desc TO ms_data-descriptions-methods.
+ CLEAR ls_meth_desc.
+
+ ls_meth_desc-name = `METH2`.
+ ls_meth_desc-description = `Mond`.
+ APPEND ls_meth_desc TO ms_data-descriptions-methods.
+
+ ms_data-header-description = 'Text'.
+
+ mt_act = serialize( ms_data ).
+
+ cl_abap_unit_assert=>assert_equals( exp = mt_exp
+ act = mt_act ).
+
+ ENDMETHOD.
+
+ENDCLASS.
diff --git a/src/objects/aff/zcl_abapgit_json_path.clas.xml b/src/objects/aff/zcl_abapgit_json_path.clas.xml
new file mode 100644
index 000000000..263d7e255
--- /dev/null
+++ b/src/objects/aff/zcl_abapgit_json_path.clas.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+ ZCL_ABAPGIT_JSON_PATH
+ E
+ abapGit - de-/serializes JSON string to JSON paths
+ 1
+ X
+ X
+ X
+ X
+
+
+
+
diff --git a/src/objects/texts/zcl_abapgit_properties_file.clas.abap b/src/objects/texts/zcl_abapgit_properties_file.clas.abap
new file mode 100644
index 000000000..23af7eeeb
--- /dev/null
+++ b/src/objects/texts/zcl_abapgit_properties_file.clas.abap
@@ -0,0 +1,70 @@
+CLASS zcl_abapgit_properties_file DEFINITION
+ PUBLIC
+ FINAL
+ CREATE PUBLIC .
+
+ PUBLIC SECTION.
+ INTERFACES zif_abapgit_i18n_file.
+
+ CONSTANTS:
+ c_properties_feature TYPE string VALUE 'TRANSL'.
+
+ METHODS constructor
+ IMPORTING iv_lang TYPE laiso.
+
+ METHODS push_text_pairs
+ IMPORTING it_translation TYPE string_table.
+
+ PROTECTED SECTION.
+ PRIVATE SECTION.
+
+ DATA mv_lang TYPE laiso.
+ DATA mt_translation TYPE string_table.
+
+ENDCLASS.
+
+
+
+CLASS zcl_abapgit_properties_file IMPLEMENTATION.
+
+
+
+ METHOD constructor.
+ mv_lang = to_lower( iv_lang ).
+ ENDMETHOD.
+
+
+ METHOD push_text_pairs.
+ mt_translation = it_translation.
+ ENDMETHOD.
+
+
+ METHOD zif_abapgit_i18n_file~ext.
+ rv_ext = 'properties'.
+ ENDMETHOD.
+
+
+ METHOD zif_abapgit_i18n_file~lang.
+ rv_lang = mv_lang.
+ ENDMETHOD.
+
+
+ METHOD zif_abapgit_i18n_file~render.
+ DATA: lv_translation TYPE string,
+ lo_buf TYPE REF TO zcl_abapgit_string_buffer,
+ lv_str TYPE string.
+
+ lv_translation = concat_lines_of( table = mt_translation
+ sep = cl_abap_char_utilities=>newline ).
+ CREATE OBJECT lo_buf.
+ lo_buf->add( lv_translation ).
+
+ lv_str = lo_buf->join_w_newline_and_flush( ) && cl_abap_char_utilities=>newline.
+ rv_data = zcl_abapgit_convert=>string_to_xstring_utf8_bom( lv_str ).
+
+ ENDMETHOD.
+
+
+ METHOD zif_abapgit_i18n_file~translate.
+ ENDMETHOD.
+ENDCLASS.
diff --git a/src/objects/texts/zcl_abapgit_properties_file.clas.xml b/src/objects/texts/zcl_abapgit_properties_file.clas.xml
new file mode 100644
index 000000000..a5f8100fb
--- /dev/null
+++ b/src/objects/texts/zcl_abapgit_properties_file.clas.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ ZCL_ABAPGIT_PROPERTIES_FILE
+ E
+ abapGit - Properties file serializer
+ 1
+ X
+ X
+ X
+
+
+
+
diff --git a/src/objects/zcl_abapgit_object_intf.clas.abap b/src/objects/zcl_abapgit_object_intf.clas.abap
index a3db0dd4c..0ed280a66 100644
--- a/src/objects/zcl_abapgit_object_intf.clas.abap
+++ b/src/objects/zcl_abapgit_object_intf.clas.abap
@@ -270,9 +270,9 @@ CLASS zcl_abapgit_object_intf IMPLEMENTATION.
ls_intf_aff = lcl_aff_metadata_handler=>deserialize( lv_json_data ).
CREATE OBJECT lo_aff_mapper TYPE lcl_aff_type_mapping.
- lo_aff_mapper->to_abapgit( EXPORTING iv_data = ls_intf_aff
+ lo_aff_mapper->to_abapgit( EXPORTING iv_data = ls_intf_aff
iv_object_name = ms_item-obj_name
- IMPORTING es_data = rs_intf ).
+ IMPORTING es_data = rs_intf ).
ENDMETHOD.
@@ -392,7 +392,9 @@ CLASS zcl_abapgit_object_intf IMPLEMENTATION.
ls_intf TYPE ty_intf,
ls_clskey TYPE seoclskey,
lv_serialized_data TYPE xstring,
- lt_langu_additional TYPE zif_abapgit_lang_definitions=>ty_langus.
+ lt_langu_additional TYPE zif_abapgit_lang_definitions=>ty_langus,
+ lt_i18n_file TYPE zif_abapgit_i18n_file=>ty_table_of,
+ lo_i18n_file TYPE REF TO zif_abapgit_i18n_file.
ls_clskey-clsname = ms_item-obj_name.
@@ -422,7 +424,13 @@ CLASS zcl_abapgit_object_intf IMPLEMENTATION.
lv_serialized_data = lcl_aff_metadata_handler=>serialize( ls_intf ).
mo_files->add_raw( iv_ext = 'json'
iv_data = lv_serialized_data ).
+ lt_i18n_file = lcl_aff_metadata_handler=>serialize_translations(
+ is_intf = ls_intf
+ it_language = mo_i18n_params->ms_params-translation_languages ).
+ LOOP AT lt_i18n_file INTO lo_i18n_file.
+ mo_files->add_i18n_file( lo_i18n_file ).
+ ENDLOOP.
ELSE.
io_xml->add( iv_name = 'VSEOINTERF'
ig_data = ls_intf-vseointerf ).
diff --git a/src/objects/zcl_abapgit_object_intf.clas.locals_imp.abap b/src/objects/zcl_abapgit_object_intf.clas.locals_imp.abap
index a788e3e00..5edfcdd90 100644
--- a/src/objects/zcl_abapgit_object_intf.clas.locals_imp.abap
+++ b/src/objects/zcl_abapgit_object_intf.clas.locals_imp.abap
@@ -102,9 +102,9 @@ CLASS lcl_aff_helper IMPLEMENTATION.
rs_properties-attributes = get_attributes( lt_components ).
- rs_properties-methods = get_methods( is_components = lt_components
+ rs_properties-methods = get_methods( is_components = lt_components
is_sub_components = lt_sub_components ).
- rs_properties-events = get_events( is_components = lt_components
+ rs_properties-events = get_events( is_components = lt_components
is_sub_components = lt_sub_components ).
rs_properties-types = get_types( lt_components ).
ENDMETHOD.
@@ -133,7 +133,7 @@ CLASS lcl_aff_helper IMPLEMENTATION.
ON component~cmpname = component_text~cmpname AND component~clsname = component_text~clsname
AND component_text~langu = iv_language
WHERE component~clsname = iv_clif_name
- ORDER BY component~cmpname. "#EC CI_BUFFJOIN
+ ORDER BY component~cmpname. "#EC CI_BUFFJOIN
SELECT sub_component~cmpname sub_component~sconame sub_component_text~descript sub_component~scotype
INTO TABLE lt_sub_components
@@ -152,9 +152,9 @@ CLASS lcl_aff_helper IMPLEMENTATION.
ENDLOOP.
rs_properties-attributes = get_attributes( lt_components_exp ).
- rs_properties-methods = get_methods( is_components = lt_components_exp
+ rs_properties-methods = get_methods( is_components = lt_components_exp
is_sub_components = lt_sub_components ).
- rs_properties-events = get_events( is_components = lt_components_exp
+ rs_properties-events = get_events( is_components = lt_components_exp
is_sub_components = lt_sub_components ).
rs_properties-types = get_types( lt_components_exp ).
@@ -339,17 +339,17 @@ CLASS lcl_aff_helper IMPLEMENTATION.
METHOD set_descriptions_compo_subco.
set_attributes( is_properties = is_properties
- iv_clif_name = iv_clif_name
- iv_language = iv_language ).
+ iv_clif_name = iv_clif_name
+ iv_language = iv_language ).
set_methods( is_properties = is_properties
- iv_clif_name = iv_clif_name
- iv_language = iv_language ).
+ iv_clif_name = iv_clif_name
+ iv_language = iv_language ).
set_events( is_properties = is_properties
- iv_clif_name = iv_clif_name
- iv_language = iv_language ).
+ iv_clif_name = iv_clif_name
+ iv_language = iv_language ).
set_types( is_properties = is_properties
- iv_clif_name = iv_clif_name
- iv_language = iv_language ).
+ iv_clif_name = iv_clif_name
+ iv_language = iv_language ).
ENDMETHOD.
ENDCLASS.
@@ -387,8 +387,8 @@ CLASS lcl_aff_type_mapping IMPLEMENTATION.
" get descriptions
ls_data_aff-descriptions = lcl_aff_helper=>get_descriptions_compo_subco(
- iv_language = ls_data_aff-header-original_language
- iv_clif_name = ls_data_abapgit-vseointerf-clsname ).
+ iv_language = ls_data_aff-header-original_language
+ iv_clif_name = ls_data_abapgit-vseointerf-clsname ).
es_data = ls_data_aff.
ENDMETHOD.
@@ -502,6 +502,11 @@ CLASS lcl_aff_metadata_handler DEFINITION.
IMPORTING is_intf TYPE zcl_abapgit_object_intf=>ty_intf
RETURNING VALUE(rv_result) TYPE xstring
RAISING zcx_abapgit_exception.
+ CLASS-METHODS serialize_translations
+ IMPORTING is_intf TYPE zcl_abapgit_object_intf=>ty_intf
+ it_language TYPE zif_abapgit_definitions=>ty_languages
+ RETURNING VALUE(rt_result) TYPE zif_abapgit_i18n_file=>ty_table_of
+ RAISING zcx_abapgit_exception.
CLASS-METHODS deserialize
IMPORTING iv_data TYPE xstring
RETURNING VALUE(rv_result) TYPE zif_abapgit_aff_intf_v1=>ty_main
@@ -515,7 +520,11 @@ CLASS lcl_aff_metadata_handler DEFINITION.
"! For serialization
"! @parameter rt_result | Paths that will not be serialized (depending on value)
get_paths_to_skip
- RETURNING VALUE(rt_result) TYPE zcl_abapgit_json_handler=>ty_skip_paths.
+ RETURNING VALUE(rt_result) TYPE zcl_abapgit_json_handler=>ty_skip_paths,
+ fill_translation
+ IMPORTING iv_name TYPE seoclsname
+ iv_language TYPE laiso
+ RETURNING VALUE(rt_result) TYPE zif_abapgit_aff_intf_v1=>ty_main.
ENDCLASS.
CLASS lcl_aff_metadata_handler IMPLEMENTATION.
@@ -609,16 +618,77 @@ CLASS lcl_aff_metadata_handler IMPLEMENTATION.
CREATE OBJECT lo_ajson.
TRY.
lo_ajson->deserialize(
- EXPORTING
- iv_content = iv_data
- iv_defaults = lt_values_for_initial
- iv_enum_mappings = lt_enum_mappings
- IMPORTING
- ev_data = rv_result ).
+ EXPORTING
+ iv_content = iv_data
+ iv_defaults = lt_values_for_initial
+ iv_enum_mappings = lt_enum_mappings
+ IMPORTING
+ ev_data = rv_result ).
CATCH cx_static_check INTO lx_exception.
zcx_abapgit_exception=>raise_with_text( lx_exception ).
ENDTRY.
ENDMETHOD.
+ METHOD serialize_translations.
+ DATA: ls_data TYPE zif_abapgit_aff_intf_v1=>ty_main,
+ lv_langu TYPE laiso,
+ lv_json TYPE string,
+ lo_ajson TYPE REF TO zif_abapgit_ajson,
+ lo_json_path TYPE REF TO zcl_abapgit_json_path,
+ lt_translation TYPE string_table,
+ lx_exception TYPE REF TO zcx_abapgit_ajson_error,
+ lo_trans_file TYPE REF TO zcl_abapgit_properties_file.
+
+
+ LOOP AT it_language INTO lv_langu.
+
+ ls_data = fill_translation( iv_name = is_intf-vseointerf-clsname
+ iv_language = lv_langu ).
+
+ " convert AFF type to JSON
+ TRY.
+ lo_ajson = zcl_abapgit_ajson=>new( iv_keep_item_order = abap_true
+ )->set( iv_path = '/'
+ iv_val = ls_data
+ )->map( zcl_abapgit_ajson_mapping=>create_to_camel_case( )
+ )->filter( zcl_abapgit_ajson_filter_lib=>create_empty_filter( ) ).
+ " remove manually the non-primitive types that are initial or not relevant for translation
+ lo_ajson->delete( '/category/' ).
+ lo_ajson->delete( '/proxy/' ).
+ lv_json = lo_ajson->stringify( ).
+ CATCH zcx_abapgit_ajson_error INTO lx_exception.
+ zcx_abapgit_exception=>raise_with_text( lx_exception ).
+ ENDTRY.
+
+
+ CREATE OBJECT lo_json_path.
+ lt_translation = lo_json_path->serialize( lv_json ).
+
+ CREATE OBJECT lo_trans_file
+ EXPORTING iv_lang = lv_langu.
+
+ lo_trans_file->push_text_pairs( lt_translation ).
+
+ APPEND lo_trans_file TO rt_result.
+ ENDLOOP.
+
+ ENDMETHOD.
+
+
+ METHOD fill_translation.
+ DATA: lv_langu_sap1 TYPE sy-langu.
+
+ lv_langu_sap1 = zcl_abapgit_convert=>language_sap2_to_sap1( iv_language ).
+
+ rt_result-descriptions = lcl_aff_helper=>get_descriptions_compo_subco(
+ iv_clif_name = iv_name
+ iv_language = lv_langu_sap1 ).
+
+ SELECT SINGLE descript FROM seoclasstx INTO rt_result-header-description
+ WHERE clsname = iv_name AND
+ langu = lv_langu_sap1.
+
+ ENDMETHOD.
+
ENDCLASS.
diff --git a/src/objects/zcl_abapgit_objects.clas.testclasses.abap b/src/objects/zcl_abapgit_objects.clas.testclasses.abap
index 364dcdb41..ed2b3c1a0 100644
--- a/src/objects/zcl_abapgit_objects.clas.testclasses.abap
+++ b/src/objects/zcl_abapgit_objects.clas.testclasses.abap
@@ -55,6 +55,36 @@ CLASS ltcl_object_types IMPLEMENTATION.
ENDCLASS.
+
+CLASS lcl_settings_with_features DEFINITION.
+ PUBLIC SECTION.
+ INTERFACES zif_abapgit_persist_settings.
+ METHODS: constructor
+ IMPORTING iv_features TYPE string.
+ PRIVATE SECTION.
+ DATA mv_features TYPE string.
+ENDCLASS.
+
+CLASS lcl_settings_with_features IMPLEMENTATION.
+
+ METHOD zif_abapgit_persist_settings~modify.
+ RETURN.
+ ENDMETHOD.
+
+ METHOD zif_abapgit_persist_settings~read.
+
+ CREATE OBJECT ro_settings.
+ ro_settings->set_experimental_features( mv_features ).
+
+ ENDMETHOD.
+
+ METHOD constructor.
+ mv_features = iv_features.
+ ENDMETHOD.
+
+ENDCLASS.
+
+
*----------------------------------------------------------------------*
* CLASS ltcl_serialize DEFINITION
*----------------------------------------------------------------------*
@@ -80,7 +110,8 @@ CLASS ltcl_serialize DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT F
serialize_msag FOR TESTING RAISING zcx_abapgit_exception,
serialize_prog FOR TESTING RAISING zcx_abapgit_exception,
serialize_tran FOR TESTING RAISING zcx_abapgit_exception,
- serialize_ttyp FOR TESTING RAISING zcx_abapgit_exception.
+ serialize_ttyp FOR TESTING RAISING zcx_abapgit_exception,
+ serialize_intf_aff_translate FOR TESTING RAISING cx_static_check.
ENDCLASS.
@@ -162,6 +193,48 @@ CLASS ltcl_serialize IMPLEMENTATION.
ENDMETHOD.
+
+ METHOD serialize_intf_aff_translate.
+
+ DATA: ls_item TYPE zif_abapgit_definitions=>ty_item,
+ lo_settings TYPE REF TO lcl_settings_with_features,
+ ls_act TYPE zif_abapgit_objects=>ty_serialization,
+ ls_translation_de TYPE zif_abapgit_git_definitions=>ty_file,
+ lt_target_langu TYPE zif_abapgit_definitions=>ty_languages,
+ lo_i18n_params TYPE REF TO zcl_abapgit_i18n_params,
+ lv_features TYPE string,
+ lv_filename TYPE string.
+
+ ls_item-obj_type = 'INTF'.
+ ls_item-obj_name = 'IF_BADI_TADIR_CHANGED'.
+
+ lv_features = |{ zcl_abapgit_aff_registry=>c_aff_feature }, { zcl_abapgit_properties_file=>c_properties_feature }|.
+ CREATE OBJECT lo_settings
+ EXPORTING
+ iv_features = lv_features.
+
+ zcl_abapgit_persist_injector=>set_settings( lo_settings ).
+
+ APPEND `DE` TO lt_target_langu.
+ lo_i18n_params = zcl_abapgit_i18n_params=>new( iv_main_language = zif_abapgit_definitions=>c_english
+ it_translation_langs = lt_target_langu
+ iv_use_lxe = abap_true ).
+ ls_act = zcl_abapgit_objects=>serialize(
+ is_item = ls_item
+ io_i18n_params = lo_i18n_params ).
+
+ cl_abap_unit_assert=>assert_not_initial( ls_act-files ).
+ cl_abap_unit_assert=>assert_equals( act = ls_act-item
+ exp = ls_item ).
+
+
+ lv_filename = 'if_badi_tadir_changed.intf.i18n.de.properties'.
+ READ TABLE ls_act-files WITH KEY filename = lv_filename INTO ls_translation_de.
+
+ cl_abap_unit_assert=>assert_not_initial( ls_translation_de ).
+
+ ENDMETHOD.
+
METHOD serialize_doma.
DATA: ls_item TYPE zif_abapgit_definitions=>ty_item.
diff --git a/test/abap_transpile.json b/test/abap_transpile.json
index ba0a580a0..4a63ddd1d 100644
--- a/test/abap_transpile.json
+++ b/test/abap_transpile.json
@@ -174,6 +174,7 @@
{"object": "ZCL_ABAPGIT_OBJECTS", "class": "ltcl_serialize", "method": "serialize_prog", "note": "no such table: seometarel"},
{"object": "ZCL_ABAPGIT_OBJECTS", "class": "ltcl_serialize", "method": "serialize_tran", "note": "no such table: seometarel"},
{"object": "ZCL_ABAPGIT_OBJECTS", "class": "ltcl_serialize", "method": "serialize_ttyp", "note": "no such table: seometarel"},
+ {"object": "ZCL_ABAPGIT_OBJECTS", "class": "ltcl_serialize", "method": "serialize_intf_aff_translate", "note": "Void type: SEOCLASSDF"},
{"object": "ZCL_ABAPGIT_OBJECTS", "class": "ltcl_check_objects_locked", "method": "throw_excp_if_object_is_locked", "note": "no such table: seometarel"},
{"object": "ZCL_ABAPGIT_OBJECTS", "class": "ltcl_check_objects_locked", "method": "no_excp_if_obj_is_not_locked", "note": "no such table: seometarel"},