diff options
author | Solomon Peachy <pizza@shaftnet.org> | 2024-04-29 21:16:43 -0400 |
---|---|---|
committer | Solomon Peachy <pizza@shaftnet.org> | 2024-04-29 22:03:12 -0400 |
commit | 73a47a1b5e821be75a5a4a0444f55786fece196a (patch) | |
tree | 762e6f6bfa8337df9da461909d5b686006597e2b /tools/updatelang | |
parent | 9fd4782c6a2c5908e16f75eba469dcf6c6435af9 (diff) | |
download | rockbox-73a47a1b5e821be75a5a4a0444f55786fece196a.tar.gz rockbox-73a47a1b5e821be75a5a4a0444f55786fece196a.zip |
updatelang: Make sure translated string has the correct format
We do this by parsing out the format specifiers and making sure the
translation has the correct number, type, and order of specifiers.
Percent literals ('%%') are ignored.
Mis-matched formats can lead to much badness, so to be safe, use the
untranslated string instead and flag it as a problem on the translation
site.
Change-Id: Ib48c2e5c3502735b1c724dd3621549faa8b602b7
Diffstat (limited to 'tools/updatelang')
-rwxr-xr-x | tools/updatelang | 44 |
1 files changed, 43 insertions, 1 deletions
diff --git a/tools/updatelang b/tools/updatelang index b67a28400c..2691f53e39 100755 --- a/tools/updatelang +++ b/tools/updatelang | |||
@@ -124,6 +124,37 @@ sub combinetgts { | |||
124 | return %combined; | 124 | return %combined; |
125 | } | 125 | } |
126 | 126 | ||
127 | sub reduceformat($) { | ||
128 | my ($in) = @_; | ||
129 | my $out = ""; | ||
130 | my $infmt = 0; | ||
131 | |||
132 | for (my $i = 0; $i < length($in) ; $i++) { | ||
133 | my $c = substr($in, $i, 1); | ||
134 | if (!$infmt && ($c eq '%')) { | ||
135 | # First char in a format string! | ||
136 | $infmt = 1; | ||
137 | next; | ||
138 | } | ||
139 | next if (!$infmt); | ||
140 | |||
141 | if ($c ne '%') { | ||
142 | # Ignore literal %, otherwise dump specifier over | ||
143 | $out .= $c; | ||
144 | } | ||
145 | |||
146 | # Look for a terminating field: | ||
147 | my $count = $c =~ tr/sSdDuUxXzZ%//; | ||
148 | if ($count) { | ||
149 | $infmt = 0; | ||
150 | next; | ||
151 | } | ||
152 | } | ||
153 | |||
154 | return $out; | ||
155 | } | ||
156 | |||
157 | |||
127 | ################## | 158 | ################## |
128 | 159 | ||
129 | if($#ARGV != 2) { | 160 | if($#ARGV != 2) { |
@@ -332,6 +363,17 @@ foreach my $id (@langorder) { | |||
332 | $lang{$id}{'notes'} .= "### The <dest> section for '$id:$tgt' is identical to english!\n"; | 363 | $lang{$id}{'notes'} .= "### The <dest> section for '$id:$tgt' is identical to english!\n"; |
333 | # print "#!! '$id:$tgt' dest identical ('$lp{$tgt}')\n"; | 364 | # print "#!! '$id:$tgt' dest identical ('$lp{$tgt}')\n"; |
334 | } | 365 | } |
366 | my $count1 = $ep{$tgt} =~ tr/%//; | ||
367 | my $count2 = $lp{$tgt} =~ tr/%//; | ||
368 | if ($count1 || $count2) { | ||
369 | my $fmt1 = reduceformat($ep{$tgt}); | ||
370 | my $fmt2 = reduceformat($lp{$tgt}); | ||
371 | if ($fmt1 ne $fmt2) { | ||
372 | $lang{$id}{'notes'} .= "### The <dest> section for '$id:$tgt' has incorrect format specifiers! Copying from English!\n"; | ||
373 | $lang{$id}{'dest'}{$tgt} = $english{$id}{'dest'}{$tgt}; | ||
374 | # print "#!! '$id:$tgt' dest does not match src format args: '$fmt1' vs '$fmt2'\n"; | ||
375 | } | ||
376 | } | ||
335 | } | 377 | } |
336 | } | 378 | } |
337 | 379 | ||
@@ -365,7 +407,7 @@ foreach my $id (@langorder) { | |||
365 | $lang{$id}{'voice'}{$tgt} = $english{$id}{'voice'}{$tgt}; | 407 | $lang{$id}{'voice'}{$tgt} = $english{$id}{'voice'}{$tgt}; |
366 | } elsif ($lp{$tgt} ne $ep{$tgt}) { | 408 | } elsif ($lp{$tgt} ne $ep{$tgt}) { |
367 | if ($lp{$tgt} eq '' && $ep{$tgt} ne '') { | 409 | if ($lp{$tgt} eq '' && $ep{$tgt} ne '') { |
368 | # If the lang voice string is blank, complain, and copy from English | 410 | # If the lang voice string is blank, complain and copy from translation |
369 | # print "#!! '$id:$tgt' voice is blank ('$lp{$tgt}' vs '$ep{$tgt}')\n"; | 411 | # print "#!! '$id:$tgt' voice is blank ('$lp{$tgt}' vs '$ep{$tgt}')\n"; |
370 | if ($lang{$id}{'dest'}{$tgt} ne '' && | 412 | if ($lang{$id}{'dest'}{$tgt} ne '' && |
371 | $lang{$id}{'dest'}{$tgt} ne $english{$id}{'dest'}{$tgt}) { | 413 | $lang{$id}{'dest'}{$tgt} ne $english{$id}{'dest'}{$tgt}) { |