diff --git a/i18n-tools/LevelsI18N.cmake b/i18n-tools/LevelsI18N.cmake index a6cc0bcc..4c85382e 100644 --- a/i18n-tools/LevelsI18N.cmake +++ b/i18n-tools/LevelsI18N.cmake @@ -44,7 +44,7 @@ function(generate_chaptertitles_i18n result_translated_chaptertitle_files source foreach(po_file ${po_files}) get_filename_component(po_file_name ${po_file} NAME) - # get language code e.g. "de" + # get language code e.g. "de.po" -> "de" string(REPLACE ".po" "" language_code ${po_file_name}) # generated file for single language set(generated_language_file ${output_chaptertitle_file}.${language_code}) @@ -80,13 +80,94 @@ function(generate_chaptertitles_i18n result_translated_chaptertitle_files source string(REGEX REPLACE "[/\\]" "_" target_suffix ${po_dir}) add_custom_target(level_i18n-${target_suffix} ALL DEPENDS ${translation_signalfile} ${po_clean_signalfile}) + # return the translated files set(${result_translated_chaptertitle_files} ${translated_chaptertitle_files} PARENT_SCOPE) endfunction() ## -# Generate translated level file using po4a +# Generate translated level and help files using po4a ## -function(generate_scene_i18n translated_scene_file_path source_level_file) - # TODO finish level translation... +function(generate_level_i18n result_translated_level_file result_translated_help_files source_level_file help_dir po_dir) + get_filename_component(abs_po_dir ${po_dir} ABSOLUTE) + # generated config file for po4a + set(po4a_cfg_file ${LEVELS_I18N_WORK_DIR}/${po_dir}/scene_po4a.cfg) + # generated dummy file for translation of "E", "D", "F", "P", etc. language letters + set(langchar_file ${LEVELS_I18N_WORK_DIR}/${po_dir}/scene_langchar.txt) + + file(WRITE ${langchar_file} "E") + + # get translations from po directory + file(WRITE ${po4a_cfg_file} "[po_directory] ${abs_po_dir}\n") + # add content of dummy language file to translation + file(APPEND ${po4a_cfg_file} "[type:text] ${langchar_file}") + + get_filename_component(abs_source_level_file ${source_level_file} ABSOLUTE) + set(output_level_file ${LEVELS_I18N_WORK_DIR}/${source_level_file}) + + # translation rule for scene file + file(APPEND ${po4a_cfg_file} "\n[type:colobotlevel] ${abs_source_level_file}") + + file(GLOB po_files ${po_dir}/*.po) + foreach(po_file ${po_files}) + get_filename_component(po_file_name ${po_file} NAME) + # get language code e.g. "de.po" -> "de" + string(REPLACE ".po" "" language_code ${po_file_name}) + # generated file for single language + set(generated_language_file ${output_level_file}.${language_code}) + file(APPEND ${po4a_cfg_file} " \\\n ${language_code}:${generated_language_file}") + endforeach() + + # translation rules for help files + set(output_help_dir ${LEVELS_I18N_WORK_DIR}/${po_dir}/help) + set(translated_help_files "") + + file(GLOB help_files ${help_dir}/*.txt) + list(SORT help_files) + foreach(help_file ${help_files}) + get_filename_component(help_file_name ${help_file} NAME) + + file(APPEND ${po4a_cfg_file} "\n[type:colobothelp] ${help_file}") + foreach(po_file ${po_files}) + get_filename_component(po_file_name ${po_file} NAME) + # get language code e.g. "de.po" -> "de" + string(REPLACE ".po" "" language_code ${po_file_name}) + # get language letter e.g. "de.po" -> "d" + string(REGEX REPLACE ".\\.po" "" language_char ${po_file_name}) + string(TOUPPER ${language_char} language_char) + # generated file for single language + string(REPLACE ".E." ".${language_char}." generated_help_file_name ${help_file_name}) + set(generated_help_file ${output_help_dir}/${generated_help_file_name}) + file(APPEND ${po4a_cfg_file} " \\\n ${language_code}:${generated_help_file}") + + list(APPEND translated_help_files ${generated_help_file}) + endforeach() + endforeach() + + # dummy files to signal that scripts have finished running + set(translation_signalfile ${LEVELS_I18N_WORK_DIR}/${po_dir}/translations) + set(po_clean_signalfile ${LEVELS_I18N_WORK_DIR}/${po_dir}/po_clean) + + # script to run po4a and consolidate the translations + add_custom_command(OUTPUT ${translation_signalfile} + COMMAND ${DATA_SOURCE_DIR}/i18n-tools/scripts/create_translations.sh ${abs_source_level_file} ${output_level_file} ${po4a_cfg_file} ${translation_signalfile} + DEPENDS ${po_files}) + + file(GLOB pot_file ${po_dir}/*.pot) + set(po_files ${po_files} ${pot_file}) + + # script to do some cleanups in updated *.po and *.pot files + string(REPLACE ";" ":" escaped_po_files "${po_files}") + add_custom_command(OUTPUT ${po_clean_signalfile} + COMMAND ${DATA_SOURCE_DIR}/i18n-tools/scripts/clean_po_files.sh ${escaped_po_files} ${translation_signalfile} ${po_clean_signalfile} + DEPENDS ${translation_signalfile} + ) + + # generate some unique string for target name + string(REGEX REPLACE "[/\\]" "_" target_suffix ${po_dir}) + add_custom_target(level_i18n-${target_suffix} ALL DEPENDS ${translation_signalfile} ${po_clean_signalfile}) + + # return the translated files + set(${result_translated_level_file} ${output_level_file} PARENT_SCOPE) + set(${result_translated_help_files} ${translated_help_files} PARENT_SCOPE) endfunction() diff --git a/levels/CMakeLists.txt b/levels/CMakeLists.txt index 8dbd665d..c28da7e7 100644 --- a/levels/CMakeLists.txt +++ b/levels/CMakeLists.txt @@ -44,17 +44,16 @@ endfunction() # Add level directory ## function(add_level level_dir) - if(PO4A) - generate_scene_i18n(translated_scene_path ${level_dir}/scene.txt) + if(PO4A AND EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${level_dir}/po/) + generate_level_i18n(translated_level_file translated_help_files ${level_dir}/scene.txt ${level_dir}/help ${level_dir}/po) else() - set(translated_scene_path ${level_dir}/scene.txt) + set(translated_level_file ${level_dir}/scene.txt) endif() - install(FILES ${translated_scene_path} DESTINATION ${LEVEL_INSTALL_DATA_DIR}/${level_dir}) + install(FILES ${translated_level_file} DESTINATION ${LEVEL_INSTALL_DATA_DIR}/${level_dir}) -# TODO install help files -# if(EXISTS ${level_dir}/help) -# install(DIRECTORY ${level_dir}/help DESTINATION ${LEVEL_INSTALL_DATA_DIR}/${level_dir}) -# endif() + file(GLOB original_help_files ${level_dir}/help/*.txt) + install(FILES ${original_help_files} DESTINATION ${LEVEL_INSTALL_DATA_DIR}/${level_dir}/help) + install(FILES ${translated_help_files} DESTINATION ${LEVEL_INSTALL_DATA_DIR}/${level_dir}/help) endfunction()