diff options
author | Badlop <badlop@process-one.net> | 2017-09-27 10:24:26 +0200 |
---|---|---|
committer | Badlop <badlop@process-one.net> | 2017-09-27 10:56:58 +0200 |
commit | 9b043ae2760b6a62b90be51d6c4631ae2695a59f (patch) | |
tree | 4fda889ab086783db1a8b93b5e8f5ead39f8f3a4 /tools/prepare-tr.sh | |
parent | Remove forgotten export_all (diff) |
Move prepare-translations.sh from contrib to tools/prepare-tr.sh
Diffstat (limited to 'tools/prepare-tr.sh')
-rwxr-xr-x | tools/prepare-tr.sh | 366 |
1 files changed, 366 insertions, 0 deletions
diff --git a/tools/prepare-tr.sh b/tools/prepare-tr.sh new file mode 100755 index 00000000..98c282cc --- /dev/null +++ b/tools/prepare-tr.sh @@ -0,0 +1,366 @@ +#!/bin/bash + +# Frontend for ejabberd's extract_translations.erl +# by Badlop + +# How to create template files for a new language: +# NEWLANG=zh +# cp msgs/ejabberd.pot msgs/$NEWLANG.po +# echo \{\"\",\"\"\}. > msgs/$NEWLANG.msg +# ../../extract_translations/prepare-translation.sh -updateall + +prepare_dirs () +{ + # Where is Erlang binary + ERL=`which erl` + + EJA_SRC_DIR=$EJA_DIR/src/ + EJA_MSGS_DIR=$EJA_DIR/priv/msgs/ + EXTRACT_DIR=$EJA_DIR/contrib/extract_translations/ + EXTRACT_ERL=$EXTRACT_DIR/extract_translations.erl + EXTRACT_BEAM=$EXTRACT_DIR/extract_translations.beam + + SRC_DIR=$RUN_DIR/src + EBIN_DIR=$RUN_DIR/ebin + MSGS_DIR=$EJA_DIR/priv/msgs + + if !([[ -n $EJA_DIR ]]) + then + echo "ejabberd dir does not exist: $EJA_DIR" + fi + + if !([[ -x $EXTRACT_BEAM ]]) + then + sh -c "cd $EXTRACT_DIR; $ERL -compile $EXTRACT_ERL" + fi +} + +extract_lang () +{ + MSGS_FILE=$1 + MSGS_FILE2=$MSGS_FILE.translate + MSGS_PATH=$MSGS_DIR/$MSGS_FILE + MSGS_PATH2=$MSGS_DIR/$MSGS_FILE2 + + echo -n "Extracting language strings for '$MSGS_FILE':" + + echo -n " new..." + cd $SRC_DIR + $ERL -pa $EXTRACT_DIR -noinput -noshell -s extract_translations -s init stop -extra . $MSGS_PATH >$MSGS_PATH.new + sed -e 's/^% \.\//% /g;' $MSGS_PATH.new > $MSGS_PATH.new2 + mv $MSGS_PATH.new2 $MSGS_PATH.new + + echo -n " old..." + $ERL -pa $EXTRACT_DIR -noinput -noshell -s extract_translations -s init stop -extra -unused . $MSGS_PATH >$MSGS_PATH.unused + find_unused_full $MSGS_FILE $MSGS_FILE.unused + + echo "" >$MSGS_PATH2 + echo " ***** Translation file for ejabberd ***** " >>$MSGS_PATH2 + echo "" >>$MSGS_PATH2 + + echo "" >>$MSGS_PATH2 + echo " *** New strings: Can you please translate them? *** " >>$MSGS_PATH2 + cat $MSGS_PATH.new >>$MSGS_PATH2 + + echo "" >>$MSGS_PATH2 + echo "" >>$MSGS_PATH2 + echo " *** Unused strings: They will be removed automatically *** " >>$MSGS_PATH2 + cat $MSGS_PATH.unused.full >>$MSGS_PATH2 + + echo "" >>$MSGS_PATH2 + echo "" >>$MSGS_PATH2 + echo " *** Already translated strings: you can also modify any of them if you want *** " >>$MSGS_PATH2 + echo "" >>$MSGS_PATH2 + cat $MSGS_PATH.old_cleaned >>$MSGS_PATH2 + + echo " ok" + + rm $MSGS_PATH.new + rm $MSGS_PATH.old_cleaned + rm $MSGS_PATH.unused.full +} + +extract_lang_all () +{ + cd $MSGS_DIR + for i in $( ls *.msg ) ; do + extract_lang $i; + done + + echo -e "File\tMissing\tLanguage\t\tLast translator" + echo -e "----\t-------\t--------\t\t---------------" + cd $MSGS_DIR + for i in $( ls *.msg ) ; do + MISSING=`cat $i.translate | grep "\", \"\"}." | wc -l` + LANGUAGE=`grep "X-Language:" $i.translate | sed 's/% Language: //g'` + LASTAUTH=`grep "Author:" $i.translate | head -n 1 | sed 's/% Author: //g'` + echo -e "$i\t$MISSING\t$LANGUAGE\t$LASTAUTH" + done + + cd $MSGS_DIR + REVISION=`git describe --always` + zip $HOME/ejabberd-langs-$REVISION.zip *.translate; + + rm *.translate +} + +find_unused_full () +{ + DATFILE=$1 + DATFILEI=$1.old_cleaned + DELFILE=$2 + cd msgs + + DATFILE1=$DATFILE.t1 + DATFILE2=$DATFILE.t2 + + DELFILE1=$DELFILE.t1 + DELFILE2=$DELFILE.t2 + DELFILEF=$DATFILE.unused.full + echo "" >$DELFILEF + + grep -v "\\\\" $DELFILE >$DELFILE2 + echo ENDFILEMARK >>$DELFILE2 + cp $DATFILE $DATFILEI + cp $DATFILE $DATFILE2 + + cp $DELFILE2 $DELFILE1 + STRING=`head -1 $DELFILE1` + until [[ $STRING == ENDFILEMARK ]]; do + cp $DELFILE2 $DELFILE1 + cp $DATFILE2 $DATFILE1 + + STRING=`head -1 $DELFILE1` + + cat $DATFILE1 | grep "$STRING" >>$DELFILEF + cat $DATFILE1 | grep -v "$STRING" >$DATFILE2 + cat $DELFILE1 | grep -v "$STRING" >$DELFILE2 + done + + mv $DATFILE2 $DATFILEI + + rm -f $MSGS_PATH.t1 + rm $MSGS_PATH.unused + rm -f $MSGS_PATH.unused.t1 + rm $MSGS_PATH.unused.t2 + + cd .. +} + +extract_lang_srcmsg2po () +{ + LANG=$1 + LANG_CODE=$LANG.$PROJECT + MSGS_PATH=$MSGS_DIR/$LANG_CODE.msg + PO_PATH=$MSGS_DIR/$LANG_CODE.po + + echo $MSGS_PATH + + cd $SRC_DIR + $ERL -pa $EXTRACT_DIR -pa $EBIN_DIR -pa $EJA_SRC_DIR -pa ../include -noinput -noshell -s extract_translations -s init stop -extra -srcmsg2po . $MSGS_PATH >$PO_PATH.1 + sed -e 's/ \[\]$/ \"\"/g;' $PO_PATH.1 > $PO_PATH.2 + msguniq --sort-by-file $PO_PATH.2 --output-file=$PO_PATH + + rm $PO_PATH.* +} + +extract_lang_src2pot () +{ + LANG_CODE=$PROJECT + MSGS_PATH=$MSGS_DIR/$LANG_CODE.msg + POT_PATH=$MSGS_DIR/$LANG_CODE.pot + + echo -n "" >$MSGS_PATH + echo "% Language: Language Name" >>$MSGS_PATH + echo "% Author: Translator name and contact method" >>$MSGS_PATH + echo "" >>$MSGS_PATH + + cd $SRC_DIR + $ERL -pa $EXTRACT_DIR -pa $EBIN_DIR -pa $EJA_SRC_DIR -pa ../include -noinput -noshell -s extract_translations -s init stop -extra -srcmsg2po . $MSGS_PATH >$POT_PATH.1 + sed -e 's/ \[\]$/ \"\"/g;' $POT_PATH.1 > $POT_PATH.2 + + #msguniq --sort-by-file $POT_PATH.2 $EJA_MSGS_DIR --output-file=$POT_PATH + msguniq --sort-by-file $POT_PATH.2 --output-file=$POT_PATH + + rm $POT_PATH.* + rm $MSGS_PATH + + # If the project is a specific module, not the main ejabberd + if [[ $PROJECT != ejabberd ]] ; then + # Remove from project.pot the strings that are already present in the general ejabberd + EJABBERD_MSG_FILE=$EJA_MSGS_DIR/es.po # This is just some file with translated strings + POT_PATH_TEMP=$POT_PATH.temp + msgattrib --set-obsolete --only-file=$EJABBERD_MSG_FILE -o $POT_PATH_TEMP $POT_PATH + mv $POT_PATH_TEMP $POT_PATH + fi +} + +extract_lang_popot2po () +{ + LANG_CODE=$1 + PO_PATH=$MSGS_DIR/$LANG_CODE.po + POT_PATH=$MSGS_DIR/$PROJECT.pot + + msgmerge $PO_PATH $POT_PATH >$PO_PATH.translate 2>/dev/null + mv $PO_PATH.translate $PO_PATH +} + +extract_lang_po2msg () +{ + LANG_CODE=$1 + PO_PATH=$LANG_CODE.po + MS_PATH=$PO_PATH.ms + MSGID_PATH=$PO_PATH.msgid + MSGSTR_PATH=$PO_PATH.msgstr + MSGS_PATH=$LANG_CODE.msg + + cd $MSGS_DIR + + # Check PO has correct ~ + # Let's convert to C format so we can use msgfmt + PO_TEMP=$LANG_CODE.po.temp + cat $PO_PATH | sed 's/%/perc/g' | sed 's/~/%/g' | sed 's/#:.*/#, c-format/g' >$PO_TEMP + msgfmt $PO_TEMP --check-format + result=$? + rm $PO_TEMP + if [ $result -ne 0 ] ; then + exit 1 + fi + + msgattrib $PO_PATH --translated --no-fuzzy --no-obsolete --no-location --no-wrap | grep "^msg" | tail --lines=+3 >$MS_PATH + grep "^msgid" $PO_PATH.ms | sed 's/^msgid //g' >$MSGID_PATH + grep "^msgstr" $PO_PATH.ms | sed 's/^msgstr //g' >$MSGSTR_PATH + echo "%% -*- coding: latin-1 -*-" >$MSGS_PATH + paste $MSGID_PATH $MSGSTR_PATH --delimiter=, | awk '{print "{" $0 "}."}' | sort -g >>$MSGS_PATH + + rm $MS_PATH + rm $MSGID_PATH + rm $MSGSTR_PATH +} + +extract_lang_updateall () +{ + echo "Generating POT" + extract_lang_src2pot + + cd $MSGS_DIR + echo "" + echo -e "File Missing Language Last translator" + echo -e "---- ------- -------- ---------------" + for i in $( ls *.msg ) ; do + LANG_CODE=${i%.msg} + echo -n $LANG_CODE | awk '{printf "%-6s", $1 }' + + # Convert old MSG file to PO + PO=$LANG_CODE.po + [ -f $PO ] || extract_lang_srcmsg2po $LANG_CODE + + extract_lang_popot2po $LANG_CODE + extract_lang_po2msg $LANG_CODE + + MISSING=`msgfmt --statistics $PO 2>&1 | awk '{printf "%5s", $4 }'` + echo -n " $MISSING" + + LANGUAGE=`grep "X-Language:" $PO | sed 's/\"X-Language: //g' | sed 's/\\\\n\"//g' | awk '{printf "%-12s", $1}'` + echo -n " $LANGUAGE" + + LASTAUTH=`grep "Last-Translator" $PO | sed 's/\"Last-Translator: //g' | sed 's/\\\\n\"//g'` + echo " $LASTAUTH" + done + echo "" + rm messages.mo + + cd .. +} + +translation_instructions () +{ + echo "" + echo " A new file has been created for you, with the current, the new and the deprecated strings:" + echo " $MSGS_PATH2" + echo "" + echo " At the end of that file you will find the strings you must update:" + echo " - Untranslated strings are like this: {"March", ""}." + echo " To translate the string, add the text inside the commas. Example:" + echo " {"March", "Marzo"}." + echo " - Old strings that are not used: "Woowoa"" + echo " Search the entire file for those strings and remove them" + echo "" + echo " Once you have translated all the strings and removed all the old ones," + echo " rename the file to overwrite the previous one:" + echo " $MSGS_PATH" +} + +EJA_DIR=`pwd` +RUN_DIR=`pwd` +PROJECT=ejabberd + +while [ $# -ne 0 ] ; do + PARAM=$1 + shift + case $PARAM in + --) break ;; + -project) + PROJECT=$1 + shift + ;; + -ejadir) + EJA_DIR=$1 + shift + ;; + -rundir) + RUN_DIR=$1 + shift + ;; + -lang) + LANGU=$1 + prepare_dirs + extract_lang $LANGU + shift + ;; + -langall) + prepare_dirs + extract_lang_all + ;; + -srcmsg2po) + LANG_CODE=$1 + prepare_dirs + extract_lang_srcmsg2po $LANG_CODE + shift + ;; + -popot2po) + LANG_CODE=$1 + prepare_dirs + extract_lang_popot2po $LANG_CODE + shift + ;; + -src2pot) + prepare_dirs + extract_lang_src2pot + ;; + -po2msg) + LANG_CODE=$1 + prepare_dirs + extract_lang_po2msg $LANG_CODE + shift + ;; + -updateall) + prepare_dirs + extract_lang_updateall + ;; + *) + echo "Options:" + echo " -langall" + echo " -lang LANGUAGE_FILE" + echo " -srcmsg2po LANGUAGE Construct .msg file using source code to PO file" + echo " -src2pot Generate template POT file from source code" + echo " -popot2po LANGUAGE Update PO file with template POT file" + echo " -po2msg LANGUAGE Export PO file to MSG file" + echo " -updateall Generate POT and update all PO" + echo "" + echo "Example:" + echo " ./prepare-translation.sh -lang es.msg" + exit 0 + ;; + esac +done |