Skip to content

Commit

Permalink
Refactor translation-tool.pl (jenkinsci#6317)
Browse files Browse the repository at this point in the history
  • Loading branch information
glasswalk3r authored Mar 6, 2022
1 parent ee87e1e commit 0c4b791
Showing 1 changed file with 82 additions and 62 deletions.
144 changes: 82 additions & 62 deletions translation-tool.pl
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#!/usr/bin/perl -w
#!/usr/bin/perl
# The MIT License
#
# Copyright (c) 2004-, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number
Expand Down Expand Up @@ -50,52 +50,55 @@
use File::Basename;
use File::Find;
use File::Path;
use Getopt::Long;

my (
$lang, $editor, $dir, $toiso, $toascii,
$add, $remove, $reuse, $counter, $target
) = (undef, undef, "./", undef, undef, undef, undef, undef, undef, "./");
$lang, $editor, $dir, $toiso, $toascii, $add,
$remove, $reuse, $counter, $target, $help, $debug
) = (undef, undef, "./", 0, 0, 0, 0, 0, 0, "./", 0, 0);

GetOptions(
'help' => \$help,
'lang=s' => \$lang,
'editor' => \$editor,
'dir=s' => \$dir,
'to-iso' => \$toiso,
'to-ascii' => \$toascii,
'add' => \$add,
'remove' => \$remove,
'reuse' => \$reuse,
'counter' => \$counter,
'target=s' => \$target,
'debug' => \$debug
) or die("Error in command line arguments\n");

if ($help) {
usage();
exit(0);
}

$add = 1 if ($editor);

if ($toiso && $toascii) {
warn "You can't have --to-iso and --to-ascii options at the same time\n";
usage();
exit(1);
}

my ($tfiles, $tkeys, $tmissing, $tunused, $tempty, $tsame, $tnojenkins,
$countervalue)
= (0, 0, 0, 0, 0, 0, 0, 1);
## read arguments
foreach (@ARGV) {
if (/^--lang=(.*)$/) {
$lang = $1;
} elsif (/^--editor=(.*)$/) {
$editor = $1;
$add = 1;
} elsif (/^--toiso$/ || /^--toiso=true$/) {
$toiso = 1;
$toascii = 0;
} elsif (/^--toascii$/ || /^--toascii=true$/) {
$toascii = 1;
$toiso = 0;
} elsif (/^--add$/ || /^--add=true$/) {
$add = 1;
} elsif (/^--remove$/ || /^--remove=true$/) {
$remove = 1;
} elsif (/^--reuse=(.*)$/) {
$reuse = $1;
} elsif (/^--counter$/ || /^--counter=true$/) {
$counter = 1;
} elsif (/^--target=(.*)$/) {
$target = $1;
} else {
$dir = $_;
}
}

## language parameter is mandatory and shouldn't be 'en'
if (!$lang || $lang eq "en") {
unless (($lang) and ($lang ne 'en')) {
usage();
exit();
exit(1);
}

print STDERR "Finding files ...\n";
print "Searching for files ...\n";
## look for Message.properties and *.jelly files in the provided folder
my @files = findTranslatableFiles($dir);
print STDERR "Found " . (scalar keys @files) . " files\n";
print 'Found ', scalar(@files), ' files', "\n";

## load a cache with keys already translated to utilize in the case the same key
## is used
Expand Down Expand Up @@ -313,20 +316,36 @@ sub loadJellyFile {
sub loadPropertiesFile {
my $file = shift;
my %ret;
if (open(F, "$file")) {
my ($cont, $key, $val) = (0, undef, undef);
while (<F>) {
s/[\r\n]+//;
$ret{$key} .= "\n$1" if ($cont && /\s*(.*)[\\\s]*$/);
if (/^([^#\s].*?[^\\])=(.*)[\s\\]*$/) {
($key, $val) = (trim($1), trim($2));
$ret{$key} = $val;
}
$cont = (/\\\s*$/) ? 1 : 0;
}
close(F);
print "Trying to load $file... " if ($debug);

unless (-f $file) {
print "file does not exist, skipping.\n" if ($debug);
return %ret;
}

print "done.\n" if ($debug);
my $skip_comment = qr/^#/;
open(my $in, '<', $file) or die "Cannot read $file: $!\n";
my ($cont, $key, $val) = (0, undef, undef);

while (<$in>) {
chomp;
next if $_ eq '';
next if $_ =~ $skip_comment;
print 'Line: ', $_, "\n" if ($debug);
s/[\r\n]+//;
$ret{$key} .= "\n$1" if ($cont && /\s*(.*)[\\\s]*$/);
if (/^([^#\s].*?[^\\])=(.*)[\s\\]*$/) {
($key, $val) = (trim($1), trim($2));
$ret{$key} = $val;
}
$cont = (/\\\s*$/) ? 1 : 0;
}

close($in);
# TODO: Use of uninitialized value $_ in pattern match (m//) at
# ./translation-tool.pl line 345.
$ret{$key} .= "\n$1" if ($cont && /\s*(.*)[\\\s]*$/);
return %ret;
}

Expand Down Expand Up @@ -442,29 +461,30 @@ sub usage {
Usage: $0 --lang=xx [options] [dir]
dir: -> source folder for searching files (default current)
dir: -> source folder for searching files (default is the current directory)
options:
--lang=xx -> language code to use (it is mandatory and it has to be different to English)
--toiso=true|false -> convert files in UTF-8 to ISO-8859 (default false)
--toascii=true|false -> convert files in UTF-8 to ASCII using the native2ascii command (default false)
--add=true|false -> generate new files and add new keys to existing files (default false)
--remove=true|false -> remove unused key/value pair for existing files (default false)
--editor=command -> command to run over each updated file, implies add=true (default none)
--reuse=folder -> load a cache with keys already translated in the folder provided in
order to utilize them when the same key appears
--counter=true -> to each translated key, unique value is added to easily identify match missing translation
with value in source code (default false)
--target=folder -> target folder for writing files
--help -> print this help message and terminates the program with exit code 0.
--lang=xx -> language code to use (it is mandatory and it has to be different to English)
--to-iso -> optional, enables files in UTF-8 convertion to ISO-8859 if present
--to-ascii -> optional, convert files in UTF-8 to ASCII using the native2ascii command if present
--add -> optional, generate new files and add new keys to existing files if present
--remove -> optional, remove unused key/value pair for existing files if present
--editor=command -> command to run over each updated file, implies --add if present
--reuse=folder -> optional, load a cache with keys already translated in the folder provided in
order to utilize them when the same key appears if present
--counter -> optional, to each translated key, unique value is added to easily identify match missing translation
with value in source code if present
--target=folder -> optional, target folder for writing files
--debug -> optional, print debugging messages to STDOUT when they are available
Examples:
- Look for Spanish files with incomplete keys in the 'main' folder,
edit them with gedit, and finally convert them to ISO-8859
$0 --lang=es --editor=gedit --toiso main
$0 --lang=es --editor=gedit --to-iso main
- Convert all Japanese files in the current folder encoded with UTF-8 to ASCII
$0 --lang=ja --toascii .
$0 --lang=ja --to-ascii .
- Remove all orphaned keys from German files which are in the current file
$0 --lang=de --remove .
";
exit();
}

0 comments on commit 0c4b791

Please sign in to comment.