source: git/lib/merge-po @ 8377f15

RELEASE/1.2debug-cidebug-ci-sanitisersstereowalls-data
Last change on this file since 8377f15 was ffe31e2, checked in by Olly Betts <olly@…>, 10 years ago

lib/merge-po: Add dropped messages with translations to
deadmessages.txt.

  • Property mode set to 100755
File size: 3.0 KB
Line 
1#!/usr/bin/perl -w
2require 5.008;
3use bytes;
4use strict;
5use POSIX;
6use Locale::PO;
7
8use integer;
9
10if (@ARGV == 0 || $ARGV[0] eq '--help') {
11  print STDERR "Syntax: $0 PO_FILE...\n";
12  exit (@ARGV != 0);
13}
14
15my %dropped;
16
17my $pot = Locale::PO->load_file_asarray("survex.pot");
18for my $po_file (@ARGV) {
19  my ($lang) = ($po_file =~ m!([^/]+)\.po$!);
20  my $po = Locale::PO->load_file_ashash($po_file);
21  if (!defined $po) {
22    print STDERR "$po_file: Bad!\n";
23    next;
24  }
25
26  # Build a map from msgno to po msgid, so we can find the old translation when
27  # a msgid has since changed in the pot file.
28  my %msgno_to_po;
29  foreach my $msgid (keys %{$po}) {
30    my $ref = $po->{$msgid}->reference;
31    if (defined $ref) {
32      my ($msgno) = $ref =~ /\bn:(\d+)/;
33      if (defined $msgno) {
34        $msgno_to_po{$msgno} = [ $msgid, $po->{$msgid}->msgstr ];
35      }
36    }
37  }
38
39  my @fuzzy;
40  open NEW, '>', "$po_file.tmp" or die $!;
41  foreach my $pot_entry (@{$pot}) {
42    my $msgid = $pot_entry->msgid;
43    my $msgstr = '""';
44    my $po_entry;
45    if (exists $$po{$msgid}) {
46        $po_entry = $$po{$msgid};
47        $msgstr = $po_entry->msgstr;
48        delete $$po{$msgid};
49        if ($msgid eq '""') {
50            $msgstr =~ s/\\n(..)/\\n"\n"$1/g;
51            print NEW "msgid $msgid\nmsgstr \"\"\n$msgstr\n";
52            next;
53        }
54    } else {
55        $po_entry = $pot_entry;
56    }
57    if (defined $pot_entry->automatic) {
58        my $automatic = "\n" . $pot_entry->automatic;
59        $automatic =~ s/\n/\n#. /g;
60        while ($automatic =~ s/\n#. \n/\n#.\n/g) { }
61        print NEW $automatic;
62    }
63    my $fuzzy = $po_entry->fuzzy;
64    my $ref = $pot_entry->reference;
65    if (defined $ref) {
66        if ($msgstr eq '""') {
67            my ($msgno) = $ref =~ /\bn:(\d+)/;
68            if (exists $msgno_to_po{$msgno}) {
69                my $old_msgid;
70                ($old_msgid, $msgstr) = @{$msgno_to_po{$msgno}};
71                if ($msgstr ne '""') {
72                    $fuzzy = 1;
73                    print "$po_file: Fuzzifying translation $old_msgid / $msgid -> $msgstr\n";
74                    push @fuzzy, $old_msgid;
75                }
76            }
77        }
78        $ref = "\n" . $ref;
79        $ref =~ s/\n/\n#: /mg;
80        print NEW $ref;
81    }
82    my $c_format = $pot_entry->c_format;
83    if ($fuzzy || $c_format) {
84        print NEW "\n#";
85        print NEW ", fuzzy" if $fuzzy;
86        print NEW ", c-format" if $c_format;
87    }
88    print NEW "\n";
89    print NEW "#~ " if $pot_entry->obsolete;
90    print NEW "msgid $msgid\n";
91    print NEW "#~ " if $pot_entry->obsolete;
92    print NEW "msgstr $msgstr\n";
93  }
94  close NEW or die $!;
95  unlink "$po_file.old";
96  delete @$po{@fuzzy};
97  for (sort keys %{$po}) {
98    my $msgstr = $$po{$_}->msgstr;
99    if ($msgstr ne '""') {
100      print "$po_file: Dropping [$_] -> [$msgstr]\n";
101      $dropped{$_}->{$lang} = $msgstr;
102    }
103  }
104  link $po_file, "$po_file.old" or die $!;
105  rename "$po_file.tmp", $po_file or die $!;
106}
107
108if (%dropped) {
109    print "Saving dropped messages to deadmessages.txt\n";
110    open DEAD, '>>deadmessages.txt' or die "Failed to open deadmessages.txt\n";
111    for (sort keys %dropped) {
112        print DEAD "\nmsgid \"$_\"\n";
113        my $h = $dropped{$_};
114        for my $lang (sort keys %$h) {
115            print DEAD "$lang $$h{$lang}\n";
116        }
117    }
118    close DEAD;
119}
Note: See TracBrowser for help on using the repository browser.