summaryrefslogtreecommitdiffstats
path: root/po/bin/po2txt
diff options
context:
space:
mode:
Diffstat (limited to 'po/bin/po2txt')
-rwxr-xr-xpo/bin/po2txt165
1 files changed, 165 insertions, 0 deletions
diff --git a/po/bin/po2txt b/po/bin/po2txt
new file mode 100755
index 0000000..f10ee5b
--- /dev/null
+++ b/po/bin/po2txt
@@ -0,0 +1,165 @@
+#! /usr/bin/perl
+
+# convert *.po files to texts.* files suitable for gfxboot
+# usage: po2txt lang.po >texts.lang
+# Note: en.po ist treated specially!
+
+use Getopt::Long;
+
+sub read_texts;
+sub join_msg;
+
+$opt_product = "SUSE Linux";
+
+GetOptions(
+ 'product=s' => \$opt_product
+);
+
+
+for $lang (@ARGV) {
+ $lang = 'en' if $lang eq 'bootloader.pot';
+ $lang =~ s/\.po$//;
+ read_texts $lang;
+}
+
+sub read_texts
+{
+ local $_;
+
+ my ($lang, @f, $txt, $context, $t, $p, $ids, $file);
+
+ $lang = shift;
+
+ $file = "$lang.po";
+ $file = 'bootloader.pot' if $lang eq 'en';
+
+ if($lang eq 'en') {
+ $ids = 1;
+ }
+
+ open F, $file;
+ @f = (<F>);
+ close F;
+
+ map { s/<product>/$opt_product/g; } @f;
+
+ $_ = $lang;
+ s/.*\///;
+
+ for (@f) {
+ if(/^\s*#\.\s*(txt_\S+)/) {
+ if($txt) {
+ @msgstr = @msgid if $ids || join_msg(\@msgstr) eq "";
+ $txts{$txt} = join_msg(\@msgstr);
+ }
+
+ $txt = $1;
+
+ undef @msgid;
+ undef @msgstr;
+ undef $context;
+ next;
+ }
+
+ next if /^\s*#.*|^\s*$/;
+
+ if(/^\s*msgid\s*(\".*\")\s*$/) {
+ push @msgid, $1 unless $1 eq '""';
+ $context = 1;
+ next;
+ }
+
+ if(/^\s*msgstr\s*(\".*\")\s*$/) {
+ push @msgstr, $1 unless $1 eq '""';
+ $context = 2;
+ next;
+ }
+
+ if(/^\s*(\".*\")\s*$/) {
+ if($context == 1) {
+ push @msgid, $1;
+ }
+ elsif($context == 2) {
+ push @msgstr, $1;
+ }
+ else {
+ die "format oops in ${lang}.po: $_"
+ }
+ }
+ }
+
+ if($txt) {
+ @msgstr = @msgid if $ids || join_msg(\@msgstr) eq "";
+ $txts{$txt} = join_msg(\@msgstr);
+ }
+
+ @txts = sort keys %txts;
+
+ for (@txts) {
+ $txt = $txts{$_};
+ $txt =~ s/\\"/"/g;
+ $txt =~ s/\\\\/\\/g;
+ $txt =~ s/\\n/\n/g;
+ print "$txt\x00"
+ }
+
+ if($ids) {
+ open W, ">text.inc";
+ print W "%\n% This file is generated automatically. Editing it is pointless.\n%\n\n";
+ print W "/texts [\n";
+ $p = pop @txts;
+ for (@txts) { print W " /$_\n" }
+ print W " /$p\n] def\n";
+ close W;
+ }
+ else {
+ open F, "text.inc";
+ for (<F>) {
+ if(/\s+\/(txt_\S+)/) {
+ $txt_ref{$1} = undef;
+ }
+ }
+ close F;
+ for (@txts) {
+ $txt_list{$_}++;
+ $txt_multi{$_} = 1 if $txt_list{$_} > 1;
+ }
+ for (@txts) {
+ $txt_unknown{$_} = 1 unless exists $txt_ref{$_};
+ }
+ for (keys %txt_ref) {
+ $txt_miss{$_} = 1 unless exists $txt_list{$_};
+ }
+
+ if(defined(%txt_miss) || defined(%txt_unknown) || defined(%txt_multi)) {
+ print STDERR "$lang:\n";
+ for (sort keys %txt_miss) {
+ print STDERR " missing: $_\n"
+ }
+ for (sort keys %txt_unknown) {
+ print STDERR " unknown: $_\n"
+ }
+ for (sort keys %txt_multi) {
+ print STDERR " multi: $_\n"
+ }
+ }
+ }
+
+}
+
+
+sub join_msg
+{
+ local $_;
+ my ($s, $msg, $m);
+
+ $msg = shift;
+
+ for $s (@{$msg}) {
+ $_ = $s;
+ s/^\"(.*)\"$/$1/;
+ $m .= $_;
+ }
+
+ return $m;
+}