diff options
Diffstat (limited to 'Build/source/utils/texi2html/manage_i18n.pl')
-rwxr-xr-x | Build/source/utils/texi2html/manage_i18n.pl | 397 |
1 files changed, 397 insertions, 0 deletions
diff --git a/Build/source/utils/texi2html/manage_i18n.pl b/Build/source/utils/texi2html/manage_i18n.pl new file mode 100755 index 00000000000..8b9621d6af6 --- /dev/null +++ b/Build/source/utils/texi2html/manage_i18n.pl @@ -0,0 +1,397 @@ +#! /usr/bin/perl -w +#+############################################################################## +# +# manage_i18n.pl: manage translation files +# +# Copyright (C) 2003 Free Software Foundation, Inc. +# +# 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. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +#-############################################################################## + +# This requires perl version 5 or higher +require 5.0; + +use strict; +#use vars qw( +# $T2H_LANGUAGES +#); + +use File::Copy; +use Data::Dumper; + +select(STDERR); +$| = 1; +select(STDOUT); +$| = 1; + +my $language; +my $i18n_dir = 'i18n'; # name of the directory containing the per language files +my $translation_file = 'translations.pl'; # file containing all the translations +my @known_languages = ('en', 'de', 'nl', 'es', 'no', 'pt', 'fr'); # The supported + # languages +#my $template = 'template'; +my $template = 'en'; +my $template_file = "$i18n_dir/$template"; +my @source_files = ('texi2html.pl', 'texi2html.init', 'T2h_i18n.pm', + 'examples/roff.init', 'examples/noheaders.init'); + +use vars qw( +$LANGUAGES +$T2H_OBSOLETE_STRINGS +); + +# Strings not in code +my $template_strings = +{ + 'January' => '', + 'February' => '', + 'March' => '', + 'April' => '', + 'May' => '', + 'June' => '', + 'July' => '', + 'August' => '', + 'September' => '', + 'October' => '', + 'November' => '', + 'December' => '', + 'T2H_today' => '%s, %d %d', +}; + +# Handle per language files +$Data::Dumper::Sortkeys = 1; + +if (@ARGV < 1) +{ + die "Need at least one arg\n"; +} + +my $command = shift @ARGV; + +sub update_language_file($); + +die "No suitable $i18n_dir directory\n" unless (-d $i18n_dir and -r $i18n_dir); + +sub get_languages +{ + unless (opendir DIR, $i18n_dir) + { + die "Cannot open dir $i18n_dir: $!\n"; + } + my @languages = grep { + ! /^\./ && + ! /\.(bak|orig|old|dpkg-old|rpmnew|rpmsave)$/ && + ! /~$/ && + ! /^#.*#$/ && + -f $i18n_dir . '/' . $_ + } readdir DIR; + closedir DIR; + my @known = @known_languages; + foreach my $lang (@languages) + { + if (grep {$_ eq $lang} @known) + { + @known = grep {$_ ne $lang} @known; + } + else + { + warn "Remark: you could update the known languages array for `$lang'\n"; + } + } + warn "Remark: the following known languages have no corresponding file: @known\n" if (@known); + return @languages; +} + +sub manage_i18n_files($) +{ + my $command = shift; + if ($command eq 'update') + { + update_i18n_files(); + } + elsif ($command eq 'merge') + { + merge_i18n_files(); + } + elsif ($command eq 'template') + { + update_template(@source_files); + } + elsif ($command eq 'all') + { + update_template(@source_files); + update_i18n_files(); + merge_i18n_files(); + } + else + { + warn "Unknown i18n command: $command\n"; + } + exit 0; +} + +sub merge_i18n_files +{ + my @languages = get_languages(); + die "No languages found\n" unless (@languages); + if (-f $translation_file) + { + unless (File::Copy::copy ($translation_file, "$translation_file.old")) + { + die "Error copying $translation_file to $translation_file.old\n"; + } + } + #foreach my $lang ($template, @known_languages) + die "open $translation_file failed" unless (open (TRANSLATIONS, ">$translation_file")); + foreach my $lang (@languages) + { + my $file = "$i18n_dir/$lang"; + next unless (-r $file); + unless (open (FILE, $file)) + { + warn "open $file failed: $!\n"; + return; + } + while (<FILE>) + { + print TRANSLATIONS; + } + close FILE; + } +} + +sub update_language_hash($$$) +{ + my $file = shift; + my $lang = shift; + my $reference = shift; + if (-f $file) + { + eval { require($file) ;}; + if ($@) + { + warn "require $file failed: $@\n"; + return; + } + unless (File::Copy::copy ($file, "$file.old")) + { + warn "Error copying $file to $file.old\n"; + return; + } + if (!defined($LANGUAGES->{$lang})) + { + warn "LANGUAGES->{$lang} not defined in $file\n"; + return; + } + } + if (!defined($T2H_OBSOLETE_STRINGS->{$lang})) + { + $T2H_OBSOLETE_STRINGS->{$lang} = {}; + } + if (!defined($LANGUAGES->{$lang})) + { + $LANGUAGES->{$lang} = {}; + } + + foreach my $string (keys %{$LANGUAGES->{$lang}}) + { + $T2H_OBSOLETE_STRINGS->{$lang}->{$string} = $LANGUAGES->{$lang}->{$string} + if (defined($LANGUAGES->{$lang}->{$string}) and ($LANGUAGES->{$lang}->{$string} ne '')); + } + + $LANGUAGES->{$lang} = {}; + + foreach my $string (keys (%{$reference})) + { + if (exists($T2H_OBSOLETE_STRINGS->{$lang}->{$string}) and + defined($T2H_OBSOLETE_STRINGS->{$lang}->{$string}) and + ($T2H_OBSOLETE_STRINGS->{$lang}->{$string} ne '')) + { + $LANGUAGES->{$lang}->{$string} = $T2H_OBSOLETE_STRINGS->{$lang}->{$string}; + delete $T2H_OBSOLETE_STRINGS->{$lang}->{$string}; + } + else + { + $LANGUAGES->{$lang}->{$string} = ''; + } + } + return 1; +} + +sub update_i18n_files +{ + die "No suitable $i18n_dir directory\n" unless (-d $i18n_dir and -w $i18n_dir); + #my @languages = @known_languages; + my @languages = get_languages(); + if (@ARGV) + { + @languages = (); + foreach my $lang (@ARGV) + { + unless (grep {$lang eq $_} @known_languages) + { + #warn "Unsupported language `$lang'\n"; + #next; + warn "Remark: you could update the known languages array for `$lang'\n"; + } + push (@languages, $lang) unless (grep {$lang eq $_} @languages); + } + } + unless (@languages) + { + warn "No languages to update\n" ; + return; + } + die "$template_file not readable\n" unless (-r $template_file); + eval { require($template_file) ;}; + if ($@) + { + die "require $template_file failed: $@\n"; + } + die "LANGUAGE->{'en'} undef after require $template_file\n" unless + (defined($LANGUAGES) and defined($LANGUAGES->{'en'})); + foreach my $string (keys(%$template_strings)) + { + die "template string $string undef" unless (defined($LANGUAGES->{'en'}->{$string})); + } + foreach my $lang (@languages) + { + update_language_file($lang); + } + return 1; +} + +sub update_language_file($) +{ + my $lang = shift; + #unless (grep {$lang eq $_} @known_languages) + #{ + # print STDERR "Unsupported language `$lang'\n"; + # return; + #} + my $file = "$i18n_dir/$lang"; + + return unless (update_language_hash($file, $lang, $LANGUAGES->{'en'})); + + unless (open (FILE, ">$file")) + { + warn "open $file failed: $!\n"; + return; + } + + + print FILE "" . Data::Dumper->Dump([$LANGUAGES->{$lang}], [ "LANGUAGES->{'$lang'}" ]); + print FILE "\n"; + print FILE Data::Dumper->Dump([$T2H_OBSOLETE_STRINGS->{$lang}], [ "T2H_OBSOLETE_STRINGS->{'$lang'}"]); + print FILE "\n"; + print FILE "\n"; + close FILE; +} + +sub update_template (@) +{ + my $source_strings = {}; + foreach my $source_file (@_) + { + unless (-r $source_file) + { + warn "$source_file not readable\n"; + next; + } + unless (open (FILE, "$source_file")) + { + warn "open $source_file failed: $!\n"; + next; + } + my $line_nr = 0; + while (<FILE>) + { + $line_nr++; + my $string; + next if /^\s*#/; + while ($_) + { + if (defined($string)) + { + if (s/^([^\\']*)(\\|')//) + { + $string .= $1 if (defined($1)); + if ($2 eq "'") + { + $source_strings->{$string} = '' ; + $string = undef; + } + else + { + if (s/^(.)//) + { + #$string .= '\\' . $1; + $string .= $1; + } + else + { + warn "\\ at end of line, file $source_file, line nr $line_nr\n"; + $source_strings->{$string} = '' ; + $string = undef; + } + } + } + else + { + warn "string not closed file $source_file, line nr $line_nr\n"; + $source_strings->{$string} = '' ; + $string = undef; + } + } + elsif (s/^.*?&\$I\s*\('//) + { + $string = ''; + } + else + { + last; + } + } + } + close FILE; + } + foreach my $string (keys (%$template_strings)) + { + $source_strings->{$string} = $template_strings->{$string}; + } + die unless(update_language_hash($template_file, 'en', $source_strings)); + foreach my $string (keys(%$template_strings)) + { # use values in template_srings if it exists + $LANGUAGES->{'en'}->{$string} = $template_strings->{$string} if ($LANGUAGES->{'en'}->{$string} eq ''); + } + unless (open (TEMPLATE, ">$template_file")) + { + die "open $template_file failed: $!\n"; + } + print TEMPLATE "" . Data::Dumper->Dump([$LANGUAGES->{'en'}], [ "LANGUAGES->{'en'}" ]); + print TEMPLATE "\n"; + if (keys(%{$T2H_OBSOLETE_STRINGS->{'en'}})) + { + print TEMPLATE Data::Dumper->Dump([$T2H_OBSOLETE_STRINGS->{'en'}], [ "T2H_OBSOLETE_STRINGS->{'en'}"]); + print TEMPLATE "\n"; + print TEMPLATE "\n"; + } + close TEMPLATE; +} + +manage_i18n_files($command); + +1; |