#!/usr/bin/perl -w # file KLEIDER/web/src/kalender/trans.pl # maschinelle Übersetzung von Textvarianten # 2015-12-16 Herbert Schiemann # GPL Version 2 oder neuer package main; use utf8 ; use Herbaer::Readargs ; use Herbaer::Translate ; use Herbaer::XMLDataWriter ; binmode (STDIN, ":utf8") ; binmode (STDOUT, ":utf8") ; binmode (STDERR, ":utf8") ; # Hash der Kommandozeilen-Argumente my $args = { "[cnt]verbose" => 1, "out" => "-", # Ausgabedatei oder - für STDOUT "trname" => "google", # Übersetzer "srclang" => "de", # Default-Quellsprache "tgtlang" => "zh", # Liste der Zielsprachen "[cnt]retrans" => undef, # Fremdsprachige Texte neu übersetzen }; # gibt die Version nach STDOUT aus sub version { print <<'VERSION' ; KLEIDER/web/src/kalender/trans.pl Maschinelle Übersetzung von Textvarianten 2015 Herbert Schiemann VERSION } $args -> {"[sr]version"} = sub { version (); exit 0; }; $args -> {"[sr]help"} = sub { version (); print_message_with_values (<<'HELP', $args); trans.pl [Optionen] --[no_]verbose Umfang der Meldungen ${[cnt]verbose} --out OUT Pfad der Ausgabedatei oder "-" für STDOUT ${out} --trname TRNAME Übersetzer ${trname} --srclang Default-Quellsprache ${srclang} --tgtlang Liste der Zielsprachen, durch Leerzeichen getrennt ${tgtlang} --[no_]retrans Fremdsprachige Texte neu übersetzen ${[cnt]retrans} HELP exit 0; }; read_args ($args); my $data = {}; read_data ($args, $data); translate ($args, $data); write_data ($args, $data); exit 0; sub read_data { my ($args, $data) = @_ ; my $verb = $args -> {"[cnt]verbose"}; my $line; # Zeile der Eingabe my $istext = 0; # ist die nächste Zeile eine Textzeile? my $tv = {}; # Hash der Quell-Sprachvarianten zu einer ID my $lang = $args -> {"srclang"}; # Quellsprache my $lineno = 0; # Zeilennummer my $src = {}; $data -> {"src"} = $src; while (defined ($line = )) { ++$lineno; $line =~ s/^\s+// ; $line =~ s/\s+$// ; if ($istext) { $tv -> {$lang} = $line; $istext = 0; } elsif ( $line =~ /^POS\s+(\d+)\s*$/ or $line =~ /^ID\s+([a-zA-Z_0-9])+/ ) { $tv = {}; $src -> {"$1"} = $tv; } elsif ( $line =~ /^LANG\s+(\S+)\s*$/ ) { $lang = $1; $istext = 1; } elsif ( $line =~ /^#/ or !$line ) { } else { print STDERR "Fehler in Eingabezeile $lineno\n$line\n" if $verb; } } } # read_data sub translate { my ($args, $data) = @_ ; my $trans = new Herbaer::Translate ($args -> {"trname"}) ; if (! $trans) { print STDERR "Kann Übersetzer " . $args -> {"trname"} . " nicht laden\n"; exit 1; } my $verb = $args -> {"[cnt]verbose"}; my $retrans = $args -> {"[cnt]retrans"}; my $srclang = $args -> {"srclang"}; my $ll = [split ("\\s+", $args -> {"tgtlang"})]; my $trdata = {}; my $srcdata = $data -> {"src"}; $data -> {"trans"} = $trdata; my $id; # Text-ID my $tgtl; # Zielsprache my $srcl; # Quellsprache my $hsrc; # Hash der Quelltexte my $htgt; # Hash der Übersetzungen my $tt; # übersetzter Text my $trn; # Übersetzername for $tgtl (@$ll) { next unless $tgtl; while ( ($id, $hsrc) = each (%$srcdata) ) { next if $hsrc -> {$tgtl} && !$retrans; $srcl = $srclang; if (! $hsrc -> {$srcl}) { ( $srcl ) = keys %$hsrc; } next if $srcl eq $tgtl; $htgt = $trdata -> {$id} //= {}; $tt = $trans -> translate ($hsrc -> {$srcl}, $srcl, $tgtl); $trn = $trans -> translator_name (); $htgt -> {$tgtl} = { "text" => $tt, "trname" => $trn, }; } } } # translate sub write_data { my ($args, $data) = @_ ; my $verb = $args -> {"[cnt]verbose"}; my $out = $args -> {"out"}; my $opt = { "%g" => ["g", "v", '@id', "WRITE_EMPTY"], "%v" => ["v", "d", '@l'], }; my $writer = Herbaer::XMLDataWriter -> new ($opt); $writer -> open ($out, "utf-8", "http://herbaer.de/xmlns/20151212/loctext/", ""); $writer -> write ("g", {}, $data -> {"trans"}); $writer -> close (); } # write_data # end of file KLEIDER/web/src/kalender/trans.pl