#!/usr/bin/perl -w # -*- perl -*- use Foomatic::Defaults; use Foomatic::DB; use strict; sub write_po{ my ($out, $messages) = @_; foreach (sort(keys %$messages)) { if ($_ eq '') { next; } my $translation = $messages->{$_}; print $out "msgid \"$_\"\nmsgstr \"$translation\"\n\n"; } } sub write_message_files { my ($messages) = @_; foreach (keys %$messages) { print "LANGUAGE: $_\n"; open my $out, ">:encoding(utf-8)", "$_.po" or die; write_po($out, $messages->{$_}); } } sub extract_ppd_old{ my $file = $_[0]; my %messages; if ($file =~ /ppd\.gz$/) { open(FILE, "zcat $file |") or die "Can't open file: $file"; } else { open(FILE, $file); } while (){ if ( /\*(\w+) (\w+)\/([^:]+): \"([^\"]*)\"/ ) { print $_, "'$1' '$2' '$3' '$4'\n\n" } #print } close FILE; } sub extract_from_db{ my $messages = $_[0]; my $db = Foomatic::DB->new(); my @files = $db->_get_xml_filelist("source/opt"); foreach my $file (@files){ if ( $file =~ /[Mm]odel|^18$|^57$/ ) { next; } my $xml = $db->_get_object_xml("source/opt/$file"); while ($xml =~ /\<[^\<\/]*longname\>.*?\(.*?)\<\/en\>/sg) { my $message = Foomatic::DB::unhtmlify($1); # xml unquoting $messages->{$message} = ''; } } } sub extract_ppd{ my ($db, $messages) = @_; my $args = $db->{"dat"}{"args_byname"}; for my $option (keys %$args){ $messages->{$args->{$option}{"comment"}} = ""; #foreach (keys %{$args->{$option}}) { # print $_, "\n"; #} if ($args->{$option}{"type"} eq "bool"){ $messages->{$args->{$option}{"comment_true"}} = ''; $messages->{$args->{$option}{"comment_false"}} = ''; } elsif ($args->{$option}{"type"} eq "enum") { for my $val (@{$args->{$option}{"vals"}}){ $messages->{$val->{"comment"}} = ''; } } } return; # old code: $a = $db->{"dat"}{"args_byname"}{"MediaType"}{"vals"}[0]; print "$a\n\n"; if (0){ foreach my $val (@$a){ print "$val\n"; } return; } foreach my $name (keys %$a) { print "$name:\n"; print $a->{$name}, "\n\n"; if ($name != "compiled-at"){ foreach (keys %{$db->{"dat"}{$name}}) { print $_, "\n"; } print "\n"; } } } sub get_translated_messages{ my ($ppd_en, $ppd_lang, $translation) = @_; my $args_en = $ppd_en->{"dat"}{"args_byname"}; my $args_lang = $ppd_lang->{"dat"}{"args_byname"}; for my $option (keys %$args_en){ $translation->{$args_en->{$option}{"comment"}} = $args_lang->{$option}{"comment"}; if ($args_en->{$option}{"type"} eq "bool"){ $translation->{$args_en->{$option}{"comment_true"}} = $args_lang->{$option}{"comment_true"}; $translation->{$args_en->{$option}{"comment_false"}} = $args_lang->{$option}{"comment_false"}; } elsif ($args_en->{$option}{"type"} eq "enum") { for my $val (@{$args_en->{$option}{"vals"}}){ my $value = $val->{"value"}; for my $val_lang (@{$args_lang->{$option}{"vals"}}){ if ($val_lang->{"value"} eq $value) { $translation->{$val->{"comment"}} = $val_lang->{"comment"}; }; } } } } } sub extract_ppds{ my ($path, $messages) = @_; my $ppds = { }; my %language_names = ('English' => 'en', 'French' => 'fr', 'German' => 'de', 'Italian' => 'it', 'Japanese' => 'jp', 'Portugse' => 'pt', 'Portuguese' => 'pt', 'Spanish' => 'es'); # read ppds open(PPDS, "find $path -name \*.ppd\*|"); while (){ print substr($_, 0, -1), "\n"; my $db = Foomatic::DB->new(); $db->getdatfromppd(substr($_, 0, -1)); my $makemodel = $db->{'dat'}{'makemodel'}; $ppds->{$makemodel} = [] unless exists $ppds->{$makemodel}; push @{$ppds->{$makemodel}}, $db; } foreach my $makemodel (keys %$ppds) { my $en_ppd; foreach my $ppd (@{$ppds->{$makemodel}}) { if ($ppd->{'dat'}{'language'} eq 'English') { $en_ppd = $ppd; last; } } foreach my $ppd (@{$ppds->{$makemodel}}) { my $lang = $ppd->{'dat'}{'language'}; if (exists $language_names{$lang}) { $lang = $language_names{$lang}; } $messages->{$lang} = {} unless exists $messages->{$lang}; if ($lang ne 'en') { get_translated_messages($en_ppd, $ppd, $messages->{$lang}); } else { extract_ppd($ppd, $messages->{$lang}); } } } } sub main{ my $messages = { }; $messages->{'en'} = { }; extract_from_db($messages->{'en'}); extract_ppds("$libdir/db/source/PPD/", $messages); write_message_files($messages); } main();