Add option processing to pocheck.pl so that we can selectively check for certain problems, rather than having to sort through everything manually.

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@38265 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Richard Heck 2011-04-05 22:32:32 +00:00
parent c294f1f623
commit 89bb06a23e

View File

@ -7,19 +7,43 @@
# #
# author: Michael Gerz, michael.gerz@teststep.org # author: Michael Gerz, michael.gerz@teststep.org
# #
# This script performs some consistency checks on po files:
#
# 1. Uniform translation of messages that are identical except
# for capitalization, shortcuts, and shortcut notation.
# 2. Usage of the following elements in both the original and
# the translated message (or no usage at all):
# shortcuts ("&" and "|..."), trailing space, trailing colon
#
# Invocation:
# pocheck.pl po_file po_file ...
use strict; use strict;
use warnings; use warnings;
use Getopt::Std;
my $usage = <<EOT;
pocheck.pl [-acmpqst] po_file [po_file] ...
This script performs some consistency checks on po files. It will check
for everything listed under "Options" below, unless options are given, in
which case it checks only those requested.
Options:
-a: Check arguments, like %1\$s
-c: Check for colons at end
-m: Check for menu shortcuts
-p: Check for period at end
-q: Check Qt shortcuts
-s: Check for space at end
-t: Check for uniform translations
EOT
my %options;
getopts(":hacmpqst", \%options);
if (defined($options{h})) {
print $usage;
exit 0;
}
my $check_args = (!%options or defined($options{a}));
my $check_colons = (!%options or defined($options{c}));
my $check_spaces = (!%options or defined($options{m}));
my $check_periods = (!%options or defined($options{p}));
my $check_qt = (!%options or defined($options{q}));
my $check_menu = (!%options or defined($options{s}));
my $check_trans = (!%options or defined($options{t}));
my %trans; my %trans;
@ -68,58 +92,72 @@ foreach my $pofilename ( @ARGV )
next if ($msgid eq "" or $msgstr eq ""); next if ($msgid eq "" or $msgstr eq "");
# Check for matching %1$s, etc. # Check for matching %1$s, etc.
my @argstrs = ( $msgid =~ m/%(\d)\$s/g ); if ($check_args) {
if (@argstrs) { my @argstrs = ( $msgid =~ m/%(\d)\$s/g );
my $n = 0; if (@argstrs) {
foreach my $arg (@argstrs) { $n = $arg if $arg > $n; } my $n = 0;
if ($n <= 0) { foreach my $arg (@argstrs) { $n = $arg if $arg > $n; }
print "Problem finding arguments in:\n $msgid!\n"; if ($n <= 0) {
$warn++; print "Problem finding arguments in:\n $msgid!\n";
} else { $warn++;
foreach my $i (1..$n) { } else {
my $arg = "%$i\\\$s"; foreach my $i (1..$n) {
if ( $msgstr !~ m/$arg/ ) { my $arg = "%$i\\\$s";
print "Missing argument `$arg'\n '$msgid' ==> '$msgstr'\n"; if ( $msgstr !~ m/$arg/ ) {
$warn++; print "Missing argument `$arg'\n '$msgid' ==> '$msgstr'\n";
$warn++;
}
} }
} }
} }
} }
# Check colon at the end of a message if ($check_colons) {
if ( ( $msgid =~ m/: *(\|.*)?$/ ) != ( $msgstr =~ m/: *(\|.*)?$/ ) ) { # Check colon at the end of a message
print( "Missing or unexpected colon:\n" ); if ( ( $msgid =~ m/: *(\|.*)?$/ ) != ( $msgstr =~ m/: *(\|.*)?$/ ) ) {
print( " '$msgid' => '$msgstr'\n" ); print( "Missing or unexpected colon:\n" );
$warn++; print( " '$msgid' => '$msgstr'\n" );
$warn++;
}
} }
# Check period at the end of a message; uncomment code if you are paranoid if ($check_periods) {
#if ( ( $msgid =~ m/\. *(\|.*)?$/ ) != ( $msgstr =~ m/\. *(\|.*)?$/ ) ) { # Check period at the end of a message; uncomment code if you are paranoid
# print( "Missing or unexpected period:\n" ); if ( ( $msgid =~ m/\. *(\|.*)?$/ ) != ( $msgstr =~ m/\. *(\|.*)?$/ ) ) {
# print( " '$msgid' => '$msgstr'\n" ); print( "Missing or unexpected period:\n" );
# $warn++; print( " '$msgid' => '$msgstr'\n" );
#} $warn++;
}
# Check space at the end of a message
if ( ( $msgid =~ m/ *?(\|.*)?$/ ) != ( $msgstr =~ m/ *?(\|.*)?$/ ) ) {
print( "Missing or unexpected space:\n" );
print( " '$msgid' => '$msgstr'\n" );
$warn++;
} }
# Check for "&" shortcuts if ($check_spaces) {
if ( ( $msgid =~ m/&[^ ]/ ) != ( $msgstr =~ m/&[^ ]/ ) ) { # Check space at the end of a message
print( "Missing or unexpected Qt shortcut:\n" ); if ( ( $msgid =~ m/ *?(\|.*)?$/ ) != ( $msgstr =~ m/ *?(\|.*)?$/ ) ) {
print( " '$msgid' => '$msgstr'\n" ); print( "Missing or unexpected space:\n" );
$warn++; print( " '$msgid' => '$msgstr'\n" );
$warn++;
}
} }
# Check for "|..." shortcuts if ($check_qt) {
if ( ( $msgid =~ m/\|[^ ]/ ) != ( $msgstr =~ m/\|[^ ]/ ) ) { # Check for "&" shortcuts
print( "Missing or unexpected menu shortcut:\n" ); if ( ( $msgid =~ m/&[^ ]/ ) != ( $msgstr =~ m/&[^ ]/ ) ) {
print( " '$msgid' => '$msgstr'\n" ); print( "Missing or unexpected Qt shortcut:\n" );
$warn++; print( " '$msgid' => '$msgstr'\n" );
$warn++;
}
} }
if ($check_menu) {
# Check for "|..." shortcuts
if ( ( $msgid =~ m/\|[^ ]/ ) != ( $msgstr =~ m/\|[^ ]/ ) ) {
print( "Missing or unexpected menu shortcut:\n" );
print( " '$msgid' => '$msgstr'\n" );
$warn++;
}
}
next unless $check_trans;
# we now collect these translations in a hash. # we now collect these translations in a hash.
# this will allow us to check below if we have translated # this will allow us to check below if we have translated
@ -139,19 +177,21 @@ foreach my $pofilename ( @ARGV )
$trans{$msgid_clean}{$msgstr_clean} = [ $msgid, $msgstr ]; $trans{$msgid_clean}{$msgstr_clean} = [ $msgid, $msgstr ];
} }
foreach $msgid ( keys %trans ) { if ($check_trans) {
# so $ref is a reference to the inner hash. foreach $msgid ( keys %trans ) {
my $ref = $trans{$msgid}; # so $ref is a reference to the inner hash.
# @msgstrkeys is an array of the keys of that inner hash. my $ref = $trans{$msgid};
my @msgstrkeys = keys %$ref; # @msgstrkeys is an array of the keys of that inner hash.
my @msgstrkeys = keys %$ref;
# do we have more than one such key? # do we have more than one such key?
if ( $#msgstrkeys > 0 ) { if ( $#msgstrkeys > 0 ) {
print( "Different translations for '$msgid':\n" ); print( "Different translations for '$msgid':\n" );
foreach $msgstr ( @msgstrkeys ) { foreach $msgstr ( @msgstrkeys ) {
print( " '" . $trans{$msgid}{$msgstr}[0] . "' => '" . $trans{$msgid}{$msgstr}[1] . "'\n" ); print( " '" . $trans{$msgid}{$msgstr}[0] . "' => '" . $trans{$msgid}{$msgstr}[1] . "'\n" );
}
$warn++;
} }
$warn++;
} }
} }