]> git.lyx.org Git - lyx.git/blobdiff - po/postats.sh
Martin's changes to the Note inset.
[lyx.git] / po / postats.sh
index 973e2cfffcd612a80715400fcb6f9af3878a6661..d5f956b80eb6299de16fb5fa52af3ba02034ac19 100755 (executable)
@@ -7,7 +7,7 @@
 #
 # author: Michael Schmitt, michael.schmitt@teststep.org
 #
-# This script extracts some information from the po file headers (last 
+# This script extracts some information from the po file headers (last
 # translator, revision date), generates the corresponding gmo files
 # to retrieve the number of translated/fuzzy/untranslated messages,
 # and generates a PHP web page.
 #    postats.sh po_files > "pathToWebPages"/i18n.php3
 
 
-# *** The PHP header ***
+warning () {
+       echo $* 1>&2
+}
 
+
+error () {
+       warning $*
+       exit 1
+}
+
+
+# $1 is a string like
+# '588 translated messages, 1248 fuzzy translations, 2 untranslated messages.'
+# Any one of these substrings may not appear if the associated number is 0.
+# 
+# $2 is the word following the number to be extracted,
+# ie, 'translated', 'fuzzy', or 'untranslated'.
+#
+# extract_number fills var $number with this number, or sets it to zero if the
+# word is not found in the string.
+extract_number () {
+       test $# -eq 2 || error 'extract_number expects 2 args'
+
+       number=0
+       echo $1 | grep $2 >/dev/null || return
+       # It /is/ safe to use 'Z' as a delimiter here.
+       number=`echo $1 | sed "s/\([0-9]*\)[ ]*$2/Z\1Z/" | cut -d 'Z' -f 2`
+}
+
+
+# $template is used by run_msgfmt, below, to fill $output. The function extracts
+# the appropriate values from the data.
+template="array ( 'langcode' => 'LC',
+\"msg_tr\" => TR, \"msg_fu\" => FU, \"msg_nt\" => NT,
+\"translator\" => \"AUTHOR\", \"email\" => \"EMAIL\",
+\"date\" => \"DATE\" )"
+readonly template
+
+
+# $1 is the name of the po file.
+#
+# The function runs msgfmt on it and fills var $output.
+# All other variables created in the function are unset on exit.
+run_msgfmt () {
+       test $# -eq 1 || error 'run_msgfmt expects 1 arg'
+
+       output=
+       test -f $1 || {
+               warning "File $1 does not exist"  
+               return
+       }
+
+       origdir=`pwd`
+       dir=`dirname $1`
+       pofile=`basename $1`
+       gmofile=`echo $pofile | sed 's/po$/gmo/'`
+       test $pofile != '' -a $pofile != $gmofile || {
+               warning "File $1 is not a po file"  
+               unset origdir dir pofile gmofile
+               return
+       }
+
+       cd $dir
+       unset dir
+
+       langcode=`echo $pofile | sed 's/\.po$//'`
+
+       # Searching for a string of the form
+       # '"PO-Revision-Date: 2003-01-18 03:00+0100\n"'
+       date=`grep 'Revision-Date' $pofile | sed 's/  */ /g' | cut -d ' ' -f 2`
+
+       # Searching for a string of the form
+       # '"Last-Translator: Michael Schmitt <Michael.Schmitt@teststep.org>\n"'
+       translator=
+       email=
+       input=`grep "Last-Translator" $pofile` && {
+               input=`echo $input | sed 's/  */ /g' | cut -d ' ' -f 2-`
+
+               translator=`echo $input | cut -d '<' -f 1 | sed 's/ *$//'`
+               email=`echo $input | cut -d '<' -f 2 | cut -d '>' -f 1`
+       }
+       unset input
+
+       # Run msgfmt on the pofile, filling $message with the raw info.
+       message=`$msgfmt --statistics -o $gmofile $pofile 2>&1 | grep "^[1-9]"` || {
+               warning "Unable to run msgfmt successfully on file $1"
+               cg $origdir
+               unset origdir pofile gmofile
+               return
+       }
+       unset pofile gmofile
+
+       extract_number "$message" 'translated'
+       translated=$number
+
+       extract_number "$message" 'fuzzy'
+       fuzzy=$number
+
+       extract_number "$message" 'untranslated'
+       untranslated=$number
+       unset message number
+
+       output=`echo "$template" | sed "s/LC/$langcode/; \
+               s/TR/$translated/; s/FU/$fuzzy/; s/NT/$untranslated/; \
+               s/AUTHOR/$translator/; s/EMAIL/$email/; s/DATE/$date/"`
+
+       unset langcode date translator email untranslated fuzzy translated
+       cd $origdir
+       unset origdir
+}
+
+
+# The head of the generated php file.
+dump_head () {
 cat <<EOF
-<? 
+<?
        // What's the title of the page?
        \$title = "LyX i18n";
        // What's the short name of the page in the navigation bar?
@@ -34,161 +146,158 @@ cat <<EOF
 
        error_reporting(E_ALL);
 ?>
+
+<?
+\$podata = array (
 EOF
+}
 
-# *** The po file analysis ***
 
-echo "<?"
-echo "\$podata = array ( "
-first=true
-for x
+# The foot of the generated php file.
+dump_tail () {
+cat <<EOF
+<?
+\$lang = array(
+       'bg' => 'Bulgarian',
+       'ca' => 'Catalan',
+       'cs' => 'Czech',
+       'da' => 'Danish',
+       'de' => 'German',
+       'es' => 'Spanish',
+       'eu' => 'Basque',
+       'fi' => 'Finnish',
+       'fr' => 'French',
+       'he' => 'Hebrew',
+       'hu' => 'Hungarian',
+       'it' => 'Italian',
+       'nl' => 'Dutch',
+       'no' => 'Norwegian',
+       'pl' => 'Polish',
+       'pt' => 'Portuguese',
+       'ro' => 'Romanian',
+       'ru' => 'Russian',
+       'sk' => 'Slovak',
+       'sl' => 'Slovenian',
+       'sv' => 'Swedish',
+       'tr' => 'Turkish',
+       'wa' => 'Walloon'
+);
+
+\$noOfMsg = \$podata[0]['msg_tr'] + \$podata[0]['msg_fu'] + \$podata[0]['msg_nt'];
+
+function cmp (\$a, \$b) {
+       if (\$a['msg_tr'] == \$b['msg_tr']) {
+               return 0;
+       }
+       return (\$a['msg_tr'] > \$b['msg_tr']) ? -1 : 1;
+}
+
+usort (\$podata, "cmp");
+?>
+
+<p>
+       The following table details the current state of the translations of the
+       LyX GUI for the main LyX development branch (currently 1.3.0cvs).
+       Unfortunately, only a few languages are well-supported. The LyX term may,
+       therefore, decide to exclude some of the translations from a formal
+       release in order not to confuse the user with a strongly mixed-language
+       interface.
+</p>
+<p>
+       Explanation:
+</p>
+<ul>
+       <li><i>Translated:</i> The number of translated messages</li>
+       <li><i>Fuzzy:</i> The number of fuzzy messages; these are not considered
+           for LyX output but solely serve as a hint for the translators</li>
+       <li><i>Untranslated:</i> The number of untranslated messages; the
+           default language (i.e., English) will be used in the LyX outputs</li>
+</ul>
+<table class="center" frame="box" rules="all" border="2" cellpadding="5">
+<thead>
+       <tr>
+               <td>Language</td>
+               <td>Translated</td>
+               <td>Fuzzy</td>
+               <td>Untranslated</td>
+               <td>Revision Date</td>
+               <td>Translator</td>
+       </tr>
+</thead>
+<tbody>
+<?
+while (list(\$foo,\$info) = each(\$podata)) {
+       print "<tr>";
+
+       if ( \$info['msg_tr'] > \$noOfMsg * 2 / 3 ) {
+               \$style="style='background:#009900'";
+       } else if ( \$info['msg_tr'] > \$noOfMsg / 2 ) {
+               \$style="style='background:#AAAA00'";
+       } else {
+               \$style="style='background:#AA3333'";
+       }
+
+       print "<td \$style>" . \$lang[\$info['langcode']] . "</td>";
+
+       print "<td \$style align=\"right\">" . \$info['msg_tr'] . "</td>";
+
+       print "<td \$style align=\"right\">";
+       if (isset(\$info['msg_fu'])) {
+               print \$info['msg_fu'];
+       } else {
+               print "0";
+       }
+       print "</td>";
+
+       print "<td \$style align=\"right\">";
+       if (isset(\$info['msg_nt'])) {
+               print \$info['msg_nt'];
+       } else {
+               print "0";
+       }
+       print "</td>";
+
+       print "<td \$style align=\"center\">" . \$info['date'] . "</td>";
+
+       print "<td \$style>";
+       if (\$info['email'] == "") {
+               print \$info['translator'];
+       } else {
+               print "<a href=\"mailto:" . \$info['email'] . "\">" .
+                       \$info['translator'] . "</a>";
+       }
+       print "</td>";
+
+       print "</tr>\n";
+}
+?>
+</tbody>
+</table>
+<?
+include("end.php3");
+?>
+EOF
+}
+
+
+# The main body of the script
+msgfmt=`which msgfmt`
+test $msgfmt != '' || error "Unable to find 'msgfmt'. Cannot proceed." 
+
+dump_head
+
+while [ $# -ne 0 ]
 do
-       if [ $first == true ] ; then 
-               first=false ;
+       run_msgfmt $1
+       shift
+       if [ $# -eq 0 ]; then
+               echo "${output});"
+               echo '?>'
        else
-               echo ", " ;
+               echo "${output},"
+               echo
        fi
-       y=`basename $x .po`
-       echo "array ( 'langcode' => '$y', "
-       touch $x
-       make 2>&1 $y.gmo | grep "^[1-9]" | 
-               sed -e 's/\([0-9]*\) translated m[a-z]*[.,]/"msg_tr" => \1,/' |
-               sed -e 's/\([0-9]*\) fuzzy t[a-z]*[.,]/"msg_fu" => \1,/' |
-               sed -e 's/\([0-9]*\) untranslated m[a-z]*./"msg_nt" => \1,/'
-       # Format: "Last-Translator: Michael Schmitt <Michael.Schmitt@teststep.org>\n"
-       grep "Last-Translator" $x | 
-               sed -e 's/"Last-Translator: \(.*\)\( *\)<\(.*\)>\\n"/"translator" => "\1", "email" => "\3", /'
-       # Format: "PO-Revision-Date: 2003-01-18 03:00+0100\n"
-       grep "PO-Revision-Date" $x |
-               sed -e 's/"PO-Revision-Date: \(.*\) .*/"date" => "\1" )/'
 done
-echo ");"
-echo "?>"
 
-# *** The PHP core part ***
-
-cat <<EOF
-       <?
-               \$lang = array(
-                               'bg' => 'Bulgarian',
-                               'ca' => 'Catalan',
-                               'cs' => 'Czech',
-                               'da' => 'Danish',
-                               'de' => 'German',
-                               'es' => 'Spanish',
-                               'eu' => 'Basque',
-                               'fi' => 'Finnish',
-                               'fr' => 'French',
-                               'he' => 'Hebrew',
-                               'hu' => 'Hungarian',
-                               'it' => 'Italian',
-                               'nl' => 'Dutch',
-                               'no' => 'Norwegian',
-                               'pl' => 'Polish',
-                               'pt' => 'Portuguese',
-                               'ro' => 'Romanian',
-                               'ru' => 'Russian',
-                               'sk' => 'Slovak',
-                               'sl' => 'Slovenian',
-                               'sv' => 'Swedish',
-                               'tr' => 'Turkish',
-                               'wa' => 'Wallon'
-                            ); 
-
-               \$noOfMsg = \$podata[0]['msg_tr'] + \$podata[0]['msg_fu'] + \$podata[0]['msg_nt'];
-
-               function cmp (\$a, \$b) {
-                       if (\$a['msg_tr'] == \$b['msg_tr']) {
-                               return 0;
-                       }
-                       return (\$a['msg_tr'] > \$b['msg_tr']) ? -1 : 1;
-               }
-
-               usort (\$podata, "cmp");
-       ?>
-
-       <p>
-               The following table lists all translations available with the number of messages 
-               given for the LyX main development branch (currently 1.3.0cvs). 
-               Unfortunately, only a few languages are well-supported.
-               For every release, the LyX development team may decide to exclude some of the 
-               translations from the distribution in order not to confuse the user by a strongly
-               mixed-language interface.
-       </p>
-       <p>
-               Explanation:
-               <ul>
-               <li><i>Translated:</i> The number of translated messages</li>
-               <li><i>Fuzzy:</i> The number of fuzzy messages; these are not considered 
-                   for LyX output but solely serve as a hint for the translators</li>
-               <li><i>Untranslated:</i> The number of untranslated messages; the
-                   default language (i.e., English) will be used in the LyX outputs</li>
-               </ul>
-       </p>
-       <table align=center frame=box rules=all border="2" cellpadding="5">
-               <thead>
-                       <tr>
-                               <td>Language</td>
-                               <td>Translated</td>
-                               <td>Fuzzy</td>
-                               <td>Untranslated</td>
-                               <td>Revision Date</td>
-                               <td>Translator</td>
-                       </tr>
-               </thead>
-               <tbody>
-                       <?
-                               while (list(\$foo,\$info) = each(\$podata)) {
-                                       print "<tr>";
-
-                                       if ( \$info['msg_tr'] > \$noOfMsg * 2 / 3 ) {
-                                               \$style="style='background:#009900'";
-                                       } else if ( \$info['msg_tr'] > \$noOfMsg / 2 ) {
-                                               \$style="style='background:#AAAA00'";
-                                       } else {
-                                               \$style="style='background:#AA3333'";
-                                       }
-
-                                       print "<td \$style>" . \$lang[\$info['langcode']] . "</td>";
-
-                                       print "<td \$style align=right>" . \$info['msg_tr'] . "</td>";
-
-                                       print "<td \$style align=right>";
-                                       if (isset(\$info['msg_fu'])) {
-                                               print \$info['msg_fu'];
-                                       } else {
-                                               print "0";
-                                       }
-                                       print "</td>";
-
-                                       print "<td \$style align=right>";
-                                       if (isset(\$info['msg_nt'])) {
-                                               print \$info['msg_nt'];
-                                       } else {
-                                               print "0";
-                                       }
-                                       print "</td>";
-
-                                       print "<td \$style align=center>" . \$info['date'] . "</td>";
-
-                                       print "<td \$style>";
-                                       if (\$info['email'] == "") {
-                                               print \$info['translator'];
-                                       } else {
-                                               print "<a href=\"mailto:" . \$info['email'] . "\">" .
-                                                     \$info['translator'] . "</a>";
-                                       }
-                                       print "</td>";
-
-                                       print "</tr>\n";
-                               }
-                       ?>
-               </tbody>
-       </table>
-EOF
-
-cat <<EOF
-       <? 
-               include("end.php3"); 
-       ?>
-EOF
+dump_tail
+# The end