First part of rewriting scripts for level translations
* support translating the new chaptertitle.txt files * handle the new directory structure * move writing PO4A config to CMake * use only one bash script to generate translated files * additional step of cleaning *.po and *.pot files * change some PO4A flags for better console output and sorting of messages in *.po filesdev-hd-graphics
parent
41592a8b5a
commit
946a083606
|
@ -18,5 +18,6 @@ install(DIRECTORY sounds DESTINATION ${COLOBOT_INSTALL_DATA_DIR})
|
||||||
install(DIRECTORY textures DESTINATION ${COLOBOT_INSTALL_DATA_DIR})
|
install(DIRECTORY textures DESTINATION ${COLOBOT_INSTALL_DATA_DIR})
|
||||||
install(DIRECTORY DESTINATION ${COLOBOT_INSTALL_DATA_DIR}/mods) # Empty directory
|
install(DIRECTORY DESTINATION ${COLOBOT_INSTALL_DATA_DIR}/mods) # Empty directory
|
||||||
|
|
||||||
|
set(DATA_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
|
||||||
add_subdirectory(help)
|
add_subdirectory(help)
|
||||||
add_subdirectory(levels)
|
add_subdirectory(levels)
|
||||||
|
|
|
@ -1,33 +1,3 @@
|
||||||
cmake_minimum_required(VERSION 2.8)
|
cmake_minimum_required(VERSION 2.8)
|
||||||
|
|
||||||
set(LEVELS_I18N_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../levels-i18n/)
|
# TODO handle help files...
|
||||||
|
|
||||||
# Handle all help categories' translations
|
|
||||||
foreach(LEVEL_CODENAME cbot;object)
|
|
||||||
set(SCENEFILE)
|
|
||||||
set(SCENEDEST)
|
|
||||||
set(PODIR "${LEVEL_CODENAME}/po/")
|
|
||||||
set(HELPDIR "${LEVEL_CODENAME}/")
|
|
||||||
set(HELPDEST "${LEVEL_CODENAME}")
|
|
||||||
message(STATUS "Managing translations for '${LEVEL_CODENAME}' help category")
|
|
||||||
include(${LEVELS_I18N_PATH}/CMakeLists.txt)
|
|
||||||
endforeach()
|
|
||||||
|
|
||||||
set(LEVEL_CODENAME generic)
|
|
||||||
set(SCENEFILE)
|
|
||||||
set(SCENEDEST)
|
|
||||||
set(PODIR "${LEVEL_CODENAME}/po/")
|
|
||||||
set(HELPDIR "${LEVEL_CODENAME}/")
|
|
||||||
set(HELPDEST "")
|
|
||||||
message(STATUS "Managing translations for '${LEVEL_CODENAME}' help category")
|
|
||||||
include(${LEVELS_I18N_PATH}/CMakeLists.txt)
|
|
||||||
|
|
||||||
set(LEVEL_CODENAME bots)
|
|
||||||
set(SCENEFILE)
|
|
||||||
set(SCENEDEST)
|
|
||||||
set(PODIR "${LEVEL_CODENAME}/po/")
|
|
||||||
set(HELPDIR "${LEVEL_CODENAME}/")
|
|
||||||
set(HELPDEST "object/")
|
|
||||||
message(STATUS "Managing translations for '${LEVEL_CODENAME}' help category")
|
|
||||||
include(${LEVELS_I18N_PATH}/CMakeLists.txt)
|
|
||||||
|
|
|
@ -0,0 +1,92 @@
|
||||||
|
##
|
||||||
|
# Meta-infrastructure to allow po-based translation of Colobot help files and scene-description (level) files.
|
||||||
|
##
|
||||||
|
|
||||||
|
find_program(PO4A po4a)
|
||||||
|
|
||||||
|
if(NOT PO4A)
|
||||||
|
message(WARNING "PO4A not found, level files will NOT be translated!")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(LEVEL_INSTALL_DATA_DIR ${COLOBOT_INSTALL_DATA_DIR}/levels)
|
||||||
|
set(HELP_INSTALL_DATA_DIR ${COLOBOT_INSTALL_DATA_DIR}/help)
|
||||||
|
|
||||||
|
set(LEVELS_I18N_WORK_DIR ${CMAKE_CURRENT_BINARY_DIR}/levels-po)
|
||||||
|
|
||||||
|
##
|
||||||
|
# Generate translated chaptertitle files using po4a
|
||||||
|
##
|
||||||
|
function(generate_chaptertitles_i18n result_translated_chaptertitle_files source_chaptertitle_files 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}/chaptertitles_po4a.cfg)
|
||||||
|
# generated dummy file for translation of "E", "D", "F", "P", etc. language letters
|
||||||
|
set(langchar_file ${LEVELS_I18N_WORK_DIR}/${po_dir}/chaptertitles_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}")
|
||||||
|
|
||||||
|
set(abs_source_chaptertitle_files "")
|
||||||
|
set(translated_chaptertitle_files "")
|
||||||
|
|
||||||
|
file(GLOB po_files ${po_dir}/*.po)
|
||||||
|
|
||||||
|
foreach(source_chaptertitle_file ${source_chaptertitle_files})
|
||||||
|
get_filename_component(abs_source_chaptertitle_file ${source_chaptertitle_file} ABSOLUTE)
|
||||||
|
set(output_chaptertitle_file ${LEVELS_I18N_WORK_DIR}/${source_chaptertitle_file})
|
||||||
|
|
||||||
|
# translation rule for chaptertitle file
|
||||||
|
file(APPEND ${po4a_cfg_file} "\n[type:colobotlevel] ${abs_source_chaptertitle_file}")
|
||||||
|
|
||||||
|
foreach(po_file ${po_files})
|
||||||
|
get_filename_component(po_file_name ${po_file} NAME)
|
||||||
|
# get language code e.g. "de"
|
||||||
|
string(REPLACE ".po" "" language_code ${po_file_name})
|
||||||
|
# generated file for single language
|
||||||
|
set(generated_language_file ${output_chaptertitle_file}.${language_code})
|
||||||
|
file(APPEND ${po4a_cfg_file} " \\\n ${language_code}:${generated_language_file}")
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
list(APPEND abs_source_chaptertitle_files ${abs_source_chaptertitle_file})
|
||||||
|
list(APPEND translated_chaptertitle_files ${output_chaptertitle_file})
|
||||||
|
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
|
||||||
|
string(REPLACE ";" ":" escaped_abs_source_chaptertitle_files "${abs_source_chaptertitle_files}")
|
||||||
|
string(REPLACE ";" ":" escaped_translated_chaptertitle_files "${translated_chaptertitle_files}")
|
||||||
|
add_custom_command(OUTPUT ${translation_signalfile}
|
||||||
|
COMMAND ${DATA_SOURCE_DIR}/i18n-tools/scripts/create_translations.sh ${escaped_abs_source_chaptertitle_files} ${escaped_translated_chaptertitle_files} ${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})
|
||||||
|
|
||||||
|
set(${result_translated_chaptertitle_files} ${translated_chaptertitle_files} PARENT_SCOPE)
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
##
|
||||||
|
# Generate translated level file using po4a
|
||||||
|
##
|
||||||
|
function(generate_scene_i18n translated_scene_file_path source_level_file)
|
||||||
|
# TODO finish level translation...
|
||||||
|
endfunction()
|
||||||
|
|
|
@ -0,0 +1,28 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Stop on errors
|
||||||
|
set -e
|
||||||
|
|
||||||
|
if [ $# -ne 3 ]; then
|
||||||
|
echo "Invalid arguments!" >&2
|
||||||
|
echo "Usage: $0 po_file1[:po_file2;...] translation_signalfile po_clean_signalfile" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
PO_FILES="$1"
|
||||||
|
TRANSLATION_SIGNALFILE="$2"
|
||||||
|
PO_CLEAN_SIGNALFILE="$3"
|
||||||
|
|
||||||
|
IFS=':' read -a po_files_array <<< "$PO_FILES"
|
||||||
|
|
||||||
|
for po_file in "${po_files_array[@]}"; do
|
||||||
|
# strip unnecessary part of file names
|
||||||
|
sed -i -E 's|^#: .*(levels/.*)$|#: \1|' "$po_file"
|
||||||
|
# remove the creation date
|
||||||
|
sed -i -E 's|^("POT-Creation-Date:).*$|\1 DATE\\n"|' "$po_file"
|
||||||
|
done
|
||||||
|
|
||||||
|
# update the dummy signal files to indicate success
|
||||||
|
# we also have to touch translation signalfile because it's supposed to be modified later than po files
|
||||||
|
touch "$TRANSLATION_SIGNALFILE"
|
||||||
|
touch "$PO_CLEAN_SIGNALFILE"
|
|
@ -0,0 +1,54 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Stop on errors
|
||||||
|
set -e
|
||||||
|
|
||||||
|
if [ $# -ne 4 ]; then
|
||||||
|
echo "Invalid arguments!" >&2
|
||||||
|
echo "Usage: $0 source_file1[:source_file2:...] output_file1[:output_file2:...] po4a_config_file translation_signalfile" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
SOURCE_FILES="$1"
|
||||||
|
OUTPUT_FILES="$2"
|
||||||
|
PO4A_FILE="$3"
|
||||||
|
TRANSLATION_SIGNALFILE="$4"
|
||||||
|
|
||||||
|
# get the directory where the script is in
|
||||||
|
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||||
|
|
||||||
|
# generate translated files using po4a
|
||||||
|
if [ -n "$VERBOSE" ]; then
|
||||||
|
verbosity="-v"
|
||||||
|
else
|
||||||
|
verbosity="-q"
|
||||||
|
fi
|
||||||
|
PERL5LIB="${SCRIPT_DIR}/perllib${PERL5LIB+:}$PERL5LIB" po4a -k0 $verbosity -f "$PO4A_FILE" --msgmerge-opt -F
|
||||||
|
|
||||||
|
IFS=':' read -a source_files_array <<< "$SOURCE_FILES"
|
||||||
|
IFS=':' read -a output_files_array <<< "$OUTPUT_FILES"
|
||||||
|
|
||||||
|
for index in "${!source_files_array[@]}"; do
|
||||||
|
source_file="${source_files_array[index]}"
|
||||||
|
output_file="${output_files_array[index]}"
|
||||||
|
|
||||||
|
# generate output file
|
||||||
|
echo -n "" > "$output_file"
|
||||||
|
|
||||||
|
# first, write original English headers
|
||||||
|
sed -n '/^Title/p;/^Resume/p;/^ScriptName/p' "$source_file" >> "$output_file"
|
||||||
|
|
||||||
|
# now, copy translated headers from translated files
|
||||||
|
# (translated files are named output file + suffix with language code)
|
||||||
|
for translated_file in $output_file.*; do
|
||||||
|
sed -n '/^Title/p;/^Resume/p;/^ScriptName/p' "$translated_file" >> "$output_file"
|
||||||
|
done
|
||||||
|
echo "// End of level headers translations" >> "$output_file"
|
||||||
|
echo "" >> "$output_file"
|
||||||
|
|
||||||
|
# copy the rest of source file, excluding headers
|
||||||
|
sed -e '/^Title/d;/^Resume/d;/^ScriptName/d' "$source_file" >> "$output_file"
|
||||||
|
done
|
||||||
|
|
||||||
|
# update the dummy signal file to indicate success
|
||||||
|
touch "$TRANSLATION_SIGNALFILE"
|
|
@ -26,11 +26,11 @@ sub initialize {}
|
||||||
|
|
||||||
sub parse {
|
sub parse {
|
||||||
my $self=shift;
|
my $self=shift;
|
||||||
my ($line,$ref);
|
my ($line,$line_source);
|
||||||
my $parE;
|
my $language_char;
|
||||||
|
|
||||||
LINE:
|
LINE:
|
||||||
($line,$ref)=$self->shiftline();
|
($line,$line_source)=$self->shiftline();
|
||||||
|
|
||||||
while (defined($line)) {
|
while (defined($line)) {
|
||||||
chomp($line);
|
chomp($line);
|
||||||
|
@ -43,9 +43,9 @@ sub parse {
|
||||||
# One char just after the .
|
# One char just after the .
|
||||||
$line =~ m/\.(.)/;
|
$line =~ m/\.(.)/;
|
||||||
my $E = $1;
|
my $E = $1;
|
||||||
if( not $parE ) {
|
if (not $language_char) {
|
||||||
# Take this one-char only once
|
# Take this one-char only once
|
||||||
$parE = $self->translate($E, '', 'One-char language identifier');
|
$language_char = $self->translate($E, '', 'One-char language identifier');
|
||||||
}
|
}
|
||||||
|
|
||||||
# The text between .E and first quote
|
# The text between .E and first quote
|
||||||
|
@ -58,17 +58,27 @@ sub parse {
|
||||||
my $subtype_2 = $6;
|
my $subtype_2 = $6;
|
||||||
my $quoted_2 = $7;
|
my $quoted_2 = $7;
|
||||||
my $spacing_3 = $8;
|
my $spacing_3 = $8;
|
||||||
$ref =~ m#^(.*)/(.*)\.txt.*$#;
|
|
||||||
my $code;
|
my $code;
|
||||||
if( $2 eq 'scene' ) {
|
|
||||||
$code = $1;
|
# levels/<category>/chapterXXX/chaptertitle.txt
|
||||||
} else {
|
if ($line_source =~ m#^.*/levels/([^/]*)/chapter([0-9]{3})/chaptertitle\.txt.*$#) {
|
||||||
$code = $2;
|
$code = $1.".".$2; # e.g. challenges.001
|
||||||
}
|
}
|
||||||
my $par_1 = $self->translate($code.":".$quoted_1, $ref, $type."-".$subtype_1);
|
# levels/<category>/chapterXXX/levelYYY/scene.txt
|
||||||
|
elsif ($line_source =~ m#^.*/levels/[^/]*/chapter([0-9]{3})/level([0-9]{3})/scene\.txt.*$#) {
|
||||||
|
$code = $1.".".$2.".".$3; # e.g. challenges.001.002
|
||||||
|
}
|
||||||
|
# fallback case
|
||||||
|
else {
|
||||||
|
$line_source =~ m#^.*/([^/]*)$#;
|
||||||
|
$code = $1;
|
||||||
|
}
|
||||||
|
|
||||||
|
my $par_1 = $self->translate($code.":".$quoted_1, $line_source, $type."-".$subtype_1);
|
||||||
$par_1 =~ s/^\D*\d*://;
|
$par_1 =~ s/^\D*\d*://;
|
||||||
if( $secondpart ) {
|
if ($secondpart) {
|
||||||
my $par_2 = $self->translate($code.":".$quoted_2, $ref, $type."-".$subtype_2);
|
my $par_2 = $self->translate($code.":".$quoted_2, $line_source, $type."-".$subtype_2);
|
||||||
$par_2 =~ s/^\D*\d*://;
|
$par_2 =~ s/^\D*\d*://;
|
||||||
|
|
||||||
# This is awkward, but works
|
# This is awkward, but works
|
||||||
|
@ -78,14 +88,13 @@ sub parse {
|
||||||
$spacing_2 =~ s/\n/\\n/g;
|
$spacing_2 =~ s/\n/\\n/g;
|
||||||
|
|
||||||
# Now push the result
|
# Now push the result
|
||||||
$self->pushline($type.'.'.$parE.$spacing_1.$subtype_1.'="'.$par_1.'"'.$spacing_2."\n");
|
$self->pushline($type.'.'.$language_char.$spacing_1.$subtype_1.'="'.$par_1.'"'.$spacing_2."\n");
|
||||||
}
|
}
|
||||||
else
|
else {
|
||||||
{
|
|
||||||
$self->pushline("$line\n");
|
$self->pushline("$line\n");
|
||||||
}
|
}
|
||||||
# Reinit the loop
|
# Reinit the loop
|
||||||
($line,$ref)=$self->shiftline();
|
($line,$line_source)=$self->shiftline();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,120 +0,0 @@
|
||||||
cmake_minimum_required(VERSION 2.8)
|
|
||||||
|
|
||||||
# Meta-infrastructure to allow po-based translation of Colobot help files and scene-description (level) files.
|
|
||||||
|
|
||||||
# set(LEVELS_I18N_PATH ${CMAKE_CURRENT_SOURCE_DIR})
|
|
||||||
|
|
||||||
# set(LEVEL_CODENAME "scene100")
|
|
||||||
# set(SCENEFILE "scene100/scene.txt")
|
|
||||||
# set(SCENEDEST "scene101.txt") # If unset , use the same name as SCENEFILE
|
|
||||||
# set(PODIR "scene100/po/")
|
|
||||||
# set(HELPDIR "scene100/help/")
|
|
||||||
# set(HELPDEST "")
|
|
||||||
|
|
||||||
project(colobot-level-${LEVEL_CODENAME} NONE)
|
|
||||||
|
|
||||||
if(NOT DEFINED COLOBOT_INSTALL_DATA_DIR)
|
|
||||||
set(COLOBOT_INSTALL_DATA_DIR ${CMAKE_INSTALL_PREFIX}/share/games/colobot CACHE PATH "Colobot shared data directory")
|
|
||||||
endif()
|
|
||||||
set(LEVEL_INSTALL_DATA_DIR ${COLOBOT_INSTALL_DATA_DIR}/levels/)
|
|
||||||
set(HELP_INSTALL_DATA_DIR ${COLOBOT_INSTALL_DATA_DIR}/help/)
|
|
||||||
|
|
||||||
# Translate translatable material
|
|
||||||
find_program(PO4A po4a)
|
|
||||||
|
|
||||||
if(NOT PO4A)
|
|
||||||
message(WARNING "PO4A not found, level files will NOT be translated!")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
### STEP 3 # Inject translations in levels
|
|
||||||
set(_levels_i18n_target "levels_i18n")
|
|
||||||
|
|
||||||
file(GLOB levelfiles "${CMAKE_CURRENT_SOURCE_DIR}/${SCENEFILE}")
|
|
||||||
foreach(levelfile ${levelfiles})
|
|
||||||
if(DEFINED SCENEDEST)
|
|
||||||
get_filename_component(_scenedest ${SCENEDEST} NAME)
|
|
||||||
else()
|
|
||||||
get_filename_component(_scenedest ${levelfile} NAME)
|
|
||||||
endif()
|
|
||||||
get_filename_component(_levelfile ${levelfile} NAME_WE)
|
|
||||||
if(PO4A AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${PODIR}")
|
|
||||||
file(GLOB pofiles "${CMAKE_CURRENT_SOURCE_DIR}/${PODIR}/*.po")
|
|
||||||
add_custom_command(OUTPUT ${_levels_i18n_target}/${_scenedest}
|
|
||||||
COMMAND mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/${_levels_i18n_target}
|
|
||||||
COMMAND ${LEVELS_I18N_PATH}/scripts/03_inject_translations.sh ${levelfile} ${CMAKE_CURRENT_BINARY_DIR}/${LEVEL_CODENAME}/${_levelfile} ${PODIR} ${CMAKE_CURRENT_BINARY_DIR}/${_levels_i18n_target}/${_scenedest}
|
|
||||||
DEPENDS po4a-${LEVEL_CODENAME} ${pofiles}
|
|
||||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
|
||||||
COMMENT "${LEVEL_CODENAME}: Inject translation in ${_scenedest}"
|
|
||||||
)
|
|
||||||
else()
|
|
||||||
add_custom_command(OUTPUT ${_levels_i18n_target}/${_scenedest}
|
|
||||||
COMMAND mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/${_levels_i18n_target}
|
|
||||||
COMMAND cp ${levelfile} ${CMAKE_CURRENT_BINARY_DIR}/${_levels_i18n_target}/${_scenedest}
|
|
||||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
|
||||||
COMMENT "${LEVEL_CODENAME}: Move untranslatable ${_scenedest}"
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
add_custom_target(level_i18n-${LEVEL_CODENAME}_${_levelfile} ALL DEPENDS ${_levels_i18n_target}/${_scenedest})
|
|
||||||
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${_levels_i18n_target}/${_scenedest}
|
|
||||||
DESTINATION ${LEVEL_INSTALL_DATA_DIR})
|
|
||||||
endforeach()
|
|
||||||
|
|
||||||
file(GLOB helpfiles "${CMAKE_CURRENT_SOURCE_DIR}/${HELPDIR}/E/*.txt")
|
|
||||||
list(SORT helpfiles)
|
|
||||||
|
|
||||||
if(PO4A AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${PODIR}")
|
|
||||||
foreach(helpfile ${helpfiles})
|
|
||||||
get_filename_component(_helpfile_we ${helpfile} NAME_WE)
|
|
||||||
get_filename_component(_helpfile ${helpfile} NAME)
|
|
||||||
|
|
||||||
### STEP 4 # Put translated help files in the correct place
|
|
||||||
set(_help_i18n_target "help_i18n_${LEVEL_CODENAME}_${_helpfile_we}")
|
|
||||||
add_custom_command(OUTPUT moved-all-${LEVEL_CODENAME}-${_helpfile}
|
|
||||||
COMMAND mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/${_help_i18n_target}
|
|
||||||
COMMAND ${LEVELS_I18N_PATH}/scripts/04_move_helpfiles_to_paths.sh ${LEVEL_CODENAME} ${LEVEL_CODENAME}-help/${_helpfile} ${_help_i18n_target} '${HELPDIR}' '${HELPDEST}' ${CMAKE_CURRENT_SOURCE_DIR} > moved-all-${LEVEL_CODENAME}-${_helpfile}
|
|
||||||
DEPENDS po4a-${LEVEL_CODENAME}
|
|
||||||
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
|
|
||||||
COMMENT "${LEVEL_CODENAME}: Move ${_helpfile} translations around"
|
|
||||||
)
|
|
||||||
add_custom_target(help_i18n-${LEVEL_CODENAME}_${_helpfile_we} ALL DEPENDS moved-all-${LEVEL_CODENAME}-${_helpfile})
|
|
||||||
install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${_help_i18n_target}/
|
|
||||||
DESTINATION ${HELP_INSTALL_DATA_DIR})
|
|
||||||
|
|
||||||
endforeach()
|
|
||||||
elseif(DEFINED HELPDIR AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${HELPDIR}")
|
|
||||||
set(_help_i18n_target "help_i18n_${LEVEL_CODENAME}")
|
|
||||||
add_custom_command(OUTPUT moved-all-${LEVEL_CODENAME}
|
|
||||||
COMMAND mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/${_help_i18n_target}
|
|
||||||
COMMAND ${LEVELS_I18N_PATH}/scripts/05_move_untranslated_helpfiles_to_paths.sh '${_help_i18n_target}' '${HELPDEST}' '${CMAKE_CURRENT_SOURCE_DIR}/${HELPDIR}' > moved-all-${LEVEL_CODENAME}-${_helpfile}
|
|
||||||
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
|
|
||||||
COMMENT "${LEVEL_CODENAME}: Move untranslatable help files"
|
|
||||||
)
|
|
||||||
add_custom_target(help_i18n-${LEVEL_CODENAME} ALL DEPENDS moved-all-${LEVEL_CODENAME})
|
|
||||||
install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${_help_i18n_target}/
|
|
||||||
DESTINATION ${HELP_INSTALL_DATA_DIR})
|
|
||||||
|
|
||||||
endif()
|
|
||||||
|
|
||||||
|
|
||||||
#### STEP 1 # Create po4a.cfg file out of the list of files
|
|
||||||
add_custom_command(OUTPUT po4a-${LEVEL_CODENAME}.cfg
|
|
||||||
COMMAND ${LEVELS_I18N_PATH}/scripts/01_create_po4a_file.sh ${CMAKE_CURRENT_SOURCE_DIR} ${PODIR} ${LEVEL_CODENAME} '${SCENEFILE}' '${HELPDIR}/E' > ${CMAKE_CURRENT_BINARY_DIR}/po4a-${LEVEL_CODENAME}.cfg
|
|
||||||
COMMENT "${LEVEL_CODENAME}: Create po4a configuration file"
|
|
||||||
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
|
|
||||||
)
|
|
||||||
|
|
||||||
if(PO4A AND EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${PODIR})
|
|
||||||
#### STEP 2 # Run po4a
|
|
||||||
file(GLOB pofiles "${CMAKE_CURRENT_SOURCE_DIR}/${PODIR}/*.po")
|
|
||||||
add_custom_command(OUTPUT po4a-ran-${LEVEL_CODENAME}
|
|
||||||
COMMAND ${LEVELS_I18N_PATH}/scripts/02_run_po4a.sh ${LEVELS_I18N_PATH} ${CMAKE_CURRENT_BINARY_DIR}/po4a-${LEVEL_CODENAME}.cfg
|
|
||||||
COMMAND touch po4a-ran-${LEVEL_CODENAME}
|
|
||||||
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/po4a-${LEVEL_CODENAME}.cfg ${pofiles}
|
|
||||||
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
|
|
||||||
COMMENT "${LEVEL_CODENAME}: Run po4a to generate the translated files out of the .po files")
|
|
||||||
add_custom_target(po4a-${LEVEL_CODENAME} DEPENDS po4a-ran-${LEVEL_CODENAME})
|
|
||||||
else()
|
|
||||||
message(STATUS "${LEVEL_CODENAME}: No translation needed or possible")
|
|
||||||
file(GLOB levelfiles "${CMAKE_CURRENT_SOURCE_DIR}/levels/*.txt")
|
|
||||||
install(FILES ${levelfiles} DESTINATION ${LEVEL_INSTALL_DATA_DIR}/)
|
|
||||||
endif()
|
|
|
@ -1,54 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
# MUST be run from ${CMAKE_CURRENT_BINARY_DIR}
|
|
||||||
|
|
||||||
srcdir=$1 # absolute
|
|
||||||
PODIR=$2 # relative
|
|
||||||
LEVEL_CODENAME=$3 # relative
|
|
||||||
SCENEFILE=$4 # relative
|
|
||||||
HELPDIR=$5 # relative
|
|
||||||
|
|
||||||
if [ ! -d $LEVEL_CODENAME-po -o -h $LEVEL_CODENAME-po ]; then
|
|
||||||
rm -f $LEVEL_CODENAME-po
|
|
||||||
ln -sf $srcdir/$PODIR $LEVEL_CODENAME-po
|
|
||||||
fi
|
|
||||||
echo "[po_directory] $LEVEL_CODENAME-po"
|
|
||||||
|
|
||||||
# Create a pseudo file for the translation of the language code
|
|
||||||
echo "[type:text] ${LEVEL_CODENAME}.languagecode \$lang:${LEVEL_CODENAME}.\$lang.languagecode"
|
|
||||||
echo "E" > ${LEVEL_CODENAME}.languagecode
|
|
||||||
|
|
||||||
# Create symlink for relative paths in po4a
|
|
||||||
mkdir -p $LEVEL_CODENAME
|
|
||||||
|
|
||||||
if [ -n "$SCENEFILE" ]; then
|
|
||||||
# Levels are precompiled, they are already in the current dir
|
|
||||||
for scene in $(cd $srcdir/; ls $SCENEFILE); do
|
|
||||||
scene_=$(basename $scene .txt)
|
|
||||||
$(cd $LEVEL_CODENAME;
|
|
||||||
if [ ! -f $scene_.txt -o -h $scene_.txt ]; then
|
|
||||||
rm -f $scene_.txt;
|
|
||||||
ln -sf $srcdir/$scene $scene_.txt;
|
|
||||||
fi
|
|
||||||
)
|
|
||||||
echo "[type:colobotlevel] $LEVEL_CODENAME/$scene_.txt \$lang:$LEVEL_CODENAME/$scene_.\$lang.txt"
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Create symlink for relative paths in po4a
|
|
||||||
mkdir -p $LEVEL_CODENAME-help
|
|
||||||
|
|
||||||
if [ -d $srcdir/$HELPDIR ]; then
|
|
||||||
for helpfile in $(cd $srcdir/$HELPDIR; ls *.txt); do
|
|
||||||
helpfile_=$(basename $helpfile .txt)
|
|
||||||
$(cd $LEVEL_CODENAME-help;
|
|
||||||
if [ ! -f $helpfile_.txt -o -h $helpfile_.txt ]; then
|
|
||||||
rm -f $helpfile_.txt;
|
|
||||||
ln -sf $srcdir/$HELPDIR/$helpfile $helpfile_.txt;
|
|
||||||
fi
|
|
||||||
)
|
|
||||||
echo "[type:colobothelp] $LEVEL_CODENAME-help/$helpfile_.txt \$lang:$LEVEL_CODENAME-help/$helpfile_.\$lang.txt"
|
|
||||||
done
|
|
||||||
fi
|
|
|
@ -1,10 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
LEVELS_I18N_PATH=$1
|
|
||||||
PO4A_FILE=$2
|
|
||||||
|
|
||||||
export PERL5LIB=${LEVELS_I18N_PATH}/scripts/perllib${PERL5LIB+:}$PERL5LIB
|
|
||||||
|
|
||||||
po4a -k0 -v -f $PO4A_FILE
|
|
|
@ -1,31 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
levelfile=$1
|
|
||||||
translations_prefix=$2
|
|
||||||
PODIR=$3
|
|
||||||
targetfile=$4
|
|
||||||
|
|
||||||
rootfilename=$(basename $translations_prefix)
|
|
||||||
|
|
||||||
# Autodetect translated languages
|
|
||||||
script_path=$(dirname $0)
|
|
||||||
linguas=$(cd $PODIR/; ls *.po | sed -e 's/\.po$//g')
|
|
||||||
|
|
||||||
echo -n "" > $targetfile
|
|
||||||
|
|
||||||
# Make sure we take english (first, but it's not really important)
|
|
||||||
for lang in en $linguas; do
|
|
||||||
dotlang=".$lang"
|
|
||||||
if [ "$lang" = "en" ]; then
|
|
||||||
dotlang="";
|
|
||||||
fi
|
|
||||||
i18nfile=$translations_prefix$dotlang.txt
|
|
||||||
if [ -f $i18nfile ]; then
|
|
||||||
sed -n '/^Title/p;/^Resume/p;/^ScriptName/p' $i18nfile >> $targetfile
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
echo "// End of level headers translations" >> $targetfile
|
|
||||||
echo "" >> $targetfile
|
|
||||||
sed -e '/^Title/d;/^Resume/d;/^ScriptName/d' $levelfile >> $targetfile
|
|
|
@ -1,42 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
codename=$1
|
|
||||||
orig_file=$2
|
|
||||||
dest_dir=$3
|
|
||||||
HELPDIR=$4
|
|
||||||
HELPDEST=$5
|
|
||||||
CMAKE_CURRENT_SOURCE_DIR=$6
|
|
||||||
|
|
||||||
orig_l10n_file=$(basename $orig_file .txt)
|
|
||||||
orig_l10n_dir=$(dirname $orig_file)
|
|
||||||
|
|
||||||
# Get all language codes
|
|
||||||
for lcodef in $(ls ${codename}.*.languagecode); do
|
|
||||||
# Get the one-letter language code
|
|
||||||
LCODE=$(cat $lcodef)
|
|
||||||
lang=$(echo $lcodef | sed -e 's/.*\.\(.*\)\.languagecode/\1/')
|
|
||||||
# Foreach, rename the source files
|
|
||||||
mkdir -p $dest_dir/$LCODE/$HELPDEST
|
|
||||||
|
|
||||||
orig_trans=$CMAKE_CURRENT_SOURCE_DIR/$HELPDIR/$LCODE/$orig_l10n_file.txt
|
|
||||||
|
|
||||||
# Copy the translated file to the correct pathi
|
|
||||||
if [ -e $orig_l10n_dir/$orig_l10n_file.$lang.txt ]; then
|
|
||||||
cp -Lf $orig_l10n_dir/$orig_l10n_file.$lang.txt $dest_dir/$LCODE/$HELPDEST/$orig_l10n_file.txt
|
|
||||||
# Mark the source file that the translation is supposed to replace # Replace false by true to make it happen
|
|
||||||
if [ -e $orig_trans ] && false; then
|
|
||||||
sed -e '/Obsoleted translation/d;/This translated file/d' $orig_trans >$orig_trans.temp
|
|
||||||
echo "\\\\b; Obsoleted translation\nThis translated file has been replaced by it's PO-based counterpart and should be removed.\n" > $orig_trans
|
|
||||||
cat $orig_trans.temp >> $orig_trans
|
|
||||||
rm $orig_trans.temp
|
|
||||||
fi
|
|
||||||
elif [ -e $orig_trans ]; then
|
|
||||||
cp -Lf $orig_trans $dest_dir/$LCODE/$HELPDEST/$orig_l10n_file.txt
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
mkdir -p $dest_dir/E/$HELPDEST
|
|
||||||
# Copy the english file to the correct path too
|
|
||||||
cp -Lf $orig_file $dest_dir/E/$HELPDEST/$orig_l10n_file.txt
|
|
|
@ -1,14 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
HELP_I18N_TARGET=$1
|
|
||||||
HELPDEST=$2
|
|
||||||
HELPDIR_FULL=$3
|
|
||||||
|
|
||||||
for langdir in $(ls ${HELPDIR_FULL}); do
|
|
||||||
if [ "$langdir" != "po" ]; then
|
|
||||||
mkdir -p ${HELP_I18N_TARGET}/$langdir/${HELPDEST}
|
|
||||||
cp ${HELPDIR_FULL}/$langdir/* ${HELP_I18N_TARGET}/$langdir/${HELPDEST}/
|
|
||||||
fi
|
|
||||||
done
|
|
|
@ -1,31 +1,62 @@
|
||||||
cmake_minimum_required(VERSION 2.8)
|
cmake_minimum_required(VERSION 2.8)
|
||||||
|
|
||||||
set(LEVELS_I18N_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../levels-i18n/)
|
include(../i18n-tools/LevelsI18N.cmake)
|
||||||
|
|
||||||
# Handle level headers' translations
|
##
|
||||||
file(GLOB levelheaders_po ${CMAKE_CURRENT_SOURCE_DIR}/*-po/)
|
# Add level category directory with all chapters inside
|
||||||
foreach(levelheader_po ${levelheaders_po})
|
##
|
||||||
string(REPLACE "-po" "" levelheader ${levelheader_po})
|
function(add_level_category level_category_dir)
|
||||||
get_filename_component(LEVEL_CODENAME ${levelheader} NAME)
|
file(GLOB chaptertitle_files RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${level_category_dir}/chapter*/chaptertitle.txt)
|
||||||
set(SCENEFILE "${LEVEL_CODENAME}*.txt")
|
if(PO4A AND EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${level_category_dir}/po/)
|
||||||
set(SCENEDEST)
|
generate_chaptertitles_i18n(translated_chaptertitle_files "${chaptertitle_files}" ${level_category_dir}/po)
|
||||||
set(PODIR "${LEVEL_CODENAME}-po/")
|
else()
|
||||||
set(HELPDIR)
|
set(translated_chaptertitle_files ${chaptertitle_files})
|
||||||
set(HELPDEST "")
|
endif()
|
||||||
message(STATUS "Manage translations for level headers '${LEVEL_CODENAME}*'")
|
|
||||||
include(${LEVELS_I18N_PATH}/CMakeLists.txt)
|
|
||||||
endforeach()
|
|
||||||
|
|
||||||
# Handle all levels' translations
|
file(GLOB chapter_dirs RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${level_category_dir}/chapter*)
|
||||||
file(GLOB levelcategories_paths ${CMAKE_CURRENT_SOURCE_DIR}/*/scene.txt)
|
list(LENGTH chapter_dirs chapter_dirs_count)
|
||||||
foreach(levelcategory_path ${levelcategories_paths})
|
math(EXPR iterate_range "${chapter_dirs_count} - 1")
|
||||||
string(REPLACE "//scene.txt" "" levelcategory ${levelcategory_path})
|
foreach(index RANGE ${iterate_range})
|
||||||
get_filename_component(LEVEL_CODENAME ${levelcategory} NAME_WE)
|
list(GET chapter_dirs ${index} chapter_dir)
|
||||||
set(SCENEFILE "${LEVEL_CODENAME}/scene.txt")
|
list(GET translated_chaptertitle_files ${index} translated_chaptertitle_file)
|
||||||
set(SCENEDEST "${LEVEL_CODENAME}.txt")
|
install(FILES ${translated_chaptertitle_file} DESTINATION ${LEVEL_INSTALL_DATA_DIR}/${chapter_dir})
|
||||||
set(PODIR "${LEVEL_CODENAME}/po/")
|
endforeach()
|
||||||
set(HELPDIR "${LEVEL_CODENAME}/help/")
|
|
||||||
set(HELPDEST "")
|
file(GLOB chapter_dirs RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${level_category_dir}/chapter*)
|
||||||
message(STATUS "Managing translations for level '${LEVEL_CODENAME}'")
|
foreach(chapter_dir ${chapter_dirs})
|
||||||
include(${LEVELS_I18N_PATH}/CMakeLists.txt)
|
add_chapter(${chapter_dir})
|
||||||
endforeach()
|
endforeach()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
##
|
||||||
|
# Add chapter directory with all levels inside
|
||||||
|
##
|
||||||
|
function(add_chapter chapter_dir)
|
||||||
|
file(GLOB level_dirs RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${chapter_dir}/level*)
|
||||||
|
foreach(level_dir ${level_dirs})
|
||||||
|
add_level(${level_dir})
|
||||||
|
endforeach()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
##
|
||||||
|
# Add level directory
|
||||||
|
##
|
||||||
|
function(add_level level_dir)
|
||||||
|
if(PO4A)
|
||||||
|
generate_scene_i18n(translated_scene_path ${level_dir}/scene.txt)
|
||||||
|
else()
|
||||||
|
set(translated_scene_path ${level_dir}/scene.txt)
|
||||||
|
endif()
|
||||||
|
install(FILES ${translated_scene_path} 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()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
|
||||||
|
add_level_category(challenges)
|
||||||
|
add_level_category(exercises)
|
||||||
|
add_level_category(freemissions)
|
||||||
|
add_level_category(missions)
|
||||||
|
|
Loading…
Reference in New Issue