You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
219 lines
5.2 KiB
219 lines
5.2 KiB
#!/usr/bin/perl
|
|
#
|
|
# This script reads the xx.po file and generates some statistics
|
|
# information in form of XML output. This output is parsed by
|
|
# the translate.php file found on the KMyMoney web-site.
|
|
#
|
|
# (C) 2007 by Thomas Baumgart
|
|
#
|
|
# Syntax:
|
|
# stats.pl <path-to-po-file>
|
|
#
|
|
# The script requires to find the kmymoney2.pot file in the same
|
|
# directory in order to check if the po file is based on the current
|
|
# pot file.
|
|
#
|
|
#***************************************************************************
|
|
#* 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. *
|
|
#***************************************************************************
|
|
|
|
# total message counter
|
|
my $msgs = 0;
|
|
|
|
# fuzzy message counter
|
|
my $fuzzy = 0;
|
|
|
|
# translated message counter
|
|
my $translated = 0;
|
|
|
|
# untranslated message counter
|
|
my $untranslated = 0;
|
|
|
|
# state machine
|
|
# possible states:
|
|
#
|
|
# 0 - idle
|
|
# 1 - in message
|
|
# 2 - in msgid
|
|
# 3 - in empty msgstr
|
|
# 4 - in msgstr
|
|
my $state = 0;
|
|
|
|
# line counter
|
|
my $linecnt = 0;
|
|
|
|
# filename of file to process
|
|
my $fname;
|
|
|
|
# pot version information
|
|
my $potVersion;
|
|
|
|
# "po file matches current pot file" flag
|
|
my $poVersionOk = 0;
|
|
|
|
if($#ARGV == -1) {
|
|
$fname = "-";
|
|
} elsif($#ARGV == 0) {
|
|
$fname = $ARGV[0];
|
|
$fname =~ /^(.*\/)?(.*)\.po$/;
|
|
$basedir = $1;
|
|
$langcode = $2;
|
|
} else {
|
|
print STDERR "Can only process one file at a time\n";
|
|
exit 1;
|
|
}
|
|
|
|
|
|
$country{"ca"} = "Catalan";
|
|
$country{"cs"} = "Czech";
|
|
$country{"da"} = "Denmark";
|
|
$country{"de"} = "Germany";
|
|
$country{"en_GB"} = "Great Britain";
|
|
$country{"es"} = "Spain";
|
|
$country{"es_AR"} = "Argentina";
|
|
$country{"fi"} = "Finnland";
|
|
$country{"fr"} = "France";
|
|
$country{"gl"} = "Galicia";
|
|
$country{"it"} = "Italy";
|
|
$country{"lt"} = "Lithuania";
|
|
$country{"nl"} = "Netherlands";
|
|
$country{"pl"} = "Poland";
|
|
$country{"pt_BR"} = "Brazil";
|
|
$country{"pt"} = "Portugal";
|
|
$country{"ro"} = "Romania";
|
|
$country{"ru"} = "Russia";
|
|
$country{"sk"} = "Slovakia";
|
|
$country{"sl"} = "Slovenia";
|
|
$country{"sv"} = "Sweden";
|
|
$country{"tr"} = "Turkey";
|
|
$country{"zh_CN"} = "China";
|
|
|
|
$language{"ca"} = "Catalan";
|
|
$language{"cs"} = "Czech";
|
|
$language{"da"} = "Danish";
|
|
$language{"de"} = "German";
|
|
$language{"en_GB"} = "British";
|
|
$language{"es"} = "Spanish (Spain)";
|
|
$language{"es_AR"} = "Spanish (Argentina)";
|
|
$language{"fi"} = "Suomi";
|
|
$language{"fr"} = "French";
|
|
$language{"gl"} = "Galician";
|
|
$language{"it"} = "Italian";
|
|
$language{"lt"} = "Lithuanian";
|
|
$language{"nl"} = "Dutch";
|
|
$language{"pl"} = "Polish";
|
|
$language{"pt_BR"} = "Portuguese (Brazil)";
|
|
$language{"pt"} = "Portuguese (Portugal)";
|
|
$language{"ro"} = "Romanian";
|
|
$language{"ru"} = "Russian";
|
|
$language{"sk"} = "Slovak";
|
|
$language{"sl"} = "Slovenian";
|
|
$language{"sv"} = "Swedish";
|
|
$language{"tr"} = "Turkish";
|
|
$language{"zh_CN"} = "Simplified Chinese";
|
|
|
|
$flags{"es_AR"} = "ar";
|
|
$flags{"en_GB"} = "gb";
|
|
$flags{"pt_BR"} = "br";
|
|
$flags{"pt"} = "pt";
|
|
$flags{"da"} = "dk";
|
|
$flags{"gl"} = "Galicia";
|
|
$flags{"zh_CN"} = "cn";
|
|
|
|
open(IN, "< $basedir/kmymoney2.pot") or die("POT file not found.");
|
|
while(<IN>) {
|
|
if($_ =~ /POT-Creation-Date/) {
|
|
chomp($_);
|
|
$potVersion = $_;
|
|
last;
|
|
}
|
|
}
|
|
close IN;
|
|
|
|
$potVersionOk="0";
|
|
|
|
open(IN, "< $fname") or die("Cannot open $fname for reading");
|
|
while(<IN>) {
|
|
$linecnt++;
|
|
if($_ =~ /Language-Team: (.*) <.*>/) {
|
|
$language = $1;
|
|
next;
|
|
}
|
|
if($_ =~ /Last-Translator: (.*) <.*>/) {
|
|
$author = $1;
|
|
next;
|
|
}
|
|
if($_ =~ /POT-Creation-Date/) {
|
|
chomp($_);
|
|
$potVersionOk = "1" if($_ eq $potVersion);
|
|
next;
|
|
}
|
|
# "PO-Revision-Date: 2007-02-21 21:57+0100\n"
|
|
if($_ =~ /PO-Revision-Date: (\d+-\d+-\d+) /) {
|
|
$poRevision = $1;
|
|
}
|
|
|
|
if($state == 0) {
|
|
if($_ =~ /^\#:/) {
|
|
$state = 1;
|
|
}
|
|
} elsif($state == 1) {
|
|
if($_ =~ /^msgid /) {
|
|
$msgs++;
|
|
$state = 2;
|
|
|
|
} elsif($_ =~ /^#, fuzzy/) {
|
|
$fuzzy++;
|
|
}
|
|
|
|
} elsif($state == 2) {
|
|
if($_ =~ /^msgstr ""$/) {
|
|
# we have detected an emtpy msgstr. this can have two reasons
|
|
# a) the message is untranslated, then the next line is empty
|
|
# b) the message is too long and starts on the next line
|
|
$state = 3;
|
|
} elsif($_ =~ /^msgstr "[^"]/) {
|
|
$translated++;
|
|
$state = 4;
|
|
}
|
|
} elsif($state == 3) {
|
|
if($_ =~ /^"[^"]/) {
|
|
$translated++;
|
|
$state = 4;
|
|
} else {
|
|
$untranslated++;
|
|
$state = 0;
|
|
}
|
|
} elsif($state == 4) {
|
|
chomp($_);
|
|
if($_ =~ /^$/) {
|
|
$state = 0;
|
|
}
|
|
}
|
|
}
|
|
close IN;
|
|
|
|
my $flag = $flags{$langcode};
|
|
$flag = $langcode if(length($flag) == 0);
|
|
|
|
$ptransdisp = (int (($translated - $fuzzy) * 10000 / $msgs)) / 100;
|
|
;
|
|
$pfuzzy = int (($fuzzy * 100) / $msgs);
|
|
$puntrans = int (($untranslated * 100) / $msgs);
|
|
|
|
print "<translation>\n";
|
|
print " <flag>$flag</flag>\n";
|
|
print " <language>$language{$langcode}</language>\n";
|
|
print " <country>$country{$langcode}</country>\n";
|
|
print " <translator>$author</translator>\n";
|
|
print " <translated>$ptransdisp</translated>\n";
|
|
print " <fuzzy>$pfuzzy</fuzzy>\n";
|
|
print " <untranslated>$puntrans</untranslated>\n";
|
|
print " <potcurrent>$potVersionOk</potcurrent>\n";
|
|
print " <porevision>$poRevision</porevision>\n";
|
|
print "</translation>\n";
|
|
|