#! /usr/bin/perl -w # change a string in *.po files die "usage: change_text [-c comment] id text_line1 text_line2 ...\n" if @ARGV < 2; my $comment; if ($ARGV[0] eq '-c') { shift; $comment = shift; } my $id = shift; my @texts = @ARGV; $id =~ s/^txt_//; sub print_buffer (*$@) { my $fh = shift; my $need_fuzzy = shift; my @buffer = @_; if ($need_fuzzy) { if (@buffer and $buffer[0] =~ /^#,/) { if ($buffer[0] !~ /fuzzy/) { $buffer[0] =~ s/^#, //; $buffer[0] = "#, fuzzy, $buffer[0]"; } } else { unshift @buffer, "#, fuzzy\n"; } } print $fh @buffer; } for my $f ("bootloader.pot", <*.po>) { open OLD, $f or next; unless (open NEW, '>', "$f.new") { close OLD; next; } my $state = ''; my $need_fuzzy = 0; my @buffer; for () { if (/^#\. txt_\Q$id\E$/) { $state = 'ID'; $need_fuzzy = 0; if (defined $comment) { print NEW "#. $comment\n"; } else { print NEW @buffer; } @buffer = (); print NEW; } elsif (/^#\. txt_/) { print NEW @buffer; @buffer = (); print NEW; } elsif (/^#\. /) { $state = 'BUFFER'; push @buffer, $_; } elsif ($state eq 'ID' and /^#,/) { $state = 'BUFFER'; push @buffer, $_; } elsif ($state eq 'ID' and /^msgid/) { $state = 'MSGID'; if (@texts == 1) { push @buffer, "msgid \"$texts[0]\"\n"; } else { push @buffer, "msgid \"\"\n"; for my $text (@texts) { push @buffer, "\"$text\"\n"; } } } elsif ($state eq 'MSGID' and /^msgstr/) { $state = 'MSGSTR'; $need_fuzzy = 1 if /^msgstr ".+"/; push @buffer, $_; } elsif ($state eq 'MSGSTR' and /^".+"/) { $need_fuzzy = 1; push @buffer, $_; } elsif ($state eq 'MSGSTR' and /^$/) { print_buffer NEW, $need_fuzzy, @buffer; @buffer = (); $state = ''; $need_fuzzy = 0; print NEW; } elsif (/^$/) { print NEW @buffer; @buffer = (); print NEW; } elsif ($state eq 'BUFFER' or $state eq 'MSGID' or $state eq 'MSGSTR') { push @buffer, $_; } else { print NEW; } } if ($state ne '' and @buffer) { print_buffer NEW, $need_fuzzy, @buffer; } close NEW; close OLD; rename "$f.new", $f; }