2009-03-19 12:02:43 +00:00
#!/usr/bin/perl
2012-10-06 13:10:25 +02:00
###########################################################################
# tsstat.pl
# ---------------------
# begin : March 2009
# copyright : (C) 2009 by Juergen E. Fischer
# email : jef at norbit dot de
###########################################################################
# #
# This program is free software; you can redistribute it and/or modify #
# it under the terms of the GNU General Public License as published by #
# the Free Software Foundation; either version 2 of the License, or #
# (at your option) any later version. #
# #
###########################################################################
2009-03-19 12:02:43 +00:00
use strict ;
2013-06-06 22:59:37 +02:00
use warnings ;
2009-03-19 12:02:43 +00:00
use Locale::Language ;
use Locale::Country ;
2009-03-20 22:21:10 +00:00
my @ lang ;
2014-07-11 18:49:35 +02:00
# script to generate a html list of the qgis application translations
2012-04-14 15:10:00 +02:00
# showing the percentage finished and the names of the translators
# without argument it generates html which is used in the about-dialog of the application
# output to std-out, to be piped to doc/TRANSLATORS so it can be used in dialog
# scripts/tsstat.pl > doc/TRANSLATORS
# this version needs flag images from the resources
# with argument 'site' a more complete html page is create to be used on a website
# scripts/tsstat.pl site > page.html
# this version needs flag images in a directory 'flags'
# translator names here as a hash where the key is the lang_country code used for the ts file name
my $ translators = {
2014-05-07 01:14:02 +02:00
af = > '' ,
2014-07-15 18:50:24 +02:00
ar = > 'Ichaouia Amine, Hosham Munier' ,
2012-05-25 16:42:20 +02:00
bg = > 'Захари Савов, Jordan Tzvetkov' ,
2014-01-28 18:01:59 +01:00
bs = > 'Almir Karabegovic' ,
2014-07-15 18:50:24 +02:00
ca = > 'Albert F, Pau Reguant Ridó, Xavier Roijals' ,
cs = > 'Jan Helebrant, Martin Landa, Peter Antolik, Martin Dzurov, Stanislav Horáček' ,
2014-02-20 22:29:07 +07:00
da = > 'Jacob Overgaard Madsen, Bo Victor Thomsen' ,
2012-05-25 16:42:20 +02:00
de = > 'Jürgen E. Fischer, Stephan Holl, Otto Dassau, Werner Macho' ,
2012-10-08 15:47:42 +02:00
es = > 'Carlos Dávila, Javier César Aldariz, Gabriela Awad, Edwin Amado, Mayeul Kauffmann, Diana Galindo' ,
2014-07-15 18:50:24 +02:00
el = > 'Theodoros Vakkas, Ioannis Tsimpiris, Evripidis Argyropoulos, Mike Pegnigiannis, Nikos Ves' ,
2014-01-28 18:01:59 +01:00
et = > 'Veiko Viil' ,
2013-05-27 21:02:53 +02:00
eu = > 'Asier Sarasua Garmendia, Irantzu Alvarez' ,
2013-06-06 09:06:18 +02:00
fa = > 'Mola Pahnadayan, Masoud Pashotan , Masoud Erfanyan' ,
2013-06-14 15:33:05 +02:00
fi = > 'Kari Salovaara, Marko Järvenpää' ,
2014-02-20 23:26:56 +01:00
fr = > 'Stéphane Brunner, Olivier Dalang, Nicolas Damien, Michael Douchin, Régis Haubourg, Matthias Khun, Sylvain Maillard, Jean-Roc Morreale, Mehdi Semchaoui' ,
2013-08-19 14:08:25 +02:00
gl = > 'Xan Vieiro' ,
2013-11-13 08:56:23 +02:00
hi = > 'Harish Kumar Solanki' ,
2012-05-25 16:42:20 +02:00
hu = > 'Zoltan Siki' ,
2014-01-28 18:01:59 +01:00
hr = > 'Zoran Jankovic' ,
2014-06-11 16:20:51 +01:00
is = > 'Ásta Kristín Óladóttir, Thordur Ivarsson' ,
2014-07-15 18:50:24 +02:00
id = > 'Emir Hartato, Muhammad Iqnaul Haq Siregar, Trias Aditya, Januar V. Simarmata, I Made Anombawa' ,
2013-09-03 16:04:40 +02:00
it = > 'Roberto Angeletti, Michele Beneventi, Marco Braida, Stefano Campus, Luca Casagrande, Paolo Cavallini, Giuliano Curti, Luca Delucchi, Alessandro Fanna, Michele Ferretti, Matteo Ghetta, Anne Gishla, Maurizio Napolitano, Flavio Rigolon' ,
2013-05-27 20:33:27 +02:00
ja = > 'BABA Yoshihiko, Yoichi Kayama, Minoru Akagi, Takayuki Nuimura, Takayuki Mizutani, Norihiro Yamate' ,
2014-01-28 18:01:59 +01:00
ka = > 'Shota Murtskhvaladze, George Machitidze' ,
2013-03-19 08:02:52 +01:00
km = > 'Khoem Sokhem' ,
2014-01-28 18:01:59 +01:00
ko = > 'OSGeo Korean Chapter' ,
2013-01-04 15:41:08 +01:00
lo = > 'Anousak Souphavanh, Soukanh Lathsavong' ,
2012-05-25 16:42:20 +02:00
lv = > 'Maris Nartiss, Pēteris Brūns' ,
2013-11-22 19:41:25 +02:00
lt = > 'Paulius Litvinas, Tomas Straupis, Kestas M' ,
2014-01-28 18:01:59 +01:00
ml = > 'Vinayan Parameswaran' ,
2012-05-25 16:42:20 +02:00
mn = > 'Bayarmaa Enkhtur' ,
2013-10-15 20:22:35 +02:00
mr = > '' ,
2014-01-28 18:01:59 +01:00
nb = > 'James Stott, Maléne Peterson' ,
2014-07-15 18:50:24 +02:00
nl = > 'Richard Duivenvoorde, Raymond Nijssen, Carlo van Rijswijk, Diethard Jansen, Willem Hoffmans, Dick Groskamp' ,
2014-01-28 18:01:59 +01:00
pl = > 'Robert Szczepanek, Milena Nowotarska, Borys Jurgiel, Mateusz Łoskot, Tomasz Paul, Andrzej Świąder ' ,
2014-07-11 18:49:35 +02:00
pt_BR = > 'Sidney Schaberle Goveia, Arthur Nanni, Marcelo Soares Souza, Narcélio de Sá Pereira Filho, Leônidas Descovi Filho, Felipe Sodré Barros ' ,
2014-02-25 11:34:00 +01:00
pt_PT = > 'Giovanni Manghi, Joana Simões, Duarte Carreira, Alexandre Neto, Pedro Pereira, Pedro Palheiro, Nelson Silva, Ricardo Sena, Leandro Infantini, João Gaspar' ,
2014-07-11 18:49:35 +02:00
ro = > 'Sorin Călinică, Lonut Losifescu-Enescu, Bogdan Pacurar' ,
2014-04-18 23:37:47 +02:00
ru = > 'Alexander Bruy, Artem Popov' ,
2013-06-03 15:53:44 +02:00
sk = > 'Lubos Balazovic, Jana Kormanikova, Ivan Mincik' ,
2014-01-28 18:01:59 +01:00
sl = > 'Jože Detečnik, Dejan Gregor, Jaka Kranjc' ,
sq = > '' ,
2012-10-16 01:49:44 +02:00
sr_Latn = > 'Goran Ivanković' ,
2013-06-06 22:59:37 +02:00
sr_Cyrl = > 'Goran Ivanković' ,
2012-10-09 09:01:24 +02:00
sv = > 'Lars Luthman, Magnus Homann, Victor Axbom' ,
2014-04-18 23:37:47 +02:00
sw = > '' ,
2014-05-07 01:14:02 +02:00
ta = > '' ,
2014-02-05 17:10:35 +01:00
te = > '' ,
2012-05-25 16:42:20 +02:00
th = > 'Man Chao' ,
2014-05-07 01:14:02 +02:00
tl = > 'Kathrina Gregana' ,
2014-05-28 13:52:44 +02:00
tr = > 'Osman Yalçı n YILMAZ' ,
2014-04-18 23:37:47 +02:00
uk = > 'Alexander Bruy' ,
2013-07-24 20:26:40 +02:00
vi = > 'Phan Anh, Bùi Hữu Mạnh' ,
2013-09-02 18:34:16 +02:00
zh_CN = > 'Calvin Ngei, Zhang Jun, Richard Xie' ,
2012-07-04 01:21:35 +02:00
zh_TW = > 'Nung-yao Lin' ,
2012-04-14 15:10:00 +02:00
} ;
2009-03-19 12:02:43 +00:00
2012-05-25 16:42:20 +02:00
my $ maxn ;
2009-03-19 12:02:43 +00:00
for my $ i ( <i18n/qgis_*.ts> ) {
2012-05-25 16:42:20 +02:00
my ( $ langcode ) = $ i =~ /i18n\/qgis_(.*).ts/ ;
2013-05-19 19:23:52 +02:00
next if $ langcode eq "en" ;
2009-03-19 12:02:43 +00:00
2013-06-06 22:59:37 +02:00
my $ translator = $ translators - > { $ langcode } || "(orphaned)" ;
my $ charset = "" ;
my $ lc = $ langcode ;
if ( $ langcode =~ /(.*)_Latn/ ) {
$ charset = " (latin)" ;
$ langcode = $ 1 ;
} elsif ( $ langcode =~ /(.*)_Cyrl/ ) {
$ charset = " (cyrillic)" ;
$ langcode = $ 1 ;
}
2012-05-25 16:42:20 +02:00
my $ name ;
if ( $ langcode =~ /(.*)_(.*)/ ) {
my $ lang = code2language ( lc $ 1 ) ;
my $ country = code2country ( lc $ 2 ) ;
$ name = "$lang ($country)" ;
} else {
$ name = code2language ( lc $ langcode ) ;
}
2009-03-19 12:02:43 +00:00
2013-06-06 22:59:37 +02:00
$ name . = $ charset ;
2009-03-19 12:02:43 +00:00
2012-05-25 16:42:20 +02:00
open F , "lrelease $i|" ;
2009-03-19 12:02:43 +00:00
2013-06-06 22:59:37 +02:00
my ( $ translations , $ finished , $ unfinished ) ;
my $ untranslated = 0 ;
2009-03-19 12:02:43 +00:00
2012-05-25 16:42:20 +02:00
while ( <F> ) {
if ( /Generated (\d+) translation\(s\) \((\d+) finished and (\d+) unfinished\)/ ) {
$ translations = $ 1 ;
$ finished = $ 2 ;
$ unfinished = $ 3 ;
} elsif ( /Ignored (\d+) untranslated source text\(s\)/ ) {
$ untranslated = $ 1 ;
}
}
2009-03-19 12:02:43 +00:00
2012-05-25 16:42:20 +02:00
close F ;
2009-03-19 12:02:43 +00:00
2012-05-25 16:42:20 +02:00
my $ n = $ translations + $ untranslated ;
2012-06-03 18:05:26 +02:00
$ maxn = $ n unless defined $ maxn ;
if ( $ n > $ maxn ) {
2014-06-13 00:52:30 +02:00
print STDERR "$i: more translations than others. ($n>$maxn)\n" ;
2012-06-03 18:05:26 +02:00
$ maxn = $ n ;
}
2009-03-19 12:02:43 +00:00
2013-06-06 22:59:37 +02:00
push @ lang , {
code = > $ langcode ,
name = > $ name , n = > $ n ,
translations = > $ translations ,
finished = > $ finished ,
unfinished = > $ unfinished ,
untranslated = > $ untranslated ,
translator = > $ translator
} ;
2009-03-20 22:21:10 +00:00
}
2012-05-25 16:42:20 +02:00
foreach my $ l ( @ lang ) {
$ l - > { diff } = $ l - > { n } - $ maxn ;
2012-06-03 18:05:26 +02:00
$ l - > { percentage } = ( $ l - > { finished } + $ l - > { unfinished } /2)/ $ maxn * 100 ;
2012-04-14 15:10:00 +02:00
}
2012-05-25 16:42:20 +02:00
2013-06-06 22:59:37 +02:00
if ( @ ARGV && $ ARGV [ 0 ] eq "site" ) {
2012-05-25 16:42:20 +02:00
print "<html><body>" ;
print "<head>" ;
print "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"/>" ;
print "<style>" ;
print "body{font-family:sans-serif;}" ;
print "table {font-size:80%;border-collapse: collapse;}" ;
print "td {border-left:solid 1px #aaaaaa;border-right:solid 1px #aaaaaa;padding:1px 10px;}" ;
print ".bartodo{ background-color:red;width:100px;height:20px;}" ;
print ".bardone{ background-color:green;width:80px;height:20px;font-size:80%;text-align:center;padding-top:4px;height:16px;color:white;}" ;
print "</style></head>" ;
print "<table>" ;
print "<tr><td colspan=\"2\" style=\"width:250px;\">Language</td><td>Count</td><td>Finished</td><td>Unfinished</td><td>Untranslated</td><td>Percentage</td><td>Translators</td></tr>\n" ;
for my $ l ( sort { $ b - > { percentage } <=> $ a - > { percentage } } @ lang ) {
printf "\n<tr>"
. '<td><img src="flags/%s.png"></td><td nowrap>%s</td>'
. '<td nowrap>%s</td><td>%d</td><td>%d</td><td>%d</td>'
. '<td><div class="bartodo"><div class="bardone" style="width:%dpx">%.1f</div></div></td>'
. '<td>%s</td>'
. '</tr>' ,
$ l - > { code } , $ l - > { name } ,
$ l - > { diff } == 0 ? $ l - > { n } : "$l->{n} ($l->{diff})" ,
$ l - > { finished } , $ l - > { unfinished } , $ l - > { untranslated } ,
$ l - > { percentage } , $ l - > { percentage } ,
2013-06-06 22:59:37 +02:00
$ l - > { translator } ;
2012-05-25 16:42:20 +02:00
}
print "</table></body></html>\n" ;
} else {
print "<style>" ;
print "table {font-size:80%;}" ;
print "th {text-align:left; }" ;
print ".bartodo{ background-color:red;width:100px;height:20px;}" ;
print ".bardone{ background-color:green;width:80px;height:20px;font-size:80%;text-align:center;padding-top:4px;height:16px;color:white;}" ;
print "</style>" ;
print "<table>" ;
print "<tr><th colspan=\"2\" style=\"width:250px;\">Language</th><th>Finished %</th><th>Translators</th></tr>\n" ;
for my $ l ( sort { $ b - > { percentage } <=> $ a - > { percentage } } @ lang ) {
printf "\n<tr>"
. '<td><img src="qrc:/images/flags/%s.png"></td><td>%s</td>'
2012-05-31 09:09:16 +02:00
. '<td><div title="finished:%d unfinished:%d untranslated:%d" class="bartodo"><div class="bardone" style="width:%dpx">%.1f</div></div></td>'
2012-05-25 16:42:20 +02:00
. '<td>%s</td>'
. '</tr>' ,
$ l - > { code } , $ l - > { name } ,
2012-05-31 09:09:16 +02:00
$ l - > { finished } , $ l - > { unfinished } , $ l - > { untranslated } ,
2012-05-25 16:42:20 +02:00
$ l - > { percentage } , $ l - > { percentage } ,
2013-06-06 22:59:37 +02:00
$ l - > { translator } ;
2012-05-25 16:42:20 +02:00
}
print "</table>\n" ;
2009-03-19 12:02:43 +00:00
}