wesnoth-l10n-tools/statistics

275 lines
9.7 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# Check translations, generate verbose statistics.
# Copyright (C) 2004 Recai Oktas <roktas@omu.edu.tr>
# Copyright (C) 2007-2008 Andrius Štikonas <stikonas@gmail.com> (my code can also be used under GPLv3 or any later)
# MediaWiki 'glamdrol' style sheet Copyright (C) 2005 by Jordą Polo <jorda AT ettin DOT org> Based on 'monobook', by Gabriel Wicke
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 as published by
# the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
source "$(dirname $0)/variables"
LC_ALL=C
ODD_CHARS='<27>'
CL=0 # counter for css style
STATUS="OK" # Total status of translations
while getopts ":c" opt; do
case $opt in
c)
CORE_TEXTDOMAINS="wesnoth lib editor help ai units multiplayer anl tutorial" ;;
esac
done
for BRANCH in $BRANCHES; do
echo -e "Repository: $BLUE$BRANCH"$ENDCOLOR
STATSFILE="statistics-$BRANCH.html"
ERRORS="translation-errors-$BRANCH"
nerror=0; nwarn=0; npo=0; nt=0; nu=0; nf=0
rm -f $STATSFILE
echo -e "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\"
\"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">
<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\">
<head>
<meta http-equiv=\"content-type\" content=\"application/xhtml+xml; charset=utf-8\" />
<title>Battle for Wesnoth</title>
<link rel=\"stylesheet\" type=\"text/css\" href=\"https://www.wesnoth.org/wesmere/css/wesmere-1.1.0.css\" />
<link rel=\"stylesheet\" type=\"text/css\" href=\"https://www.wesnoth.org/wesmere/css/gettext-1.1.0.css\" />
</head>
<body>
<div id=\"main\">
<div id=\"nav\" role=\"banner\">
<div class=\"centerbox\">
<div id=\"logo\">
<a href=\"https://www.wesnoth.org/\" aria-label=\"Wesnoth logo\"></a>
</div>
<div id=\"nav\">
<ul>
<li><a href=\"https://www.wesnoth.org/\">Home</a></li>
<li><a href=\"https://www.wesnoth.org/wiki/Play\">Play</a></li>
<li><a href=\"https://www.wesnoth.org/wiki/Create\">Create</a></li>
<li><a href=\"https://www.wesnoth.org/forum/\">Forums</a></li>
<li><a href=\"https://www.wesnoth.org/wiki/Support\">Support</a></li>
<li><a href=\"https://www.wesnoth.org/wiki/Project\">Project</a></li>
<li><a href=\"https://www.wesnoth.org/wiki/Credits\">Credits</a></li>
</ul>
</div>
</div>
</div>
</div>
<h1 style=\"display:inline\">Wesnoth translation stats</h1>
<div> <br/> </div><p style=\"display:inline\">Last update: <strong>
$(LC_TIME="en_US.UTF-8" date)
</strong></p>
<div> <br/> </div>
<table class=\"gettext-stats\">
<thead><thead><tr>
<th class=\"title\" scope=\"col\">Textdomain</th>
<th scope=\"col\">Status</th>
<th class=\"translated\" scope=\"col\">Translated</th>
<th class=\"translated percent\" scope=\"col\">%</th>
<th class=\"fuzzy\" scope=\"col\">Fuzzy</th>
<th class=\"fuzzy percent\" scope=\"col\">%</th>
<th class=\"untranslated\" scope=\"col\">Untranslated</th>
<th class=\"untranslated percent\" scope=\"col\">%</th>
<th class=\"strcount\" scope=\"col\">Total</th>
<th class=\"graph\" scope=\"col\">Graph</th></tr></thead>
<tbody><tr>" >> $STATSFILE
if [ -n "$CORE_TEXTDOMAINS" ]; then
POFILES=$BRANCH/$(echo $CORE_TEXTDOMAINS | awk '$NF=$NF "*.po"' OFS="*.po $BRANCH/")
else
POFILES="$BRANCH/*.po"
fi
for files in $POFILES; do
file=$(basename $files)
filename=$(basename $file .po)
npo=$(($npo + 1)); has_errors="no"; has_warnings="no";
# Extract the declared charset, may be we use this in future.
charset=$(sed -n '/^"Content-Type:/ s/.*charset=\([a-zA-Z0-9_-]*\).*/\1/p' "$BRANCH/$file")
echo -n "Checking $file for UTF-8 inconsistencies... "
if $ISUTF8 < "$BRANCH/$file" > /dev/null 2>&1; then
if ! echo $charset | grep -qi "UTF-8"; then
has_errors="yes"
echo -e $RED"FAILED; non UTF-8 charset declaration for UTF-8 content"$ENDCOLOR
echo "$file: non UTF-8 charset declared for UTF-8 content; expect to see 'charset=UTF-8'." >> $ERRORS
else
echo -e $GREEN"OK"$ENDCOLOR
fi
else
if echo $charset | grep -qi "UTF-8"; then
has_errors="yes"
echo -e $RED"FAILED; non UTF-8 content for UTF-8 charset declaration"$ENDCOLOR
echo "$file: UTF-8 charset declared for non UTF-8 content; expect to see a non UTF-8 charset." >> $ERRORS
else
echo -e $GREEN"OK"$ENDCOLOR
fi
fi
echo -n "Checking $file for odd characters... "
if grep -nH $ODD_CHARS "$BRANCH/$file" >> $ERRORS; then
has_warnings="yes"
echo -e $RED"FAILED; odd characters found"$ENDCOLOR
echo "$file: one or more odd character from the '$ODD_CHARS' set found." >> $ERRORS
else
echo -e $GREEN"OK"$ENDCOLOR
fi
# Makes sense only if the file passed the UTF-8 check.
if [ "$has_errors" = "no" ]; then
echo -n "Checking $file with msgfmt... "
if ! LC_MESSAGES=C $MSGFMT --check -o /dev/null "$BRANCH/$file" >> $ERRORS; then
has_errors="yes"
echo -e $RED"FAILED"$ENDCOLOR
else
echo -e $GREEN"OK"$ENDCOLOR
fi
fi
r=0; rf=0; ru=0; t=0; u=0; f=0; rt=0
if [ "$has_errors" = "yes" ]; then
nerror=$(($nerror + 1))
sum=0
st="Error"
if [ $STATUS = "OK" ]; then
STATUS="Error"
fi
if [ $STATUS = "Warning" ]; then
STATUS="Error"
fi
else
stat=$(LC_MESSAGES=C $MSGFMT --statistics -o /dev/null "$BRANCH/$file" 2>&1)
t=$(echo "$stat" | sed -ne 's/\([0-9]\+\) translated .*/\1/p'); t=${t:-0}
u=$(echo "$stat" | sed -ne 's/.* \([0-9]\+\) untranslated .*/\1/p'); u=${u:-0}
f=$(echo "$stat" | sed -ne 's/.* \([0-9]\+\) fuzzy translation.*/\1/p'); f=${f:-0}
sum=$(($t + $f + $u))
if [ ! "$sum" -eq 0 ]; then
rt=$(printf '%s%d%s%d\n' "scale=2; 100*" $t "/" $sum | bc)
fi
if [ ! "$sum" -eq 0 ]; then
rf=$(printf '%s%d%s%d\n' "scale=2; 100*" $f "/" $sum | bc)
fi
if [ ! "$sum" -eq 0 ]; then
ru=$(printf '%s%d%s%d\n' "scale=2; 100*" $u "/" $sum | bc)
fi
nt=$(($nt + $t)); nu=$(($nu + $u)); nf=$(($nf + $f))
st="OK"
if [ "$has_warnings" = "yes" ]; then
nwarn=$(($nwarn + 1))
st='Warning'
if [ "$STATUS" = "OK" ]; then
STATUS='Warning'
fi
fi
fi
echo "<tr class=\"row-$CL\">" >> $STATSFILE
CL=$(( ($CL+1)%2 ))
echo " <td class=\"textdomain-name\" align=\"left\"><strong><a href=\""$BRANCH/$filename.po"\">$(basename $filename)</a></strong></td>
<td align=\"center\">$st</td>
<td class=\"translated\" align=\"right\">$t</td>" >> $STATSFILE
printf '%s%.2f%s\n' " <td class=\"percent\" align=\"right\">" $rt "</td>" >> $STATSFILE
echo " <td class=\"fuzzy\" align=\"right\">$f</td>" >> $STATSFILE
printf '%s%.2f%s\n' " <td class=\"percent\" align=\"right\">" $rf "</td>" >> $STATSFILE
echo " <td class=\"untranslated\" align=\"right\">$u</td>" >> $STATSFILE
printf '%s%.2f%s\n' " <td class=\"percent\" align=\"right\">" $ru "</td>" >> $STATSFILE
echo " <td class=\"strcount\" align=\"right\">$sum</td>" >> $STATSFILE
n4=$(printf '%s%f\n' "scale=2; 9*" $rt | bc)
n6=$(printf '%s%f\n' "scale=2; 9*" $rf | bc)
n8=$(printf '%s%f\n' "scale=2; 9*" $ru | bc)
printf '%s%.2f%s%.2f%s%.2f%s\n' " <td class=\"graph\"><span class=\"stats-bar green-bar\" style=\"width:" $n4 "px\"></span><span class=\"stats-bar blue-bar\" style=\"width:" $n6 "px\"></span><span class=\"stats-bar red-bar\" style=\"width:" $n8 "px\"></span></td>" >> $STATSFILE
echo "</tr>" >> $STATSFILE
done
if [ "$npo" -eq 0 ]; then
echo -e $RED"No '${PO}.po' file under '$BRANCH'."$ENDCOLOR
exit 0
fi
if [ "$nerror" -gt 0 ]; then
echo -n -e $RED"Fatal errors found. See '"
tput smso; echo -n "$ERRORS"; tput rmso
echo -ne "' for details."$ENDCOLOR
echo ""
else
echo -ne $GREEN"No fatal errors found."$ENDCOLOR
echo ""
if [ -s "$ERRORS" ]; then
echo -n -e $RED" See '"
tput smso; echo -n "$ERRORS"; tput rmso
echo -ne "' for warnings."$ENDCOLOR
echo ""
else
rm -f $ERRORS
fi
fi
if [ "$npo" = "$nerror" ]; then
echo -en $RED"All files have fatal errors."$ENDCOLOR
echo ""
else
sum=$((${nt} + ${nf} + ${nu}))
nrt=$(printf '%s%d%s%d\n' "scale=2; 100*" $nt "/" $sum | bc)
nrf=$(printf '%s%d%s%d\n' "scale=2; 100*" $nf "/" $sum | bc)
nru=$(printf '%s%d%s%d\n' "scale=2; 100*" $nu "/" $sum | bc)
echo "<tfoot><tr class=\"teamstats\">
<th class=\"title\" scope=\"row\">Total</th>
<td align=\"center\">$STATUS</td>
<td class=\"translated\">$nt</td>" >> $STATSFILE
printf '%s%.2f%s\n' "<td align=\"right\">" $nrt "</td>" >> $STATSFILE
echo "<td class=\"fuzzy\">$nf</td>" >> $STATSFILE
printf '%s%.2f%s\n' "<td align=\"right\">" $nrf "</td>" >> $STATSFILE
echo "<td class=\"untranslated\">$nu</td>" >> $STATSFILE
printf '%s%.2f%s\n' "<td align=\"right\">" $nru "</td>" >> $STATSFILE
echo "<td class=\"strcount\">$((${nt} + ${nf} + ${nu}))</td>" >> $STATSFILE
nrt=$(printf '%s%f\n' "scale=2; 9*" $nrt | bc)
nrf=$(printf '%s%f\n' "scale=2; 9*" $nrf | bc)
nru=$(printf '%s%f\n' "scale=2; 9*" $nru | bc)
printf '%s%.2f%s%.2f%s%.2f%s\n' " <td class=\"graph\"><span class=\"stats-bar green-bar\" style=\"width:" $nrt "px\"></span><span class=\"stats-bar blue-bar\" style=\"width:" $nrf "px\"></span><span class=\"stats-bar red-bar\" style=\"width:" $nru "px\"></span></td>" >> $STATSFILE
echo "</tr>
</table>
</td>
</tr>
</table>
<div><br/></div>
<div id=\"footer\">
<div id=\"footnote\">
&copy; 2003-"$(date +%Y)" The Battle for Wesnoth<br/>
Site design Copyright © 20172018 by Iris Morelle.
<br/>
</div>
</div>
</div>
</body>
</html>" >> $STATSFILE
fi
done
# Exit with error count just because it may sense.
exit $nerror