]> git.ipfire.org Git - thirdparty/squid.git/blob - scripts/mk-error-details-po.pl
Source Format Enforcement (#1234)
[thirdparty/squid.git] / scripts / mk-error-details-po.pl
1 #!/usr/bin/perl -w
2 #
3 ## Copyright (C) 1996-2023 The Squid Software Foundation and contributors
4 ##
5 ## Squid software is distributed under GPLv2+ license and includes
6 ## contributions from numerous individuals and organizations.
7 ## Please see the COPYING and CONTRIBUTORS files for details.
8 ##
9
10 #
11 # Author: Tsantilas Christos
12 # (C) 2011 The Measurement Factory
13 #
14 # Usage:
15 # mk-error-details-po.pl error-details.txt
16 #
17 # This script read the error-details.txt error details template, and prints to the
18 # std output the contents of a .PO file template for translation.
19 # The error-details.txt file consist of records like the following:
20 #
21 # name: X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT
22 # detail: "SSL Certificate error: certificate issuer (CA) not known: %ssl_ca_name"
23 # descr: "Unable to get issuer certificate"
24 #
25 # The records separated with an empty line.
26 # Comments starting with '#' supported.
27 #
28
29 use warnings;
30 use strict;
31
32 my $File;
33 my $mode;
34
35 $File = shift @ARGV or
36 die "Usage: \n ".$0." error-detail-file\n\n";
37
38 open(IN, "<$File") or
39 die "Can not open file '$File': $!";
40
41 my @PO_RECORDS = ();
42 my $lineNumber=0;
43 while(my $line = <IN>) {
44 $lineNumber++;
45
46 if ($line =~ /^\#.*/ ) {
47 next;
48 }
49 elsif ($line =~ /^\s*$/ ) {
50 next;
51 }
52 my($rec) = "";
53 my($lineOffset) = 0;
54 do {
55 $rec = $rec.$line;
56 $line = <IN>;
57 $lineOffset++;
58 } while($line && $line !~ /^\s*$/);
59
60 processRecord(\@PO_RECORDS, $rec, $lineNumber);
61 $lineNumber= $lineNumber + $lineOffset;
62 }
63
64 foreach my $poRec (@PO_RECORDS) {
65 print $poRec->{"comment"};
66 print "msgid ".$poRec->{"msgid"}."\n";
67 # Being a template msgstr is always empty awaiting translated texts.
68 print "msgstr \"\"\n\n";
69 }
70
71 exit(0);
72
73
74 sub processRecord
75 {
76 my($RECS, $rec, $lnumber) = @_;
77 my(@lines) = split /\n/, $rec;
78 my($currentField) = "";
79 my(%currentRec);
80 my $offset = 0;
81 foreach my $l (@lines) {
82 if ($l =~ /^name:(.*)/) {
83 $currentRec{"name"} = trim($1);
84 $currentField = "name";
85 }
86 elsif ( $l =~ /^detail:(.*)/ ) {
87 $currentRec{"detail"} = toCstr(trim_quoted($1));
88 $currentField = "detail";
89 }
90 elsif ($l =~ /^descr:(.*)/) {
91 $currentRec{"descr"} = toCstr(trim_quoted($1));
92 $currentField = "descr";
93 }
94 elsif($l = ~ /^(\s+.*)/ && defined($currentRec{$currentField})) {
95 my($fmtl) = toCstr($1);
96 $currentRec{$currentField}= $currentRec{$currentField}."\\n".$fmtl;
97 }
98 }
99
100 my (%poRecDetail, %poRecDescr);
101
102 $poRecDetail{"comment"} = "#: $File+".$currentRec{"name"}.".detail:$lnumber\n";
103 $poRecDetail{"msgid"} = $currentRec{"detail"};
104 merge(\@$RECS, \%poRecDetail);
105
106 $poRecDescr{"comment"} = "#: $File+".$currentRec{"name"}.".descr:$lnumber\n";
107 $poRecDescr{"msgid"} = $currentRec{"descr"};
108 merge(\@$RECS, \%poRecDescr);
109 }
110
111 sub merge {
112 my ($RECS, $poRec) = @_;
113 foreach my $item (@$RECS) {
114 if ($poRec->{"msgid"} eq $item->{"msgid"}) {
115 $item->{"comment"} = $item->{"comment"}.$poRec->{"comment"};
116 return;
117 }
118 }
119 push @$RECS, $poRec;
120 return;
121 }
122
123 sub trim
124 {
125 my $string = shift;
126 $string =~ s/^\s+//;
127 $string =~ s/\s+$//;
128 return $string;
129 }
130
131 sub trim_quoted
132 {
133 my $string = shift;
134 $string =~ s/^\s+"/"/;
135 $string =~ s/"\s+$/"/;
136 return $string;
137 }
138
139 sub toCstr
140 {
141 my $string = shift;
142 $string =~ s/\t/\\t/g;
143 return $string;
144 }