2 #===============================================================================
6 # USAGE: ./i18nstats.sh
14 # AUTHOR: Antenore Gatta (tmow), antenore@simbiosi.org
15 # ORGANIZATION: Remmina
16 # CREATED: 30. 01. 19 00:05:25
19 #===============================================================================
21 set -o nounset # Treat unset variables as an error
23 SCRIPTPATH="$( cd "$(dirname "$0")" ; pwd -P )"
24 REMMINATOP="$(dirname "$SCRIPTPATH")"
25 REMTMPDIR="$(mktemp -d)"
26 REMTMPFILE="$(mktemp -p "$REMTMPDIR")"
28 trap "rm -rf $REMTMPDIR" HUP INT QUIT TERM EXIT
31 declare -x UNTRANSLATED
34 #===============================================================================
35 # FUNCTION DEFINITIONS
36 #===============================================================================
38 #-------------------------------------------------------------------------------
39 # TODO: Move these functions in an external library file
40 #-------------------------------------------------------------------------------
43 if [[ -n ${!1:-} ]]; then
48 } # ---------- end of function rem_varhasvalue ----------
51 typeset -p ${1:-} >/dev/null 2>&1 # Not portable, bash specific
52 } # ---------- end of function rem_varisdefined ----------
55 local _cmnhead="${HOSTNAME:=$(hostname)}"
82 # We can add color support adding colors in the beginning
85 # _reset=${RESET:-'\033[0m'}
97 if ! rem_varisdefined DFORMAT ; then
98 local _dateformat='%d/%m/%y %H:%M:%S'
100 local _dateformat=${DFORMAT:-}
102 _msgdate="$(date +"$_dateformat")"
104 # printf "%s%s - [%s] - %s - %s%s\n" "$_color" "$_header" "$_msgdate" "${_cmnhead}" "$_message" "$_reset"
105 printf "%s - [%s] - %s - %s\n" "$_header" "$_msgdate" "${_cmnhead}" "$_message"
107 } # ---------- end of function rem_log ----------
108 #-------------------------------------------------------------------------------
109 # rem_which a poorman which function
110 # Return 0 un success or 1 in case of failure
114 for _tool in "$@" ; do
115 if type "$_tool" >/dev/null 2>&1 ; then
122 rem_log INFO "$_tool found"
125 rem_log ERROR "$_tool not found"
131 } # ---------- end of function rem_which ----------
134 #===============================================================================
136 #===============================================================================
139 if ! rem_which "xgettext" "msgmerge" "git" ; then
140 rem_log ERROR "Some tools have not been found"
144 cd "$REMMINATOP"/po || { rem_log ERROR "$REMMINATOP/po not found" ; exit 1 ; }
146 for _pofile in *po ; do
147 printf "%s: " "$_pofile" ; msgfmt --statistics "$_pofile"
148 done >| "$REMTMPFILE" 2>&1
154 while IFS= read -r _msgstat ; do
155 #rem_log INFO "dealing with data: $_msgstat"
156 if echo "$_msgstat" | grep '^[a-z@_A-Z]\+\.po:.*\.$' >/dev/null 2>&1 ; then
157 _translated="$(echo "$_msgstat" | sed -e 's/\(^[a-z]\+.*: \)\([0-9]\+\)\( \)\(translated messages\?\)\(.*\.$\)/\2/g')"
158 _fuzzy="$(echo "$_msgstat" | sed -e 's/\(^[a-z]\+.* \)\([0-9]\+\)\( \)\(fuzzy translations\?\)\(.*\.$\)/\2/g')"
159 _untranslated="$(echo "$_msgstat" | sed -e 's/\(^[a-z]\+.* \)\([0-9]\+\)\( \)\(untranslated messages\?\)\(.*\.$\)/\2/g')"
165 #rem_log INFO "translated: $_translated"
168 case $_untranslated in
173 #rem_log INFO "untranslated: $_untranslated"
181 #rem_log INFO "fuzzy: $_fuzzy"
184 _pofile="$(echo "$_msgstat" | cut -d: -f1)"
185 #printf "%s %s %s %s\n" "$_pofile" "$_translated" "$_fuzzy" "$_untranslated"
186 _sum=$((_translated + _fuzzy + _untranslated))
187 [[ "$MAX" -lt "$_sum" ]] && MAX="$_sum"
188 # [["0",32],["1",46],["2",28],["3",21],["4",20],["5",13],["6",27]]
189 _tav="$(printf "[\"%s\",%s]," "$_pofile" "$_translated")"
190 TRANSLATED="${TRANSLATED}$_tav"
191 _tav="$(printf "[\"%s\",%s]," "$_pofile" "$_fuzzy")"
192 FUZZY="${FUZZY}$_tav"
193 _tav="$(printf "[\"%s\",%s]," "$_pofile" "$_untranslated")"
194 UNTRANSLATED="${UNTRANSLATED}$_tav"
195 unset _translated _untranslated _fuzzy _tav
198 cat << EOF > "$REMMINATOP"/data/reports/postats.html
199 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
200 <html xmlns="http://www.w3.org/1999/xhtml" lang="en-us">
202 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
203 <title>Remmina Translation Status</title>
204 <script type="text/javascript" src="chartkick.min.js"></script>
205 <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.2/Chart.bundle.js"></script>
206 <script type="text/javascript">
207 Chartkick.CustomChart = function (element, dataSource, options) {
210 <style type="text/css">
214 font-family: "Helvetica Neue", Arial, Helvetica, sans-serif;
224 #multiple-bar-stacked {
230 <div class="container-fluid">
231 <h1>Remmina Translation Status</h1>
232 <div id="multiple-bar-stacked"></div>
233 <script type="text/javascript">
234 new Chartkick.BarChart(
235 "multiple-bar-stacked", [
236 { name: "Translated", data: [${TRANSLATED:0:-1}] },
237 { name: "Fuzzy", data: [${FUZZY:0:-1}] },
238 { name: "Untranslated", data: [${UNTRANSLATED:0:-1}] }
240 { max: ${MAX}, stacked: true }
243 <!--#include virtual="howto-i18n.html" -->