summaryrefslogtreecommitdiff
path: root/mkpot
blob: dd6ade929083fd529722d871e0ed8359c0092c24 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#!/usr/bin/perl

# extract translation strings

use POSIX 'strftime';

my $date = strftime '%F %T%z', localtime;
my $prog = shift or die "Usage: $0 PROG\n";
my ($package, $version) = `perl $prog --version 2>/dev/null`
    =~ /^(?:(?:GNU|Free)\s+)?(?:(\w\S+)\s+)?(\d\S+)\n/;

($package = $prog) =~ s!.*/!! unless $package;
$version ||= 'unknown';

open PARSER, "perl -MO=Deparse,-l $prog 2>/dev/null |"
    or die "can't fork: $!";

print <<EOT;
# Translation template for $package
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: $package $version\\n"
"POT-Creation-Date: $date\\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\\n"
"Language-Team: LANGUAGE <LL@li.org>\\n"
"MIME-Version: 1.0\\n"
"Content-Type: text/plain; charset=CHARSET\\n"
"Content-Transfer-Encoding: ENCODING\\n"
EOT

my $line = 1;
my $file = $prog;
my %close = (
    '(' => ')',
    '[' => ']',
    '<' => '>',
    '{' => '}',
);

my %seen;

while (<PARSER>)
{
    chomp;
    ($line, $file) = ($1, $2) if /^#\s*line\s+(\d+)\s+"([^"]+)"/;
    while (s/.*?\bN?_\(//)
    {
	my $single;
	my $o = '';
	my $c;
	if (s/^q(q?)(.)//)
	{
	    $single = !length $1;
	    if ($c = $close{$2})
	    {
		$o = $2;
	    }
	    else
	    {
		$c = $2;
	    }
	}
	elsif (s/^(["'])//)
	{
	    $single = $1 eq "'";
	    $c = $1;
	}
	else
	{
	    die "$file:$line: can't determine quote style\n";
	}

	my $nest = $o ? "|\Q$o\E[^\Q$c\E]*\Q$c\E" : '';
	my $text = s/^((?:\\.|[^\Q$o$c\E\\]+$nest)*)// ? $1 :
	    die "$file:$line: can't find closing quote $c\n";

	for ($text)
	{
	    unless ($single)
	    {
		1 while s/(^|[^\\])\\n/$1\n/g;
		s/\\([\$\@])/$1/g;
	    }

	    s/"/\\"/g;
	    if (s/\n/\\n"\n"/g)
	    {
		s/^/"\n"/;
		s/"\n"$//;
	    }
	}

	print <<EOT unless $seen{$text}++;

#: $file:$line
msgid "$text"
msgstr ""
EOT
    }
}