Localization: also localize demos and tests
[scilab.git] / scilab / tools / localization / updateLocalizationModule.sh
1 #!/bin/bash
2 # Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 # Copyright (C) INRIA - 2007-2008 - Sylvestre Ledru
4 # Copyright (C) DIGITEO - 2009-2011 - Sylvestre Ledru
5 # Copyright (C) DIGITEO - 2011-2011 - Bruno JOFRET
6 # Copyright (C) Scilab Enterprises - 2015 - Clement DAVID
7 #
8 # Copyright (C) 2012 - 2016 - Scilab Enterprises
9 #
10 # This file is hereby licensed under the terms of the GNU GPL v2.0,
11 # pursuant to article 5.3.4 of the CeCILL v.2.1.
12 # This file was originally licensed under the terms of the CeCILL v2.1,
13 # and continues to be available under such terms.
14 # For more information, see the COPYING file which you should have received
15 # along with this program.
16
17 # This script goes into a module and updates the localization file by checking
18 # the _( and gettext( calls in the code
19
20 # This script process all source files as "C" like language and perform extra 
21 # conversion of scilab code.
22 #
23
24 if test $# -ne 1; then
25     echo "This script goes into a module and updates the localization file "
26     echo "by checking the _(xxx), _W() and gettext(xxx) calls in the code"
27     echo "It creates the locales directory for C, C++, Java and Scilab script"
28     echo
29     echo "Syntax : $0 <module>"
30     echo "If <module> is equal to 'process_all', it will parse all Scilab module"
31     echo "per module"
32     exit 42
33 fi
34
35 if test -z "$SCI"; then
36     echo "Please define the variable SCI"
37     exit 42
38 fi
39
40 MODULES=$1
41 # Process all the modules and build the list
42 if test "$MODULES" = "process_all"; then
43     echo ".. Process all the modules one by one"
44     MODULES=`find $SCI/modules/ -maxdepth 1 -type d -printf '%P\n' ! -name ".*" ! -name 'javasci'`
45 else
46     MODULES=`echo $MODULES|sed -e 's|./||'` # avoid to have ./module_name
47 fi
48
49 XGETTEXT=/usr/bin/xgettext
50 FROM_CODE=UTF-8
51 EXTENSIONS=( 'c' 'h' 'cpp' 'hxx' 'java' )
52 EXTENSIONS_SCILAB=( sci sce start quit )
53 TARGETDIR=locales
54 HEADER_TEMPLATE=$SCI/modules/localization/data/header.pot
55 TIMEZONE="+0100"
56 # Gettext arg
57 XGETTEXT_OPTIONS="--add-location --strict --keyword=_ --keyword=_W --from-code $FROM_CODE --omit-header --no-wrap --sort-by-file"
58
59 function preprocess_xml() {
60 #
61 # Process XML files, both help or xslt
62 #
63     COMMON_SED='s/&amp;/\&/g'
64
65     FILES=$(ls $* 2>/dev/null)
66     [ -z "$FILES" ] && return
67     FAKE_C_FILE=$(printf "%s/src/%s_fake_xml.c" $PATHTOPROCESS $MODULE)
68
69     # remove line which does NOT contain label
70     sed  -e '/label/!s/.*//'  -e 's/.*label="\([^"]*\)".*/gettext("\1")/' -e '/^$/d' -e $COMMON_SED $FILES > $FAKE_C_FILE
71     # extract the content of the label and switch it to a gettext fake instruction
72     sed  -e '/tooltiptext/!s/.*//'  -e 's/.*tooltiptext="\([^"]*\)".*/gettext("\1")/' -e '/^$/d' -e $COMMON_SED $FILES >> $FAKE_C_FILE
73     # remove empty lines
74     sed -e 's/.*_(\([^"]*\)).*/gettext("\1")/' $FILES >> $FAKE_C_FILE
75 }
76
77 function generate_find_command() {
78     # Setting the shell's Internal Field Separator to null
79     OLD_IFS=$IFS
80     IFS=''
81     # Create a string containing "colors[*]"
82     local array_string="$1[*]"
83     # assign loc_array value to ${colors[*]} using indirect variable reference
84     local EXT=(${!array_string})
85 #
86 # Retrieve all the sources files
87     FILESCMD="find $PATHS -type f "
88 #######¬†GENERATES THE FIND COMMAND
89     i=0
90     NB_ELEMENT=${#EXT[@]}
91
92     while [ "$i" -lt "$NB_ELEMENT" ]; do
93         ext=${EXT[$i]}
94         FILESCMD="$FILESCMD -name '*.$ext'"
95         if test "$NB_ELEMENT" -ne `expr $i + 1`; then # because we don't want a trailing -o
96             FILESCMD="$FILESCMD -o "
97         fi
98         i=$((i + 1))
99     done
100     # Resetting IFS to default
101     IFS=$OLD_IFS
102 }
103
104 function process_src() {
105     PATHS=$(ls -d $* 2>/dev/null)
106     [ -z "$PATHS" ] && return
107
108     generate_find_command EXTENSIONS
109     [ -z "$FILESCMD" ] && return
110     FILES=`eval $FILESCMD|sort |tr "\n" " "`
111
112     # It is Scilab code... xgettext does not how to process it
113     XGETTEXT_OPTIONS="$XGETTEXT_OPTIONS --language=C"
114
115     echo "..... Source files in"
116     printf "....... %s\n" $*
117     $XGETTEXT $XGETTEXT_OPTIONS -p $PATHTOPROCESS/$TARGETDIR -o ${MODULE}_src.pot $FILES >/dev/null 2>>xgettext_errors.log
118 }
119
120 function process_scilab_code() {
121     PATHS=$(ls -d $* 2>/dev/null)
122     [ -z "$PATHS" ] && return
123
124     generate_find_command EXTENSIONS_SCILAB
125     FILES=`eval $FILESCMD|sort |tr "\n" " "`
126
127     # It is Scilab code... xgettext does not how to process it
128     XGETTEXT_OPTIONS="$XGETTEXT_OPTIONS --language=C"
129
130     if test "$MODULE" = "core"; then
131         # We want some strings from the ROOTDIR when it is the core module
132         FILES="$FILES `ls $SCI/etc/scilab.*`"
133     fi
134
135     echo "..... Scilab scripts in"
136     printf "....... %s\n" $*
137     $XGETTEXT $XGETTEXT_OPTIONS -p $PATHTOPROCESS/$TARGETDIR -o ${MODULE}_scilab.pot $FILES >/dev/null 2>>xgettext_errors.log
138
139     # Post-process
140     if test -f $PATHTOPROCESS/$TARGETDIR/${MODULE}_scilab.pot; then
141         # Empty file => no string found
142         # We are modifing on the fly Scilab localization files
143         #
144         # We need C strings format to be used as gettext key
145         # "" -> \"
146         # '' -> '
147         # '" -> \"
148         # "' -> '
149         sed -i -e "s/\"\"/\\\"/g" -e "s/''/'/g" -e "s/'\"/\\\"/g" $PATHTOPROCESS/$TARGETDIR/${MODULE}_scilab.pot
150         # We introduced invalid tag [msgstr "] and [msgid "]
151         # restore them [msgstr ""] and [msgid ""]
152         sed -i -e "s/msgstr \"$/msgstr \"\"/" -e "s/msgid \"$/msgid \"\"/" $PATHTOPROCESS/$TARGETDIR/${MODULE}_scilab.pot
153     fi
154 }
155
156 function merge_pot() {
157
158     if test  -z "$CreationDate"; then
159         # File not existing before ... Set the current date a POT-Creation-Date
160         sed -e "s/MODULE/$MODULE/" -e "s/CREATION-DATE/`date +'%Y-%m-%d %H:%M'`$TIMEZONE/" -e "s/REVISION-DATE/`date +'%Y-%m-%d %H:%M'`$TIMEZONE/" $HEADER_TEMPLATE > $LOCALIZATION_FILE_US
161     else
162         sed -e "s/MODULE/$MODULE/" -e "s/CREATION-DATE/$CreationDate/" -e "s/REVISION-DATE/`date +'%Y-%m-%d %H:%M'`$TIMEZONE/" $HEADER_TEMPLATE > $LOCALIZATION_FILE_US
163     fi
164
165     for f in $PATHTOPROCESS/$TARGETDIR/${MODULE}_{src,scilab}.pot; do
166         [ -f $f ] && msgcat $f >> $LOCALIZATION_FILE_US.tmp
167         [ $? -eq 0 ] && rm -f $f
168     done
169     [ -f $LOCALIZATION_FILE_US.tmp ] && msguniq -u $LOCALIZATION_FILE_US.tmp >>$LOCALIZATION_FILE_US
170     rm -f $LOCALIZATION_FILE_US.tmp
171
172     MSGCOUNT=$(msgcat $LOCALIZATION_FILE_US |grep msgid |wc -l)
173     if test $? -ne 0; then
174         echo "Badly formated localization files"
175         cd -
176         exit 32
177     fi
178     if test $MSGCOUNT -le 1 ; then
179         # empty template. Kill it!
180         rm -f $LOCALIZATION_FILE_US
181     fi
182 }
183
184 function upgrade_po() {
185     # for all available languages, upgrade the po files
186     for f in $1/*.po; do
187         msguniq --use-first -o $f $f &>/dev/null ;
188         msgmerge -U  $1/${MODULE}.pot &>/dev/null ;
189     done
190 }
191
192
193 rm -f xgettext_errors.log # cleanup the error log
194 cd $SCI # use relative path to SCI
195 for MODULE in $MODULES; do
196
197     PATHTOPROCESS=modules/$MODULE
198     if test ! -d $PATHTOPROCESS; then
199         echo "... Cannot find module $PATHTOPROCESS"
200         cd - >/dev/null
201         exit -1
202     fi
203     echo "... Processing \"$MODULE\""
204     LOCALIZATION_FILE_US=$PATHTOPROCESS/$TARGETDIR/${MODULE}.pot
205
206     if test ! -d $PATHTOPROCESS/$TARGETDIR; then mkdir $PATHTOPROCESS/$TARGETDIR; fi
207     if test -f $LOCALIZATION_FILE_US; then
208         # Localization file already existing. Retrieve POT-Creation-Date
209         CreationDate=`grep POT-Creation-Date: $LOCALIZATION_FILE_US|sed -e 's|\"POT-Creation-Date: \(.*\)\\\n\"|\1|'`
210     fi
211  
212     preprocess_xml $PATHTOPROCESS/etc/*.x*l $PATHTOPROCESS/etc/*.x*l
213     process_scilab_code $PATHTOPROCESS/macros $PATHTOPROCESS/etc $PATHTOPROCESS/demos $PATHTOPROCESS/tests
214     process_src $PATHTOPROCESS/sci_gateway $PATHTOPROCESS/src
215     rm -f $PATHTOPROCESS/src/${MODULE}_fake_xml.c
216     merge_pot $PATHTOPROCESS/locales/*.pot
217     upgrade_po $PATHTOPROCESS/locales
218
219 done # Browse modules
220 cd - >/dev/null
221