| line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
|
1
|
|
|
|
|
|
|
package Font::TTF::Name; |
|
2
|
|
|
|
|
|
|
|
|
3
|
|
|
|
|
|
|
=head1 NAME |
|
4
|
|
|
|
|
|
|
|
|
5
|
|
|
|
|
|
|
Font::TTF::Name - String table for a TTF font |
|
6
|
|
|
|
|
|
|
|
|
7
|
|
|
|
|
|
|
=head1 DESCRIPTION |
|
8
|
|
|
|
|
|
|
|
|
9
|
|
|
|
|
|
|
Strings are held by number, platform, encoding and language. Strings are |
|
10
|
|
|
|
|
|
|
accessed as: |
|
11
|
|
|
|
|
|
|
|
|
12
|
|
|
|
|
|
|
$f->{'name'}{'strings'}[$number][$platform_id][$encoding_id]{$language_id} |
|
13
|
|
|
|
|
|
|
|
|
14
|
|
|
|
|
|
|
Notice that the language is held in an associative array due to its sparse |
|
15
|
|
|
|
|
|
|
nature on some platforms such as Microsoft ($pid = 3). Notice also that the |
|
16
|
|
|
|
|
|
|
array order is different from the stored array order (platform, encoding, |
|
17
|
|
|
|
|
|
|
language, number) to allow for easy manipulation of strings by number (which is |
|
18
|
|
|
|
|
|
|
what I guess most people will want to do). |
|
19
|
|
|
|
|
|
|
|
|
20
|
|
|
|
|
|
|
By default, C<$Font::TTF::Name::utf8> is set to 1, and strings will be stored as UTF8 wherever |
|
21
|
|
|
|
|
|
|
possible. The method C can be used to find out if a string in a particular |
|
22
|
|
|
|
|
|
|
platform and encoding will be returned as UTF8. Unicode strings are always |
|
23
|
|
|
|
|
|
|
converted if utf8 is requested. Otherwise, strings are stored according to platform: |
|
24
|
|
|
|
|
|
|
|
|
25
|
|
|
|
|
|
|
You now have to set <$Font::TTF::Name::utf8> to 0 to get the old behaviour. |
|
26
|
|
|
|
|
|
|
|
|
27
|
|
|
|
|
|
|
=over 4 |
|
28
|
|
|
|
|
|
|
|
|
29
|
|
|
|
|
|
|
=item Apple Unicode (platform id = 0) |
|
30
|
|
|
|
|
|
|
|
|
31
|
|
|
|
|
|
|
Data is stored as network ordered UCS2. There is no encoding id for this platform |
|
32
|
|
|
|
|
|
|
but there are language ids as per Mac language ids. |
|
33
|
|
|
|
|
|
|
|
|
34
|
|
|
|
|
|
|
=item Mac (platform id = 1) |
|
35
|
|
|
|
|
|
|
|
|
36
|
|
|
|
|
|
|
Data is stored as 8-bit binary data, leaving the interpretation to the user |
|
37
|
|
|
|
|
|
|
according to encoding id. |
|
38
|
|
|
|
|
|
|
|
|
39
|
|
|
|
|
|
|
=item Unicode (platform id = 2) |
|
40
|
|
|
|
|
|
|
|
|
41
|
|
|
|
|
|
|
Currently stored as 16-bit network ordered UCS2. Upon release of Perl 5.005 this |
|
42
|
|
|
|
|
|
|
will change to utf8 assuming current UCS2 semantics for all encoding ids. |
|
43
|
|
|
|
|
|
|
|
|
44
|
|
|
|
|
|
|
=item Windows (platform id = 3) |
|
45
|
|
|
|
|
|
|
|
|
46
|
|
|
|
|
|
|
As per Unicode, the data is currently stored as 16-bit network ordered UCS2. Upon |
|
47
|
|
|
|
|
|
|
release of Perl 5.005 this will change to utf8 assuming current UCS2 semantics for |
|
48
|
|
|
|
|
|
|
all encoding ids. |
|
49
|
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
=back |
|
51
|
|
|
|
|
|
|
|
|
52
|
|
|
|
|
|
|
=head1 INSTANCE VARIABLES |
|
53
|
|
|
|
|
|
|
|
|
54
|
|
|
|
|
|
|
=over 4 |
|
55
|
|
|
|
|
|
|
|
|
56
|
|
|
|
|
|
|
=item strings |
|
57
|
|
|
|
|
|
|
|
|
58
|
|
|
|
|
|
|
An array of arrays, etc. |
|
59
|
|
|
|
|
|
|
|
|
60
|
|
|
|
|
|
|
=back |
|
61
|
|
|
|
|
|
|
|
|
62
|
|
|
|
|
|
|
=head1 METHODS |
|
63
|
|
|
|
|
|
|
|
|
64
|
|
|
|
|
|
|
=cut |
|
65
|
|
|
|
|
|
|
|
|
66
|
1
|
|
|
1
|
|
4
|
use strict; |
|
|
1
|
|
|
|
|
2
|
|
|
|
1
|
|
|
|
|
35
|
|
|
67
|
1
|
|
|
1
|
|
4
|
use vars qw(@ISA $VERSION @apple_encs @apple_encodings $utf8 $cp_1252 @cp_1252 %win_langs %langs_win %langs_mac @ms_langids @mac_langs); |
|
|
1
|
|
|
|
|
1
|
|
|
|
1
|
|
|
|
|
102
|
|
|
68
|
1
|
|
|
1
|
|
5
|
use Font::TTF::Table; |
|
|
1
|
|
|
|
|
1
|
|
|
|
1
|
|
|
|
|
13
|
|
|
69
|
1
|
|
|
1
|
|
5
|
use Font::TTF::Utils; |
|
|
1
|
|
|
|
|
1
|
|
|
|
1
|
|
|
|
|
433
|
|
|
70
|
|
|
|
|
|
|
@ISA = qw(Font::TTF::Table); |
|
71
|
|
|
|
|
|
|
|
|
72
|
|
|
|
|
|
|
$utf8 = 1; |
|
73
|
|
|
|
|
|
|
|
|
74
|
|
|
|
|
|
|
{ |
|
75
|
|
|
|
|
|
|
my ($count, $i); |
|
76
|
|
|
|
|
|
|
eval {require Compress::Zlib;}; |
|
77
|
|
|
|
|
|
|
unless ($@) |
|
78
|
|
|
|
|
|
|
{ |
|
79
|
|
|
|
|
|
|
for ($i = 0; $i <= $#apple_encs; $i++) |
|
80
|
|
|
|
|
|
|
{ |
|
81
|
|
|
|
|
|
|
$apple_encodings[0][$i] = [unpack("n*", Compress::Zlib::uncompress(unpack("u", $apple_encs[$i])))] |
|
82
|
|
|
|
|
|
|
if (defined $apple_encs[$i]); |
|
83
|
|
|
|
|
|
|
foreach (0 .. 127) |
|
84
|
|
|
|
|
|
|
{ $apple_encodings[0][$i][$_] = $_; } |
|
85
|
|
|
|
|
|
|
$count = 0; |
|
86
|
|
|
|
|
|
|
$apple_encodings[1][$i] = {map {$_ => $count++} @{$apple_encodings[0][$i]}}; |
|
87
|
|
|
|
|
|
|
} |
|
88
|
|
|
|
|
|
|
$cp_1252[0] = [unpack("n*", Compress::Zlib::uncompress(unpack("u", $cp_1252)))]; |
|
89
|
|
|
|
|
|
|
$count = 0; |
|
90
|
|
|
|
|
|
|
$cp_1252[1] = {map({$_ => $count++} @{$cp_1252[0]})}; |
|
91
|
|
|
|
|
|
|
} |
|
92
|
|
|
|
|
|
|
for ($i = 0; $i < $#ms_langids; $i++) |
|
93
|
|
|
|
|
|
|
{ |
|
94
|
|
|
|
|
|
|
if (defined $ms_langids[$i][1]) |
|
95
|
|
|
|
|
|
|
{ |
|
96
|
|
|
|
|
|
|
my ($j); |
|
97
|
|
|
|
|
|
|
for ($j = 0; $j < $#{$ms_langids[$i][1]}; $j++) |
|
98
|
|
|
|
|
|
|
{ |
|
99
|
|
|
|
|
|
|
my ($v) = $ms_langids[$i][1][$j]; |
|
100
|
|
|
|
|
|
|
if ($v =~ m/^-/o) |
|
101
|
|
|
|
|
|
|
{ $win_langs{(($j + 1) << 10) + $i} = $ms_langids[$i][0] . $v; } |
|
102
|
|
|
|
|
|
|
else |
|
103
|
|
|
|
|
|
|
{ $win_langs{(($j + 1) << 10) + $i} = $v; } |
|
104
|
|
|
|
|
|
|
} |
|
105
|
|
|
|
|
|
|
} |
|
106
|
|
|
|
|
|
|
else |
|
107
|
|
|
|
|
|
|
{ $win_langs{$i + 0x400} = $ms_langids[$i][0]; } |
|
108
|
|
|
|
|
|
|
} |
|
109
|
|
|
|
|
|
|
%langs_win = map {my ($t) = $win_langs{$_}; my (@res) = ($t => $_); push (@res, $t => $_) if ($t =~ s/-.*$//o && ($_ & 0xFC00) == 0x400); @res} keys %win_langs; |
|
110
|
|
|
|
|
|
|
$i = 0; |
|
111
|
|
|
|
|
|
|
%langs_mac = map {$_ => $i++} @mac_langs; |
|
112
|
|
|
|
|
|
|
} |
|
113
|
|
|
|
|
|
|
|
|
114
|
|
|
|
|
|
|
|
|
115
|
|
|
|
|
|
|
$VERSION = 1.1; # MJPH 17-JUN-2000 Add utf8 support |
|
116
|
|
|
|
|
|
|
# $VERSION = 1.001; # MJPH 10-AUG-1998 Put $number first in list |
|
117
|
|
|
|
|
|
|
|
|
118
|
|
|
|
|
|
|
=head2 $t->read |
|
119
|
|
|
|
|
|
|
|
|
120
|
|
|
|
|
|
|
Reads all the names into memory |
|
121
|
|
|
|
|
|
|
|
|
122
|
|
|
|
|
|
|
=cut |
|
123
|
|
|
|
|
|
|
|
|
124
|
|
|
|
|
|
|
sub read |
|
125
|
|
|
|
|
|
|
{ |
|
126
|
2
|
|
|
2
|
1
|
13
|
my ($self) = @_; |
|
127
|
2
|
50
|
|
|
|
14
|
$self->SUPER::read or return $self; |
|
128
|
|
|
|
|
|
|
|
|
129
|
2
|
|
|
|
|
6
|
my ($fh) = $self->{' INFILE'}; |
|
130
|
2
|
|
|
|
|
3
|
my ($dat, $num, $stroff, $i, $pid, $eid, $lid, $nid, $len, $off, $here); |
|
131
|
|
|
|
|
|
|
|
|
132
|
2
|
|
|
|
|
7
|
$fh->read($dat, 6); |
|
133
|
2
|
|
|
|
|
34
|
($num, $stroff) = unpack("x2nn", $dat); |
|
134
|
2
|
|
|
|
|
15
|
for ($i = 0; $i < $num; $i++) |
|
135
|
|
|
|
|
|
|
{ |
|
136
|
1
|
|
|
1
|
|
5
|
use bytes; # hack to fix bugs in 5.8.7 |
|
|
1
|
|
|
|
|
1
|
|
|
|
1
|
|
|
|
|
7
|
|
|
137
|
122
|
|
|
|
|
1777
|
read($fh, $dat, 12); |
|
138
|
122
|
|
|
|
|
937
|
($pid, $eid, $lid, $nid, $len, $off) = unpack("n6", $dat); |
|
139
|
122
|
|
|
|
|
333
|
$here = $fh->tell(); |
|
140
|
122
|
|
|
|
|
847
|
$fh->seek($self->{' OFFSET'} + $stroff + $off, 0); |
|
141
|
122
|
|
|
|
|
1015
|
$fh->read($dat, $len); |
|
142
|
122
|
50
|
|
|
|
1236
|
if ($utf8) |
|
143
|
|
|
|
|
|
|
{ |
|
144
|
122
|
100
|
66
|
|
|
881
|
if ($pid == 1 && defined $apple_encodings[0][$eid]) |
|
|
|
50
|
33
|
|
|
|
|
|
|
|
50
|
33
|
|
|
|
|
|
|
|
|
33
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
|
33
|
|
|
|
|
|
145
|
32
|
|
|
|
|
518
|
{ $dat = TTF_word_utf8(pack("n*", map({$apple_encodings[0][$eid][$_]} unpack("C*", $dat)))); } |
|
|
9786
|
|
|
|
|
11247
|
|
|
146
|
|
|
|
|
|
|
elsif ($pid == 2 && $eid == 2 && @cp_1252) |
|
147
|
0
|
|
|
|
|
0
|
{ $dat = TTF_word_utf8(pack("n*", map({$cp_1252[0][$_]} unpack("C*", $dat)))); } |
|
|
0
|
|
|
|
|
0
|
|
|
148
|
|
|
|
|
|
|
elsif ($pid == 0 || $pid == 3 || ($pid == 2 && $eid == 1)) |
|
149
|
90
|
|
|
|
|
216
|
{ $dat = TTF_word_utf8($dat); } |
|
150
|
|
|
|
|
|
|
} |
|
151
|
122
|
|
|
|
|
990
|
$self->{'strings'}[$nid][$pid][$eid]{$lid} = $dat; |
|
152
|
122
|
|
|
|
|
307
|
$fh->seek($here, 0); |
|
153
|
|
|
|
|
|
|
} |
|
154
|
2
|
|
|
|
|
35
|
$self; |
|
155
|
|
|
|
|
|
|
} |
|
156
|
|
|
|
|
|
|
|
|
157
|
|
|
|
|
|
|
|
|
158
|
|
|
|
|
|
|
=head2 $t->out($fh) |
|
159
|
|
|
|
|
|
|
|
|
160
|
|
|
|
|
|
|
Writes out all the strings |
|
161
|
|
|
|
|
|
|
|
|
162
|
|
|
|
|
|
|
=cut |
|
163
|
|
|
|
|
|
|
|
|
164
|
|
|
|
|
|
|
sub out |
|
165
|
|
|
|
|
|
|
{ |
|
166
|
2
|
|
|
2
|
1
|
4
|
my ($self, $fh) = @_; |
|
167
|
2
|
|
|
|
|
3
|
my ($pid, $eid, $lid, $nid, $todo, @todo); |
|
168
|
0
|
|
|
|
|
0
|
my ($len, $loc, $stroff, $endloc, $str_trans); |
|
169
|
0
|
|
|
|
|
0
|
my (%dedup, @strings, @offsets, $strcount); |
|
170
|
|
|
|
|
|
|
|
|
171
|
2
|
50
|
|
|
|
6
|
return $self->SUPER::out($fh) unless $self->{' read'}; |
|
172
|
|
|
|
|
|
|
|
|
173
|
2
|
|
|
|
|
4
|
$strcount = 0; |
|
174
|
2
|
|
|
|
|
5
|
$offsets[0] = 0; |
|
175
|
2
|
|
|
|
|
7
|
$loc = $fh->tell(); |
|
176
|
2
|
|
|
|
|
15
|
$fh->print(pack("n3", 0, 0, 0)); |
|
177
|
2
|
|
|
|
|
12
|
foreach $nid (0 .. $#{$self->{'strings'}}) |
|
|
2
|
|
|
|
|
10
|
|
|
178
|
|
|
|
|
|
|
{ |
|
179
|
4156
|
|
|
|
|
3161
|
foreach $pid (0 .. $#{$self->{'strings'}[$nid]}) |
|
|
4156
|
|
|
|
|
7154
|
|
|
180
|
|
|
|
|
|
|
{ |
|
181
|
364
|
|
|
|
|
277
|
foreach $eid (0 .. $#{$self->{'strings'}[$nid][$pid]}) |
|
|
364
|
|
|
|
|
812
|
|
|
182
|
|
|
|
|
|
|
{ |
|
183
|
212
|
|
|
|
|
153
|
foreach $lid (sort keys %{$self->{'strings'}[$nid][$pid][$eid]}) |
|
|
212
|
|
|
|
|
669
|
|
|
184
|
|
|
|
|
|
|
{ |
|
185
|
122
|
|
|
|
|
193
|
$str_trans = $self->{'strings'}[$nid][$pid][$eid]{$lid}; |
|
186
|
122
|
50
|
|
|
|
201
|
if ($utf8) |
|
187
|
|
|
|
|
|
|
{ |
|
188
|
122
|
100
|
66
|
|
|
929
|
if ($pid == 1 && defined $apple_encodings[1][$eid]) |
|
|
|
50
|
33
|
|
|
|
|
|
|
|
50
|
33
|
|
|
|
|
|
|
|
50
|
33
|
|
|
|
|
|
|
|
|
33
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
|
33
|
|
|
|
|
|
189
|
9786
|
50
|
|
|
|
21244
|
{ $str_trans = pack("C*", |
|
190
|
32
|
|
|
|
|
77
|
map({$apple_encodings[1][$eid]{$_} || 0x3F} unpack("n*", |
|
191
|
|
|
|
|
|
|
TTF_utf8_word($str_trans)))); } |
|
192
|
|
|
|
|
|
|
elsif ($pid == 2 && $eid == 2 && @cp_1252) |
|
193
|
0
|
0
|
|
|
|
0
|
{ $str_trans = pack("C*", |
|
194
|
0
|
|
|
|
|
0
|
map({$cp_1252[1][$eid]{$_} || 0x3F} unpack("n*", |
|
195
|
|
|
|
|
|
|
TTF_utf8_word($str_trans)))); } |
|
196
|
|
|
|
|
|
|
elsif ($pid == 2 && $eid == 0) |
|
197
|
0
|
|
|
|
|
0
|
{ $str_trans =~ s/[\xc0-\xff][\x80-\xbf]+/?/og; } |
|
198
|
|
|
|
|
|
|
elsif ($pid == 0 || $pid == 3 || ($pid == 2 && $eid == 1)) |
|
199
|
90
|
|
|
|
|
208
|
{ $str_trans = TTF_utf8_word($str_trans); } |
|
200
|
|
|
|
|
|
|
} |
|
201
|
122
|
|
|
|
|
1360
|
my ($str_ind); |
|
202
|
122
|
100
|
|
|
|
355
|
unless (defined $dedup{$str_trans}) |
|
203
|
|
|
|
|
|
|
{ |
|
204
|
1
|
|
|
1
|
|
431
|
use bytes; |
|
|
1
|
|
|
|
|
1
|
|
|
|
1
|
|
|
|
|
5
|
|
|
205
|
112
|
|
|
|
|
408
|
$dedup{$str_trans} = $strcount; |
|
206
|
112
|
|
|
|
|
353
|
$strings[$strcount] = $str_trans; |
|
207
|
112
|
|
|
|
|
97
|
$strcount++; |
|
208
|
112
|
|
|
|
|
282
|
$offsets[$strcount] = $offsets[$strcount-1] + bytes::length($str_trans); |
|
209
|
|
|
|
|
|
|
} |
|
210
|
122
|
|
|
|
|
1194
|
$str_ind = $dedup{$str_trans}; |
|
211
|
122
|
|
|
|
|
539
|
push (@todo, [$pid, $eid, $lid, $nid, $str_ind]); |
|
212
|
|
|
|
|
|
|
} |
|
213
|
|
|
|
|
|
|
} |
|
214
|
|
|
|
|
|
|
} |
|
215
|
|
|
|
|
|
|
} |
|
216
|
|
|
|
|
|
|
|
|
217
|
2
|
0
|
66
|
|
|
18
|
@todo = (sort {$a->[0] <=> $b->[0] || $a->[1] <=> $b->[1] || $a->[2] <=> $b->[2] |
|
|
288
|
|
66
|
|
|
1123
|
|
|
218
|
|
|
|
|
|
|
|| $a->[3] <=> $b->[3]} @todo); |
|
219
|
2
|
|
|
|
|
5
|
foreach $todo (@todo) |
|
220
|
122
|
|
|
|
|
488
|
{ $fh->print(pack("n6", @{$todo}[0..3], $offsets[$todo->[4]+1] - $offsets[$todo->[4]], $offsets[$todo->[4]])); } |
|
|
122
|
|
|
|
|
383
|
|
|
221
|
|
|
|
|
|
|
|
|
222
|
2
|
|
|
|
|
21
|
$stroff = $fh->tell() - $loc; |
|
223
|
2
|
|
|
|
|
19
|
foreach my $str (@strings) |
|
224
|
112
|
|
|
|
|
564
|
{ $fh->print($str); } |
|
225
|
|
|
|
|
|
|
|
|
226
|
2
|
|
|
|
|
15
|
$endloc = $fh->tell(); |
|
227
|
2
|
|
|
|
|
15
|
$fh->seek($loc, 0); |
|
228
|
2
|
|
|
|
|
65
|
$fh->print(pack("n3", 0, $#todo + 1, $stroff)); |
|
229
|
2
|
|
|
|
|
11
|
$fh->seek($endloc, 0); |
|
230
|
2
|
|
|
|
|
77
|
$self; |
|
231
|
|
|
|
|
|
|
} |
|
232
|
|
|
|
|
|
|
|
|
233
|
|
|
|
|
|
|
|
|
234
|
|
|
|
|
|
|
=head2 $t->XML_element($context, $depth, $key, $value) |
|
235
|
|
|
|
|
|
|
|
|
236
|
|
|
|
|
|
|
Outputs the string element in nice XML (which is all the table really!) |
|
237
|
|
|
|
|
|
|
|
|
238
|
|
|
|
|
|
|
=cut |
|
239
|
|
|
|
|
|
|
|
|
240
|
|
|
|
|
|
|
sub XML_element |
|
241
|
|
|
|
|
|
|
{ |
|
242
|
0
|
|
|
0
|
1
|
|
my ($self) = shift; |
|
243
|
0
|
|
|
|
|
|
my ($context, $depth, $key, $value) = @_; |
|
244
|
0
|
|
|
|
|
|
my ($fh) = $context->{'fh'}; |
|
245
|
0
|
|
|
|
|
|
my ($nid, $pid, $eid, $lid); |
|
246
|
|
|
|
|
|
|
|
|
247
|
0
|
0
|
|
|
|
|
return $self->SUPER::XML_element(@_) unless ($key eq 'strings'); |
|
248
|
|
|
|
|
|
|
|
|
249
|
0
|
|
|
|
|
|
foreach $nid (0 .. $#{$self->{'strings'}}) |
|
|
0
|
|
|
|
|
|
|
|
250
|
|
|
|
|
|
|
{ |
|
251
|
0
|
0
|
|
|
|
|
next unless ref($self->{'strings'}[$nid]); |
|
252
|
|
|
|
|
|
|
# $fh->print("$depth\n"); |
|
253
|
0
|
|
|
|
|
|
foreach $pid (0 .. $#{$self->{'strings'}[$nid]}) |
|
|
0
|
|
|
|
|
|
|
|
254
|
|
|
|
|
|
|
{ |
|
255
|
0
|
|
|
|
|
|
foreach $eid (0 .. $#{$self->{'strings'}[$nid][$pid]}) |
|
|
0
|
|
|
|
|
|
|
|
256
|
|
|
|
|
|
|
{ |
|
257
|
0
|
|
|
|
|
|
foreach $lid (sort {$a <=> $b} keys %{$self->{'strings'}[$nid][$pid][$eid]}) |
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
258
|
|
|
|
|
|
|
{ |
|
259
|
0
|
|
0
|
|
|
|
my ($lang) = $self->get_lang($pid, $lid) || $lid; |
|
260
|
0
|
|
|
|
|
|
$fh->printf("%s\n%s%s%s\n%s\n", |
|
261
|
|
|
|
|
|
|
$depth, $nid, $pid, $eid, $lang, $depth, |
|
262
|
|
|
|
|
|
|
$context->{'indent'}, $self->{'strings'}[$nid][$pid][$eid]{$lid}, $depth); |
|
263
|
|
|
|
|
|
|
} |
|
264
|
|
|
|
|
|
|
} |
|
265
|
|
|
|
|
|
|
} |
|
266
|
|
|
|
|
|
|
# $fh->print("$depth\n"); |
|
267
|
|
|
|
|
|
|
} |
|
268
|
0
|
|
|
|
|
|
$self; |
|
269
|
|
|
|
|
|
|
} |
|
270
|
|
|
|
|
|
|
|
|
271
|
|
|
|
|
|
|
|
|
272
|
|
|
|
|
|
|
=head2 $t->XML_end($context, $tag, %attrs) |
|
273
|
|
|
|
|
|
|
|
|
274
|
|
|
|
|
|
|
Store strings in the right place |
|
275
|
|
|
|
|
|
|
|
|
276
|
|
|
|
|
|
|
=cut |
|
277
|
|
|
|
|
|
|
|
|
278
|
|
|
|
|
|
|
sub XML_end |
|
279
|
|
|
|
|
|
|
{ |
|
280
|
0
|
|
|
0
|
1
|
|
my ($self) = shift; |
|
281
|
0
|
|
|
|
|
|
my ($context, $tag, %attrs) = @_; |
|
282
|
|
|
|
|
|
|
|
|
283
|
0
|
0
|
|
|
|
|
if ($tag eq 'string') |
|
284
|
|
|
|
|
|
|
{ |
|
285
|
0
|
|
0
|
|
|
|
my ($lid) = $self->find_name($attrs{'platform'}, $attrs{'language'}) || $attrs{'language'}; |
|
286
|
0
|
|
|
|
|
|
$self->{'strings'}[$attrs{'id'}][$attrs{'platform'}][$attrs{'encoding'}]{$lid} |
|
287
|
|
|
|
|
|
|
= $context->{'text'}; |
|
288
|
0
|
|
|
|
|
|
return $context; |
|
289
|
|
|
|
|
|
|
} |
|
290
|
|
|
|
|
|
|
else |
|
291
|
0
|
|
|
|
|
|
{ return $self->SUPER::XML_end(@_); } |
|
292
|
|
|
|
|
|
|
} |
|
293
|
|
|
|
|
|
|
|
|
294
|
|
|
|
|
|
|
=head2 $t->minsize() |
|
295
|
|
|
|
|
|
|
|
|
296
|
|
|
|
|
|
|
Returns the minimum size this table can be. If it is smaller than this, then the table |
|
297
|
|
|
|
|
|
|
must be bad and should be deleted or whatever. |
|
298
|
|
|
|
|
|
|
|
|
299
|
|
|
|
|
|
|
=cut |
|
300
|
|
|
|
|
|
|
|
|
301
|
|
|
|
|
|
|
sub minsize |
|
302
|
|
|
|
|
|
|
{ |
|
303
|
0
|
|
|
0
|
1
|
|
return 6; |
|
304
|
|
|
|
|
|
|
} |
|
305
|
|
|
|
|
|
|
|
|
306
|
|
|
|
|
|
|
=head2 is_utf8($pid, $eid) |
|
307
|
|
|
|
|
|
|
|
|
308
|
|
|
|
|
|
|
Returns whether a string of a given platform and encoding is going to be in UTF8 |
|
309
|
|
|
|
|
|
|
|
|
310
|
|
|
|
|
|
|
=cut |
|
311
|
|
|
|
|
|
|
|
|
312
|
|
|
|
|
|
|
sub is_utf8 |
|
313
|
|
|
|
|
|
|
{ |
|
314
|
0
|
|
|
0
|
1
|
|
my ($self, $pid, $eid) = @_; |
|
315
|
|
|
|
|
|
|
|
|
316
|
0
|
|
0
|
|
|
|
return ($utf8 && ($pid == 0 || $pid == 3 || ($pid == 2 && ($eid != 2 || @cp_1252)) |
|
317
|
|
|
|
|
|
|
|| ($pid == 1 && defined $apple_encodings[$eid]))); |
|
318
|
|
|
|
|
|
|
} |
|
319
|
|
|
|
|
|
|
|
|
320
|
|
|
|
|
|
|
|
|
321
|
|
|
|
|
|
|
=head2 find_name($nid) |
|
322
|
|
|
|
|
|
|
|
|
323
|
|
|
|
|
|
|
Hunts down a name in all the standard places and returns the string and for an |
|
324
|
|
|
|
|
|
|
array context the pid, eid & lid as well |
|
325
|
|
|
|
|
|
|
|
|
326
|
|
|
|
|
|
|
=cut |
|
327
|
|
|
|
|
|
|
|
|
328
|
|
|
|
|
|
|
sub find_name |
|
329
|
|
|
|
|
|
|
{ |
|
330
|
0
|
|
|
0
|
1
|
|
my ($self, $nid) = @_; |
|
331
|
0
|
|
|
|
|
|
my ($res, $pid, $eid, $lid, $look, $k); |
|
332
|
|
|
|
|
|
|
|
|
333
|
0
|
|
|
|
|
|
my (@lookup) = ([3, 1, 1033], [3, 1, -1], [3, 0, 1033], [3, 0, -1], [2, 1, -1], [2, 2, -1], [2, 0, -1], |
|
334
|
|
|
|
|
|
|
[0, 0, 0], [1, 0, 0]); |
|
335
|
0
|
|
|
|
|
|
foreach $look (@lookup) |
|
336
|
|
|
|
|
|
|
{ |
|
337
|
0
|
|
|
|
|
|
($pid, $eid, $lid) = @$look; |
|
338
|
0
|
0
|
|
|
|
|
if ($lid == -1) |
|
339
|
|
|
|
|
|
|
{ |
|
340
|
0
|
|
|
|
|
|
foreach $k (keys %{$self->{'strings'}[$nid][$pid][$eid]}) |
|
|
0
|
|
|
|
|
|
|
|
341
|
|
|
|
|
|
|
{ |
|
342
|
0
|
0
|
|
|
|
|
if (($res = $self->{strings}[$nid][$pid][$eid]{$k}) ne '') |
|
343
|
|
|
|
|
|
|
{ |
|
344
|
0
|
|
|
|
|
|
$lid = $k; |
|
345
|
0
|
|
|
|
|
|
last; |
|
346
|
|
|
|
|
|
|
} |
|
347
|
|
|
|
|
|
|
} |
|
348
|
|
|
|
|
|
|
} else |
|
349
|
0
|
|
|
|
|
|
{ $res = $self->{strings}[$nid][$pid][$eid]{$lid} } |
|
350
|
0
|
0
|
|
|
|
|
if ($res ne '') |
|
351
|
0
|
0
|
|
|
|
|
{ return wantarray ? ($res, $pid, $eid, $lid) : $res; } |
|
352
|
|
|
|
|
|
|
} |
|
353
|
0
|
|
|
|
|
|
return ''; |
|
354
|
|
|
|
|
|
|
} |
|
355
|
|
|
|
|
|
|
|
|
356
|
|
|
|
|
|
|
|
|
357
|
|
|
|
|
|
|
=head2 remove_name($nid) |
|
358
|
|
|
|
|
|
|
|
|
359
|
|
|
|
|
|
|
Removes all strings with the given name id from the table. |
|
360
|
|
|
|
|
|
|
|
|
361
|
|
|
|
|
|
|
=cut |
|
362
|
|
|
|
|
|
|
|
|
363
|
|
|
|
|
|
|
sub remove_name |
|
364
|
|
|
|
|
|
|
{ |
|
365
|
0
|
|
|
0
|
1
|
|
my ($self, $nid) = @_; |
|
366
|
|
|
|
|
|
|
|
|
367
|
0
|
|
|
|
|
|
delete $self->{'strings'}[$nid]; |
|
368
|
|
|
|
|
|
|
} |
|
369
|
|
|
|
|
|
|
|
|
370
|
|
|
|
|
|
|
=head2 set_name($nid, $str[, $lang[, @cover]]) |
|
371
|
|
|
|
|
|
|
|
|
372
|
|
|
|
|
|
|
Sets the given name id string to $str for all platforms and encodings that |
|
373
|
|
|
|
|
|
|
this module can handle. If $lang is set, it is interpretted as a language |
|
374
|
|
|
|
|
|
|
tag and if the particular language of a string is found to match, then |
|
375
|
|
|
|
|
|
|
that string is changed, otherwise no change occurs. |
|
376
|
|
|
|
|
|
|
|
|
377
|
|
|
|
|
|
|
If supplied, @cover should be a list of references to two-element arrays |
|
378
|
|
|
|
|
|
|
containing pid,eid pairs that should be added to the name table if not already present. |
|
379
|
|
|
|
|
|
|
|
|
380
|
|
|
|
|
|
|
This function does not add any names to the table unless @cover is supplied. |
|
381
|
|
|
|
|
|
|
|
|
382
|
|
|
|
|
|
|
=cut |
|
383
|
|
|
|
|
|
|
|
|
384
|
|
|
|
|
|
|
sub set_name |
|
385
|
|
|
|
|
|
|
{ |
|
386
|
0
|
|
|
0
|
1
|
|
my ($self, $nid, $str, $lang, @cover) = @_; |
|
387
|
0
|
|
|
|
|
|
my ($pid, $eid, $lid, $c); |
|
388
|
|
|
|
|
|
|
|
|
389
|
0
|
|
|
|
|
|
foreach $pid (0 .. $#{$self->{'strings'}[$nid]}) |
|
|
0
|
|
|
|
|
|
|
|
390
|
|
|
|
|
|
|
{ |
|
391
|
0
|
|
|
|
|
|
my $strNL = $str; |
|
392
|
0
|
0
|
|
|
|
|
$strNL =~ s/(?:\r?)\n/\r\n/og if $pid == 3; |
|
393
|
0
|
0
|
|
|
|
|
$strNL =~ s/(?:\r?)\n/\r/og if $pid == 1; |
|
394
|
0
|
|
|
|
|
|
foreach $eid (0 .. $#{$self->{'strings'}[$nid][$pid]}) |
|
|
0
|
|
|
|
|
|
|
|
395
|
|
|
|
|
|
|
{ |
|
396
|
0
|
0
|
|
|
|
|
if (defined $self->{'strings'}[$nid][$pid][$eid]) |
|
397
|
|
|
|
|
|
|
{ |
|
398
|
0
|
|
|
|
|
|
my ($isincover) = 0; |
|
399
|
0
|
|
|
|
|
|
foreach $c (@cover) |
|
400
|
|
|
|
|
|
|
{ |
|
401
|
0
|
0
|
0
|
|
|
|
if ($c->[0] == $pid && $c->[1] == $eid) |
|
402
|
|
|
|
|
|
|
{ |
|
403
|
0
|
|
|
|
|
|
$isincover = 1; |
|
404
|
0
|
|
|
|
|
|
last; |
|
405
|
|
|
|
|
|
|
} |
|
406
|
|
|
|
|
|
|
} |
|
407
|
0
|
0
|
|
|
|
|
push(@cover, [$pid, $eid]) if (!$isincover); |
|
408
|
|
|
|
|
|
|
} |
|
409
|
0
|
|
|
|
|
|
foreach $lid (keys %{$self->{'strings'}[$nid][$pid][$eid]}) |
|
|
0
|
|
|
|
|
|
|
|
410
|
|
|
|
|
|
|
{ |
|
411
|
0
|
0
|
0
|
|
|
|
next unless (!defined $lang || $self->match_lang($pid, $lid, $lang)); |
|
412
|
0
|
|
|
|
|
|
$self->{'strings'}[$nid][$pid][$eid]{$lid} = $strNL; |
|
413
|
0
|
|
|
|
|
|
foreach $c (0 .. $#cover) |
|
414
|
|
|
|
|
|
|
{ |
|
415
|
0
|
0
|
0
|
|
|
|
next unless (defined $cover[$c] && $cover[$c][0] == $pid && $cover[$c][1] == $eid); |
|
|
|
|
0
|
|
|
|
|
|
416
|
0
|
|
|
|
|
|
delete $cover[$c]; |
|
417
|
0
|
|
|
|
|
|
last; |
|
418
|
|
|
|
|
|
|
} |
|
419
|
|
|
|
|
|
|
} |
|
420
|
|
|
|
|
|
|
} |
|
421
|
|
|
|
|
|
|
} |
|
422
|
0
|
|
|
|
|
|
foreach $c (@cover) |
|
423
|
|
|
|
|
|
|
{ |
|
424
|
0
|
0
|
0
|
|
|
|
next unless (defined $c && scalar @$c); |
|
425
|
0
|
|
|
|
|
|
my ($pid, $eid) = @{$c}; |
|
|
0
|
|
|
|
|
|
|
|
426
|
0
|
|
|
|
|
|
my ($lid) = $self->find_lang($pid, $lang); |
|
427
|
0
|
|
|
|
|
|
my $strNL = $str; |
|
428
|
0
|
0
|
|
|
|
|
$strNL =~ s/\n/\r\n/og if $pid == 3; |
|
429
|
0
|
0
|
|
|
|
|
$strNL =~ s/\n/\r/og if $pid == 1; |
|
430
|
0
|
|
|
|
|
|
$self->{'strings'}[$nid][$pid][$eid]{$lid} = $strNL; |
|
431
|
|
|
|
|
|
|
} |
|
432
|
0
|
|
|
|
|
|
return $self; |
|
433
|
|
|
|
|
|
|
} |
|
434
|
|
|
|
|
|
|
|
|
435
|
|
|
|
|
|
|
=head2 Font::TTF::Name->match_lang($pid, $lid, $lang) |
|
436
|
|
|
|
|
|
|
|
|
437
|
|
|
|
|
|
|
Compares the language associated to the string of given platform and language |
|
438
|
|
|
|
|
|
|
with the given language tag. If the language matches the tag (i.e. is equal |
|
439
|
|
|
|
|
|
|
or more defined than the given language tag) returns true. This is calculated |
|
440
|
|
|
|
|
|
|
by finding whether the associated language tag starts with the given language |
|
441
|
|
|
|
|
|
|
tag. |
|
442
|
|
|
|
|
|
|
|
|
443
|
|
|
|
|
|
|
=cut |
|
444
|
|
|
|
|
|
|
|
|
445
|
|
|
|
|
|
|
sub match_lang |
|
446
|
|
|
|
|
|
|
{ |
|
447
|
0
|
|
|
0
|
1
|
|
my ($self, $pid, $lid, $lang) = @_; |
|
448
|
0
|
|
|
|
|
|
my ($langid) = $self->get_lang($pid, $lid); |
|
449
|
|
|
|
|
|
|
|
|
450
|
0
|
0
|
|
|
|
|
return 1 if ($pid == 0); # all languages are equal in unicode since nothing defined |
|
451
|
0
|
0
|
0
|
|
|
|
return ($lid == $lang) if ($lang != 0 || $lang eq '0'); |
|
452
|
0
|
|
0
|
|
|
|
return !index(lc($langid), lc($lang)) || !index(lc($lang), lc($langid)); |
|
453
|
|
|
|
|
|
|
} |
|
454
|
|
|
|
|
|
|
|
|
455
|
|
|
|
|
|
|
=head2 Font::TTF::Name->get_lang($pid, $lid) |
|
456
|
|
|
|
|
|
|
|
|
457
|
|
|
|
|
|
|
Returns the language tag associated with a particular platform and language id |
|
458
|
|
|
|
|
|
|
|
|
459
|
|
|
|
|
|
|
=cut |
|
460
|
|
|
|
|
|
|
|
|
461
|
|
|
|
|
|
|
sub get_lang |
|
462
|
|
|
|
|
|
|
{ |
|
463
|
0
|
|
|
0
|
1
|
|
my ($self, $pid, $lid) = @_; |
|
464
|
|
|
|
|
|
|
|
|
465
|
0
|
0
|
|
|
|
|
if ($pid == 3) |
|
|
|
0
|
|
|
|
|
|
|
466
|
0
|
|
|
|
|
|
{ return $win_langs{$lid}; } |
|
467
|
|
|
|
|
|
|
elsif ($pid == 1) |
|
468
|
0
|
|
|
|
|
|
{ return $mac_langs[$lid]; } |
|
469
|
0
|
|
|
|
|
|
return ''; |
|
470
|
|
|
|
|
|
|
} |
|
471
|
|
|
|
|
|
|
|
|
472
|
|
|
|
|
|
|
|
|
473
|
|
|
|
|
|
|
=head2 Font::TTF::Name->find_lang($pid, $lang) |
|
474
|
|
|
|
|
|
|
|
|
475
|
|
|
|
|
|
|
Looks up the language name and returns a lang id if one exists |
|
476
|
|
|
|
|
|
|
|
|
477
|
|
|
|
|
|
|
=cut |
|
478
|
|
|
|
|
|
|
|
|
479
|
|
|
|
|
|
|
sub find_lang |
|
480
|
|
|
|
|
|
|
{ |
|
481
|
0
|
|
|
0
|
1
|
|
my ($self, $pid, $lang) = @_; |
|
482
|
|
|
|
|
|
|
|
|
483
|
0
|
0
|
|
|
|
|
if ($pid == 3) |
|
|
|
0
|
|
|
|
|
|
|
484
|
0
|
|
|
|
|
|
{ return $langs_win{$lang}; } |
|
485
|
|
|
|
|
|
|
elsif ($pid == 1) |
|
486
|
0
|
|
|
|
|
|
{ return $langs_mac{$lang}; } |
|
487
|
0
|
|
|
|
|
|
return undef; |
|
488
|
|
|
|
|
|
|
} |
|
489
|
|
|
|
|
|
|
|
|
490
|
|
|
|
|
|
|
=head2 Font::TTF::Name->pe_list() |
|
491
|
|
|
|
|
|
|
|
|
492
|
|
|
|
|
|
|
Returns an array of references to two-element arrays |
|
493
|
|
|
|
|
|
|
containing pid,eid pairs that already exist in this name table. |
|
494
|
|
|
|
|
|
|
Useful for creating @cover parameter to set_name(). |
|
495
|
|
|
|
|
|
|
|
|
496
|
|
|
|
|
|
|
=cut |
|
497
|
|
|
|
|
|
|
|
|
498
|
|
|
|
|
|
|
sub pe_list |
|
499
|
|
|
|
|
|
|
{ |
|
500
|
0
|
|
|
0
|
1
|
|
my ($self) = @_; |
|
501
|
0
|
|
|
|
|
|
my (@cover, %ids); |
|
502
|
|
|
|
|
|
|
|
|
503
|
0
|
|
|
|
|
|
foreach my $nid (0 .. $#{$self->{'strings'}}) |
|
|
0
|
|
|
|
|
|
|
|
504
|
|
|
|
|
|
|
{ |
|
505
|
0
|
0
|
|
|
|
|
if (defined $self->{'strings'}[$nid]) |
|
506
|
|
|
|
|
|
|
{ |
|
507
|
0
|
|
|
|
|
|
foreach my $pid (0 .. $#{$self->{'strings'}[$nid]}) |
|
|
0
|
|
|
|
|
|
|
|
508
|
|
|
|
|
|
|
{ |
|
509
|
0
|
0
|
|
|
|
|
if (defined $self->{'strings'}[$nid][$pid]) |
|
510
|
|
|
|
|
|
|
{ |
|
511
|
0
|
|
|
|
|
|
foreach my $eid (0 .. $#{$self->{'strings'}[$nid][$pid]}) |
|
|
0
|
|
|
|
|
|
|
|
512
|
|
|
|
|
|
|
{ |
|
513
|
0
|
0
|
0
|
|
|
|
if (defined $self->{'strings'}[$nid][$pid][$eid] && !$ids{$pid}{$eid}) |
|
514
|
|
|
|
|
|
|
{ |
|
515
|
0
|
|
|
|
|
|
$ids{$pid}{$eid} = 1; |
|
516
|
0
|
|
|
|
|
|
push @cover, [$pid, $eid]; |
|
517
|
|
|
|
|
|
|
} |
|
518
|
|
|
|
|
|
|
} |
|
519
|
|
|
|
|
|
|
} |
|
520
|
|
|
|
|
|
|
} |
|
521
|
|
|
|
|
|
|
} |
|
522
|
|
|
|
|
|
|
} |
|
523
|
0
|
|
|
|
|
|
return @cover; |
|
524
|
|
|
|
|
|
|
} |
|
525
|
|
|
|
|
|
|
|
|
526
|
|
|
|
|
|
|
|
|
527
|
|
|
|
|
|
|
BEGIN { |
|
528
|
1
|
|
|
1
|
|
2112
|
@apple_encs = ( |
|
529
|
|
|
|
|
|
|
<<'EOT', |
|
530
|
|
|
|
|
|
|
M>)RES==NCW$`@.'G_S5Q*L(!#?+K1VO4:.W6IJA-:\^BM?>L>1&NP(A0Q$BL |
|
531
|
|
|
|
|
|
|
M<*!62ZV8Z1)[K]BE$MR#O,=/7OW]7T&*6"NMI4K31EOMM)>N@XXZZ2Q#IBZZ |
|
532
|
|
|
|
|
|
|
MZJ:['GKJ)4NVWOKHJ]\_/\!`@PR68XBAALDUW`@CC3+:&&.-,UZ>?!-,-,ED |
|
533
|
|
|
|
|
|
|
M4TPUS70SS#3+;`7FF&N>0D7F6V"A119;8JEEEEMAI5566V.M==;;H-A&FVRV |
|
534
|
|
|
|
|
|
|
MQ5;;_OTONJ3<%;?<5^NQ1YYXYJGG7GKME3?>>N^=#S[ZY(O/OOKNFU]^JO<[ |
|
535
|
|
|
|
|
|
|
M!$?LLMO>$#OAH4-*4F+'[(L+E*F,6SH:%\9%]C@>1W&CN&%2:9QNO]-))5ZH |
|
536
|
|
|
|
|
|
|
M<]9.!^/DQ/8X-V[@@#,AS0ZE+KB7R$ODA\:A26@>6H2FH9D?J17^)(I#3C@8 |
|
537
|
|
|
|
|
|
|
MLD)V?:(^"BE.AN30,F0XK\(Y5UUVW0TW77/'W;H_;JM6HRJ1&95%M0Y'E5%5 |
|
538
|
|
|
|
|
|
|
.5.U4]""JB`?E$` |
|
539
|
|
|
|
|
|
|
EOT |
|
540
|
|
|
|
|
|
|
|
|
541
|
|
|
|
|
|
|
undef, |
|
542
|
|
|
|
|
|
|
undef, |
|
543
|
|
|
|
|
|
|
undef, |
|
544
|
|
|
|
|
|
|
<<'EOT', |
|
545
|
|
|
|
|
|
|
M>)RES[=/%```1O$WO8G_@$'J';W70Z2WHS>5WJN%8D6%D;BZ,3*P,;#C2D(8 |
|
546
|
|
|
|
|
|
|
M,9&)08V)+4*(1((X2'(#[.:;7[[\*./_%D,L<<230"(!@B213`JII)%.!IED |
|
547
|
|
|
|
|
|
|
MD4T.N>213P&%%%%,B!)N4LJMR[Z<"BJIHIH::JFCG@;"--)$,RVTTD8['732 |
|
548
|
|
|
|
|
|
|
M13>WN<-=>NBECWX&&&2(848898QQ)IADBFEFF.4>]WG`0^:89X%%'O&8)SSE |
|
549
|
|
|
|
|
|
|
M&<]9X@4O><4R*Y?_.ZRSRQ[[''#(1S[PB<]NL\D7OO&5[_S@9TR`(XXYX1=O |
|
550
|
|
|
|
|
|
|
M.>4W9_SAG`O^7OF=O>XW*N)WV!%''7/<"2>=
|
|
551
|
|
|
|
|
|
|
MT"2333'5--/-,-,LL\TQUSSS+;#0(HL-7?DMM\)*JZRVQEKKK+?!L(TVV6R+ |
|
552
|
|
|
|
|
|
|
9K;;9;HS?<\K5O(G[7?/+>Y>'``` |
|
553
|
|
|
|
|
|
|
EOT |
|
554
|
|
|
|
|
|
|
|
|
555
|
|
|
|
|
|
|
<<'EOT', |
|
556
|
|
|
|
|
|
|
M>)RED$LSEW$`A9_-^00L,H-^(=>4Y%^2J'1Q*Y+[I2(BHA`B?!%J6EM1*28S |
|
557
|
|
|
|
|
|
|
M;9II[/PI*7*_%TUN\_*VZ%W:FN9LSYEGGD,\_Q?#$?SP)X"C!!)$,"&$$L8Q |
|
558
|
|
|
|
|
|
|
MPCG."2(X222GB,+%:XR"42N,P5KG*-1))()H54KG.# |
|
559
|
|
|
|
|
|
|
M--*Y20:WR"2+;'+()8]\"BBDB-O$PM |
|
560
|
|
|
|
|
|
|
M==3SA`8::>(IS;3PC%;::'?X'^W#?&(0-Z-,,,,TL\PSQP)+K+#,*C]9XQ?K |
|
561
|
|
|
|
|
|
|
M_.8/FVRPQ0[;[+&+S=_]_J;KX/Y6I?&U.JQ.Z[GU0@-VBNTR@;Q4G]ZI5V_U |
|
562
|
|
|
|
|
|
|
MQG@83^-M?,PAXV6'VF'ZH&Z]4H_>J]]IO=:0W!K6B#[KBT;U56/ZIN\:UX1^ |
|
563
|
|
|
|
|
|
|
?:%)3FM:,9C6G>2UH44M:UHI6'?
|
|
564
|
|
|
|
|
|
|
EOT |
|
565
|
|
|
|
|
|
|
|
|
566
|
|
|
|
|
|
|
<<'EOT', |
|
567
|
|
|
|
|
|
|
M>)RES5=OSG$`0.$CYR.(A(3DUS]J4WOO59O6;&F+UMY[7R&(V'N^4ETZ=*"J |
|
568
|
|
|
|
|
|
|
M:M:H=>E*0D1B)7HC1KC0[R#G^LEA,/]7((Z(EK2B-?&TH2WM:$\'.M*)SG0A |
|
569
|
|
|
|
|
|
|
M@:YTHSL]Z$DO>M.'OO2C/P,8R*`&/X2A#&,X(QC)*$:3R!C&,H[Q3&`BDYC, |
|
570
|
|
|
|
|
|
|
M%))(9BK3F,X,9C*+%%*9S1S22">#N
|
|
571
|
|
|
|
|
|
|
M6,LZUK.!C6QB,UO8RC:VLZ/A7TL5Y=11P6O>N(MWO.>#.\GG(Y_YQ!>^DAT7 |
|
572
|
|
|
|
|
|
|
M\8WZ$%$3$OC.#W(IYC=_^!N"1SWF*<]ZP1AO*:'`;*^0%V502J6'*8LRHRQR |
|
573
|
|
|
|
|
|
|
M/.)Q3WC2TY[QG+D6FF^!19ZGR(M>BA*]3"'5(9Z8.>:YVSV-DD/CT"0T#RU" |
|
574
|
|
|
|
|
|
|
MT]",G^YUG_L]8+$E7O6%!WUIF>4^]9K7?6R%E59YQUM6>]L:[WK/5][WH;7> |
|
575
|
|
|
|
|
|
|
4M,X'/O&1-WSF _\` |
|
576
|
|
|
|
|
|
|
EOT |
|
577
|
|
|
|
|
|
|
|
|
578
|
|
|
|
|
|
|
<<'EOT', |
|
579
|
|
|
|
|
|
|
M>)RERT=.%5``0-&+7K'&!B(@X/L/^/3>ZZ?SZ=*K@`KVWOL:U!68.#!&8G2@ |
|
580
|
|
|
|
|
|
|
M$Q?F5/=@SOB0XO\$$D2**:&4)&644T$E55130RUUU--`(TTTTT(K;;3302== |
|
581
|
|
|
|
|
|
|
M=--#[[_?1S\###+$,".,DF:,<2:89(II9KC`+'/,L\`B2RRSPBIKK+/!13;9 |
|
582
|
|
|
|
|
|
|
M8IM+7.8*.^QRE6M]SG`0]YQ&.>\)1G/.<%+WG%:][PEI0G |
|
583
|
|
|
|
|
|
|
M/>5IL\SVC#F>-=<\\SUG@846>=Y@PFBQ)9::M,QR*ZRTRFIKK+4N!+[[CD]\ |
|
584
|
|
|
|
|
|
|
M#I%?9O*-+XGH/N?BMON=CT7\B#MQUR5^^MY#ZH('7?:PJQYQS14/L!?S,S[$ |
|
585
|
|
|
|
|
|
|
M=,SD*[]#DH\>==UC;K@8LD)V*`B%(3?D\2<4>=Q-3[B5R#'#66>LM\%&FVRV |
|
586
|
|
|
|
|
|
|
GQ5;;;+?#3KOLML=>4_;9[X"##CGLB*.F'7/<"2>=
|
|
587
|
|
|
|
|
|
|
EOT |
|
588
|
|
|
|
|
|
|
|
|
589
|
|
|
|
|
|
|
undef, |
|
590
|
|
|
|
|
|
|
<<'EOT', |
|
591
|
|
|
|
|
|
|
M>)RED-DVUG$`1;=:U*Y%0C)5O^^/SSS/F>>9#"$JE7D>"D6\3S=>Q^MPU^JF |
|
592
|
|
|
|
|
|
|
M&^M"2JJHIH9:ZJBG@4:::*:%M[32 |
|
593
|
|
|
|
|
|
|
M1CL==_TNNNFAES[Z&6"0(889890QQIE@DG=,,
|
|
594
|
|
|
|
|
|
|
MY@M?^<8*JZRQS@:;;+'-#KOLL<\!AQQQS'=^<,(I9_SD%^=<\)M+KN[X-U%: |
|
595
|
|
|
|
|
|
|
M2`\9(2MDAWB(^,-U+/KKYYJ'_W_`!!_XT$23?.1C]8E/3?&9J2:;9KH9/O>% |
|
596
|
|
|
|
|
|
|
MF;XTRVQSS#7/5[[VC<&8D?D66&C<(HLML=0RRZVPTBJ7K;;&6NNLM\%&FVRV |
|
597
|
|
|
|
|
|
|
L):388:===MMCKP,..F2_(XXZYK#CMKGZS[YU-]QTRVUWW'7/?0]N`4(?0WT` |
|
598
|
|
|
|
|
|
|
EOT |
|
599
|
|
|
|
|
|
|
|
|
600
|
|
|
|
|
|
|
<<'EOT', |
|
601
|
|
|
|
|
|
|
M>)RED,5.0U$415=(D.X!$"ANMX^VN+M#D>+N[H4"Q5W^APF_PZ\PY.9-"`-& |
|
602
|
|
|
|
|
|
|
MY.3LG>-"#_\3@P^'8OP$"%)"*6644T$E55130RUUU--`(TTTTT(K;;3302== |
|
603
|
|
|
|
|
|
|
M=-OZ7OH(T<\`@PP19I@11AECG`DFF6*:&6:98YX%%EEBF15666.=#3;98IL= |
|
604
|
|
|
|
|
|
|
M=MECGP,.B7#$,5%...6,&.=<<,D5U]QPRQWW//#($\^\\,J;G?_II)ETXS79 |
|
605
|
|
|
|
|
|
|
M)L<$C<,['S[GYSY=?FWK6E>Z^?L'BK,:KP0E*DD>R?6E*-7E='DM9BA36
|
|
606
|
|
|
|
|
|
|
MCG*5IWP5J%!%,O+)4;'\"BBH$I7:S')5J%)5JE:-M6JMUKM]FM1LL55M)EG= |
|
607
|
|
|
|
|
|
|
GZE&O^A1R(V$-NSRF<8L3ZO3L_]KN4!$=Z5A1G>A49XKI_!M<9D8J |
|
608
|
|
|
|
|
|
|
EOT |
|
609
|
|
|
|
|
|
|
|
|
610
|
|
|
|
|
|
|
<<'EOT', |
|
611
|
|
|
|
|
|
|
M>)RED,E3SW$8QU_77@<''+A]^Y5(2-F7+"%92\B^ES5ES]H,)L(8&21E*UNH |
|
612
|
|
|
|
|
|
|
M&"8T8ZS3I(FS_T"$_`L^-^/D8)YY/^]Y/\L\"Y/Y/XN()T8"B0P@B8$,(IG! |
|
613
|
|
|
|
|
|
|
MI#"$H0PCE>&DDG,((N99#.+V
|
|
614
|
|
|
|
|
|
|
M+O.83PZY+""/A2QB,?DL82G+6,X*5K**U:QA+>M8SP8**&0CF]C,%K:RC2*V |
|
615
|
|
|
|
|
|
|
M4TP).]C)+G:SA[WLHY3]'.`@ASC,$
|
|
616
|
|
|
|
|
|
|
M7USAOS[@48]YW')/>-(*3WG:,R%ZSDK/!K[@1<][R2HO6^T5:ZSUJM>\[@UO |
|
617
|
|
|
|
|
|
|
M6F>]M[SM'>]ZSX90_\"'-MIDLX^">ASPQ*?!M_C,Y[ZP->KE*U_[QK>^\WW( |
|
618
|
|
|
|
|
|
|
CM/O!ML"=?K3#3[Z,*_AKOR]V^=5O=OO='_ZTQU^_`2-%:*`` |
|
619
|
|
|
|
|
|
|
EOT |
|
620
|
|
|
|
|
|
|
|
|
621
|
|
|
|
|
|
|
undef, |
|
622
|
|
|
|
|
|
|
undef, |
|
623
|
|
|
|
|
|
|
undef, |
|
624
|
|
|
|
|
|
|
undef, |
|
625
|
|
|
|
|
|
|
undef, |
|
626
|
|
|
|
|
|
|
undef, |
|
627
|
|
|
|
|
|
|
undef, |
|
628
|
|
|
|
|
|
|
undef, |
|
629
|
|
|
|
|
|
|
undef, |
|
630
|
|
|
|
|
|
|
<<'EOT', |
|
631
|
|
|
|
|
|
|
M>)REC]=.E&$`1(\%&W@4004%_7:!I?>.Z-+[TJL*=K"`BH`*J,_"+2'A!7PW |
|
632
|
|
|
|
|
|
|
MX;\2[LG<3#*9G!F2G$V!&'$***2(!,644$H9Y5102175U%!+'?4TT$@3S;30 |
|
633
|
|
|
|
|
|
|
M2AN/:.\HSG |
|
634
|
|
|
|
|
|
|
M+++$"U[RBM>\X2WO6&:%]WS@(Y]898W/?.$KZWQC@TVV^,X/?K+-#KO\XC=_ |
|
635
|
|
|
|
|
|
|
M(OX!?T/"`0<=-$T+WG9 |
|
636
|
|
|
|
|
|
|
M*U[UFNEF>%V]X4TSO666V=[VCG?-,==[WC?/?!_XT,N`466F3"8DLLM
|
|
637
|
|
|
|
|
|
|
M*ZRTRFIK(GJ=]?_Y+;;:]N\HI(>LD&W2#COMLML>>^V+=IX\2<7BCCGNA)-. |
|
638
|
|
|
|
|
|
|
0.>V,L\XY[P*'[!\#D^='L@`` |
|
639
|
|
|
|
|
|
|
EOT |
|
640
|
|
|
|
|
|
|
|
|
641
|
|
|
|
|
|
|
undef, |
|
642
|
|
|
|
|
|
|
undef, |
|
643
|
|
|
|
|
|
|
undef, |
|
644
|
|
|
|
|
|
|
undef, |
|
645
|
|
|
|
|
|
|
undef, |
|
646
|
|
|
|
|
|
|
undef, |
|
647
|
|
|
|
|
|
|
undef, |
|
648
|
|
|
|
|
|
|
undef, |
|
649
|
|
|
|
|
|
|
undef, |
|
650
|
|
|
|
|
|
|
); |
|
651
|
|
|
|
|
|
|
|
|
652
|
1
|
|
|
|
|
2
|
$cp_1252 = ( |
|
653
|
|
|
|
|
|
|
<<'EOT', |
|
654
|
|
|
|
|
|
|
M>)P-SD-B'5```,#YJ6VE>DEM&[\VD]JVF?H./4'-U+93V[9M:SV;$141(Y74 |
|
655
|
|
|
|
|
|
|
MTD@KG?0RR"B3S++(*IOL
|
|
656
|
|
|
|
|
|
|
M458YY550426555%5-=754%,MM=515SWU-=!05".--=%4,\VUT%(KK;715COM |
|
657
|
|
|
|
|
|
|
M==!1)YTE2-1%5]UTUT-/O?361U_]]#?`0(,,-L10PPPWPDBCC#;&6..,-\%$ |
|
658
|
|
|
|
|
|
|
MDTPVQ5333)=DAIEFF6V.N>:%9-$0&YD?BH22(82XF)10.3(@U(DDB$;F_/]% |
|
659
|
|
|
|
|
|
|
M0_Y0(!0*A4-\R!5RQ]R*BX\,#'4CB?]];B3)`@LMLM@22RVSW`HKK;):LC76 |
|
660
|
|
|
|
|
|
|
M6F>]#3;:9+,MMMIFNQUVVF6W/?;:9[\##CKDL"-2''7,<2><=,II9YQUSGD7 |
|
661
|
|
|
|
|
|
|
M7'3)95=<=
|
|
662
|
|
|
|
|
|
|
1?/7-=S_\],MO?_S]!Y==>0@` |
|
663
|
|
|
|
|
|
|
EOT |
|
664
|
|
|
|
|
|
|
); |
|
665
|
|
|
|
|
|
|
|
|
666
|
|
|
|
|
|
|
|
|
667
|
1
|
|
|
|
|
120
|
@ms_langids = ( [""], |
|
668
|
|
|
|
|
|
|
['ar', ["-SA", "-IQ", "-EG", "-LY", "-DZ", "-MA", "-TN", |
|
669
|
|
|
|
|
|
|
"-OM", "-YE", "-SY", "-JO", "-LB", "-KW", "-AE", |
|
670
|
|
|
|
|
|
|
"-BH", "-QA", "-Ploc-SA", "-145"]], |
|
671
|
|
|
|
|
|
|
['bg-BG'], |
|
672
|
|
|
|
|
|
|
['ca-ES'], |
|
673
|
|
|
|
|
|
|
['zh', ['-TW', '-CN', '-HK', '-SG', '-MO', "", "", "", "", "", "", |
|
674
|
|
|
|
|
|
|
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", |
|
675
|
|
|
|
|
|
|
"", "", "", "zh", "-Hant"]], |
|
676
|
|
|
|
|
|
|
["cs-CZ"], |
|
677
|
|
|
|
|
|
|
["da-DK"], |
|
678
|
|
|
|
|
|
|
["de", ["-DE", "-CH", "-AT", "-LU", "-LI"]], |
|
679
|
|
|
|
|
|
|
["el-GR"], |
|
680
|
|
|
|
|
|
|
["en", ["-US", "-UK", "-AU", "-CA", "-NZ", "-IE", "-ZA", |
|
681
|
|
|
|
|
|
|
"-JM", "029", "-BZ", "-TT", "-ZW", "-PH", "-ID", |
|
682
|
|
|
|
|
|
|
"-HK", "-IN", "-MY", "-SG", "-AE", "-BH", "-EG", |
|
683
|
|
|
|
|
|
|
"-JO", "-KW", "-TR", "-YE"]], |
|
684
|
|
|
|
|
|
|
["es", ["-ES", "-MX", "-ES", "-GT", "-CR", "-PA", "-DO", |
|
685
|
|
|
|
|
|
|
"-VE", "-CO", "-PE", "-AR", "-EC", "-CL", "-UY", |
|
686
|
|
|
|
|
|
|
"-PY", "-BO", "-SV", "-HN", "-NI", "-PR", "-US"]], |
|
687
|
|
|
|
|
|
|
["fi-FI"], |
|
688
|
|
|
|
|
|
|
["fr", ["-FR", "-BE", "-CA", "-CH", "-LU", "-MC", "", |
|
689
|
|
|
|
|
|
|
"-RE", "-CG", "-SN", "-CM", "-CI", "-ML", "-MA", |
|
690
|
|
|
|
|
|
|
"-HT"]], |
|
691
|
|
|
|
|
|
|
["he-IL"], |
|
692
|
|
|
|
|
|
|
["hu-HU"], |
|
693
|
|
|
|
|
|
|
["is-IS"], |
|
694
|
|
|
|
|
|
|
# 0010 |
|
695
|
|
|
|
|
|
|
["it", ["-IT", "-CH"]], |
|
696
|
|
|
|
|
|
|
["ja-JP"], |
|
697
|
|
|
|
|
|
|
["ko-KR"], |
|
698
|
|
|
|
|
|
|
["nl", ["-NL", "-BE"]], |
|
699
|
|
|
|
|
|
|
["no", ["-bok-NO", "-nyn-NO", "", "", "", "", "", "", "", "", "", |
|
700
|
|
|
|
|
|
|
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", |
|
701
|
|
|
|
|
|
|
"", "", "", "nn", "nb"]], |
|
702
|
|
|
|
|
|
|
["pl-PL"], |
|
703
|
|
|
|
|
|
|
["pt", ["-BR", "-PT"]], |
|
704
|
|
|
|
|
|
|
["rm-CH"], |
|
705
|
|
|
|
|
|
|
["ro", ["-RO", "_MD"]], |
|
706
|
|
|
|
|
|
|
["ru-RU"], |
|
707
|
|
|
|
|
|
|
["hr", ["-HR", "-Latn-CS", "Cyrl-CS", "-BA", "", "-Latn-BA", "-Cyrl-BA", |
|
708
|
|
|
|
|
|
|
"", "". "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", |
|
709
|
|
|
|
|
|
|
"bs-Cyrl", "bs-Latn", "sr-Cyrl", "sr-Latn", "", "bs", "sr"]], |
|
710
|
|
|
|
|
|
|
["sk-SK"], |
|
711
|
|
|
|
|
|
|
["sq-AL"], |
|
712
|
|
|
|
|
|
|
["sv", ["-SE", "-FI"]], |
|
713
|
|
|
|
|
|
|
["th-TH"], |
|
714
|
|
|
|
|
|
|
["tr-TR"], |
|
715
|
|
|
|
|
|
|
# 0020 |
|
716
|
|
|
|
|
|
|
["ur", ["-PK", "tr-IN"]], |
|
717
|
|
|
|
|
|
|
["id-ID"], |
|
718
|
|
|
|
|
|
|
["uk-UA"], |
|
719
|
|
|
|
|
|
|
["be-BY"], |
|
720
|
|
|
|
|
|
|
["sl-SL"], |
|
721
|
|
|
|
|
|
|
["et-EE"], |
|
722
|
|
|
|
|
|
|
["lv-LV"], |
|
723
|
|
|
|
|
|
|
["lt-LT"], |
|
724
|
|
|
|
|
|
|
["tg", ["-Cyrl-TJ", "", "", "", "", "", "", "", "", "", "", "", "", |
|
725
|
|
|
|
|
|
|
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", |
|
726
|
|
|
|
|
|
|
"", "", "-Cyrl"]], |
|
727
|
|
|
|
|
|
|
["fa-IR"], |
|
728
|
|
|
|
|
|
|
["vi-VN"], |
|
729
|
|
|
|
|
|
|
["hy-AM"], |
|
730
|
|
|
|
|
|
|
["az", ["-Latn-AZ", "-Cyrl-AZ", "", "", "", "", "", "", "", "", "", |
|
731
|
|
|
|
|
|
|
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", |
|
732
|
|
|
|
|
|
|
"", "", "-Cyrl", "-Latn"]], |
|
733
|
|
|
|
|
|
|
["eu-ES"], |
|
734
|
|
|
|
|
|
|
["wen". ["wen-DE", "dsb-DE", "", "", "", "", "", "", "", "", "", "", |
|
735
|
|
|
|
|
|
|
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", |
|
736
|
|
|
|
|
|
|
"", "", "", "dsb"]], |
|
737
|
|
|
|
|
|
|
["mk-MK"], |
|
738
|
|
|
|
|
|
|
# 0030 |
|
739
|
|
|
|
|
|
|
["st"], |
|
740
|
|
|
|
|
|
|
["ts"], |
|
741
|
|
|
|
|
|
|
["tn-ZA"], |
|
742
|
|
|
|
|
|
|
["ven"], |
|
743
|
|
|
|
|
|
|
["xh-ZA"], |
|
744
|
|
|
|
|
|
|
["zu-ZA"], |
|
745
|
|
|
|
|
|
|
["af-ZA"], |
|
746
|
|
|
|
|
|
|
["ka-GE"], |
|
747
|
|
|
|
|
|
|
["fo-FO"], |
|
748
|
|
|
|
|
|
|
["hi-IN"], |
|
749
|
|
|
|
|
|
|
["mt"], |
|
750
|
|
|
|
|
|
|
["se", ["-NO", "-SE", "-FI", "smj-NO", "smj-SE", "sma-NO", "sma-SE", |
|
751
|
|
|
|
|
|
|
"", "smn-FI", "", "", "", "", "", "", "", "", "", "", "", "", "", |
|
752
|
|
|
|
|
|
|
"", "", "", "", "smn", "sms", "smj"]], |
|
753
|
|
|
|
|
|
|
["ga-IE"], |
|
754
|
|
|
|
|
|
|
["yi"], |
|
755
|
|
|
|
|
|
|
["ms", ["-MY", "-BN"]], |
|
756
|
|
|
|
|
|
|
["kk-KZ"], |
|
757
|
|
|
|
|
|
|
# 0040 |
|
758
|
|
|
|
|
|
|
["ky-KG"], |
|
759
|
|
|
|
|
|
|
["sw-KE"], |
|
760
|
|
|
|
|
|
|
["tk-TM"], |
|
761
|
|
|
|
|
|
|
["uz", ["-Latn-UZ", "-Cyrl-UZ", "", "", "", "", "", "", "", "", "", "", |
|
762
|
|
|
|
|
|
|
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", |
|
763
|
|
|
|
|
|
|
"", "-Cyrl", "-Latn"]], |
|
764
|
|
|
|
|
|
|
["tt-RU"], |
|
765
|
|
|
|
|
|
|
["bn", ["-IN", "-BD"]], |
|
766
|
|
|
|
|
|
|
["pa", ["-IN", "-Arab-PK", "", "", "", "", "", "", "", "", "", "", |
|
767
|
|
|
|
|
|
|
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", |
|
768
|
|
|
|
|
|
|
"", "", "", "-Arab"]], |
|
769
|
|
|
|
|
|
|
["gu-IN"], |
|
770
|
|
|
|
|
|
|
["or-IN"], |
|
771
|
|
|
|
|
|
|
["ta-IN"], |
|
772
|
|
|
|
|
|
|
["te-IN"], |
|
773
|
|
|
|
|
|
|
["kn-IN"], |
|
774
|
|
|
|
|
|
|
["ml-IN"], |
|
775
|
|
|
|
|
|
|
["as-IN"], |
|
776
|
|
|
|
|
|
|
["mr-IN"], |
|
777
|
|
|
|
|
|
|
["sa-IN"], |
|
778
|
|
|
|
|
|
|
# 0050 |
|
779
|
|
|
|
|
|
|
["mn", ["-Cyrl-MN", "-Mong-CN", "", "", "", "", "", "", "", "", "", "", "", |
|
780
|
|
|
|
|
|
|
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", |
|
781
|
|
|
|
|
|
|
"-Cyrl", "-Mong"]], |
|
782
|
|
|
|
|
|
|
["bo", ["-CN", "-BT"]], |
|
783
|
|
|
|
|
|
|
["cy-GB"], |
|
784
|
|
|
|
|
|
|
["km-KH"], |
|
785
|
|
|
|
|
|
|
["lo-LA"], |
|
786
|
|
|
|
|
|
|
["my"], |
|
787
|
|
|
|
|
|
|
["gl-ES"], |
|
788
|
|
|
|
|
|
|
["kok-IN"], |
|
789
|
|
|
|
|
|
|
["mni"], |
|
790
|
|
|
|
|
|
|
["sd", ["-IN", "-PK", "", "", "", "", "", "", "", "", "", "", "", "", "", |
|
791
|
|
|
|
|
|
|
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "-Arab"]], |
|
792
|
|
|
|
|
|
|
["syr-SY"], |
|
793
|
|
|
|
|
|
|
["si-LK"], |
|
794
|
|
|
|
|
|
|
["chr", ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", |
|
795
|
|
|
|
|
|
|
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "-Cher"]], |
|
796
|
|
|
|
|
|
|
["iu", ["-Cans-CA", "-Latn-CA", "", "", "", "", "", "", "", "", "", "", "", |
|
797
|
|
|
|
|
|
|
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", |
|
798
|
|
|
|
|
|
|
"-Cans", "-Latn"]], |
|
799
|
|
|
|
|
|
|
["am-ET"], |
|
800
|
|
|
|
|
|
|
["tmz", ["-Arab", "-Latn-DZ", "", "", "", "", "", "", "", "", "", "", "", |
|
801
|
|
|
|
|
|
|
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", |
|
802
|
|
|
|
|
|
|
"", "-Latn"]], |
|
803
|
|
|
|
|
|
|
# 0060 |
|
804
|
|
|
|
|
|
|
["ks"], |
|
805
|
|
|
|
|
|
|
["ne", ["-NP", "-IN"]], |
|
806
|
|
|
|
|
|
|
["fy-NL"], |
|
807
|
|
|
|
|
|
|
["ps-AF"], |
|
808
|
|
|
|
|
|
|
["fil-PH"], |
|
809
|
|
|
|
|
|
|
["dv-MV"], |
|
810
|
|
|
|
|
|
|
["bin-NG"], |
|
811
|
|
|
|
|
|
|
["fuv", ["-NG", "", "", "", "", "", "", "", "", "", "", "", "", "", "", |
|
812
|
|
|
|
|
|
|
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "ff-Latn"]], |
|
813
|
|
|
|
|
|
|
["ha", ["-Latn-NG", "", "", "", "", "", "", "", "", "", "", "", "", "", "", |
|
814
|
|
|
|
|
|
|
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "-Latn"]], |
|
815
|
|
|
|
|
|
|
["ibb-NG"], |
|
816
|
|
|
|
|
|
|
["yo-NG"], |
|
817
|
|
|
|
|
|
|
["quz", ["-BO", "-EC", "-PE"]], |
|
818
|
|
|
|
|
|
|
["ns-ZA"], |
|
819
|
|
|
|
|
|
|
["ba-RU"], |
|
820
|
|
|
|
|
|
|
["lb-LU"], |
|
821
|
|
|
|
|
|
|
["kl-GL"], |
|
822
|
|
|
|
|
|
|
# 0070 |
|
823
|
|
|
|
|
|
|
["ig-NG"], |
|
824
|
|
|
|
|
|
|
["kau"], |
|
825
|
|
|
|
|
|
|
["om"], |
|
826
|
|
|
|
|
|
|
["ti", ["-ET". "-ER"]], |
|
827
|
|
|
|
|
|
|
["gn"], |
|
828
|
|
|
|
|
|
|
["haw"], |
|
829
|
|
|
|
|
|
|
["la"], |
|
830
|
|
|
|
|
|
|
["so"], |
|
831
|
|
|
|
|
|
|
["ii-CN"], |
|
832
|
|
|
|
|
|
|
["pap"], |
|
833
|
|
|
|
|
|
|
["arn-CL"], |
|
834
|
|
|
|
|
|
|
[""], # (unassigned) |
|
835
|
|
|
|
|
|
|
["moh-CA"], |
|
836
|
|
|
|
|
|
|
[""], # (unassigned) |
|
837
|
|
|
|
|
|
|
["br-FR"], |
|
838
|
|
|
|
|
|
|
[""], # (unassigned) |
|
839
|
|
|
|
|
|
|
# 0080 |
|
840
|
|
|
|
|
|
|
["ug-CN"], |
|
841
|
|
|
|
|
|
|
["mi-NZ"], |
|
842
|
|
|
|
|
|
|
["oc-FR"], |
|
843
|
|
|
|
|
|
|
["co-FR"], |
|
844
|
|
|
|
|
|
|
["gsw-FR"], |
|
845
|
|
|
|
|
|
|
["sah-RU"], |
|
846
|
|
|
|
|
|
|
["qut-GT"], |
|
847
|
|
|
|
|
|
|
["rw-RW"], |
|
848
|
|
|
|
|
|
|
["wo-SN"], |
|
849
|
|
|
|
|
|
|
[""], # (unassigned) |
|
850
|
|
|
|
|
|
|
[""], # (unassigned) |
|
851
|
|
|
|
|
|
|
[""], # (unassigned) |
|
852
|
|
|
|
|
|
|
["gbz-AF"], |
|
853
|
|
|
|
|
|
|
[""], # (unassigned) |
|
854
|
|
|
|
|
|
|
[""], # (unassigned) |
|
855
|
|
|
|
|
|
|
[""], # (unassigned) |
|
856
|
|
|
|
|
|
|
# 0090 |
|
857
|
|
|
|
|
|
|
[""], # (unassigned) |
|
858
|
|
|
|
|
|
|
["gd-GB"], |
|
859
|
|
|
|
|
|
|
["ku", ["-Arab-IQ", "", "", "", "", "", "", "", "", "", "", "", "", "", "", |
|
860
|
|
|
|
|
|
|
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "-Arab"]], |
|
861
|
|
|
|
|
|
|
["quc-CO"], |
|
862
|
|
|
|
|
|
|
); |
|
863
|
|
|
|
|
|
|
# 0501 = qps-ploc |
|
864
|
|
|
|
|
|
|
# 05fe = qps-ploca |
|
865
|
|
|
|
|
|
|
# 09ff = qps-plocm |
|
866
|
|
|
|
|
|
|
|
|
867
|
1
|
|
|
|
|
75
|
@mac_langs = ( |
|
868
|
|
|
|
|
|
|
'en', 'fr', 'de', 'it', 'nl', 'sv', 'es', 'da', 'pt', 'no', |
|
869
|
|
|
|
|
|
|
'he', 'ja', 'ar', 'fi', 'el', 'is', 'mt', 'tr', 'hr', 'zh-Hant', |
|
870
|
|
|
|
|
|
|
'ur', 'hi', 'th', 'ko', 'lt', 'pl', 'hu', 'et', 'lv', 'se', |
|
871
|
|
|
|
|
|
|
'fo', 'ru' ,'zh-Hans', 'nl', 'ga', 'sq', 'ro', 'cs', 'sk', |
|
872
|
|
|
|
|
|
|
'sl', 'yi', 'sr', 'mk', 'bg', 'uk', 'be', 'uz', 'kk', 'az-Cyrl', |
|
873
|
|
|
|
|
|
|
'az-Latn', 'hy', 'ka', 'mo', 'ky', 'abh', 'tuk', 'mn-Mong', 'mn-Cyrl', 'pst', |
|
874
|
|
|
|
|
|
|
'ku', 'ks', 'sd', 'bo', 'ne', 'sa', 'mr', 'bn', 'as', 'gu', |
|
875
|
|
|
|
|
|
|
'pa', 'or', 'ml', 'kn', 'ta', 'te', 'si', 'my', 'km', 'lo', |
|
876
|
|
|
|
|
|
|
'vi', 'id', 'tl', 'ms-Latn', 'ms-Arab', 'am', 'ti', 'tga', 'so', 'sw', |
|
877
|
|
|
|
|
|
|
'rw', 'rn', 'ny', 'mg', 'eo', '', '', '', '', '', |
|
878
|
|
|
|
|
|
|
'', '', '', '', '', '', '', '', '', '', |
|
879
|
|
|
|
|
|
|
'', '', '', '', '', '', '', '', '', '', |
|
880
|
|
|
|
|
|
|
'', '', '', '', '', '', '', '', 'cy', 'eu', |
|
881
|
|
|
|
|
|
|
'la', 'qu', 'gn', 'ay', 'tt', 'ug', 'dz', 'jv-Latn', 'su-Latn', |
|
882
|
|
|
|
|
|
|
'gl', 'af', 'br', 'iu', 'gd', 'gv', 'gd-IR-x-dotabove', 'to', 'el-polyton', 'kl', |
|
883
|
|
|
|
|
|
|
'az-Latn' |
|
884
|
|
|
|
|
|
|
); |
|
885
|
|
|
|
|
|
|
|
|
886
|
|
|
|
|
|
|
} |
|
887
|
|
|
|
|
|
|
|
|
888
|
|
|
|
|
|
|
1; |
|
889
|
|
|
|
|
|
|
|
|
890
|
|
|
|
|
|
|
=head1 BUGS |
|
891
|
|
|
|
|
|
|
|
|
892
|
|
|
|
|
|
|
=over 4 |
|
893
|
|
|
|
|
|
|
|
|
894
|
|
|
|
|
|
|
=item * |
|
895
|
|
|
|
|
|
|
|
|
896
|
|
|
|
|
|
|
Unicode type strings will be stored in utf8 for all known platforms, |
|
897
|
|
|
|
|
|
|
once Perl 5.6 has been released and I can find all the mapping tables, etc. |
|
898
|
|
|
|
|
|
|
|
|
899
|
|
|
|
|
|
|
=back |
|
900
|
|
|
|
|
|
|
|
|
901
|
|
|
|
|
|
|
=head1 AUTHOR |
|
902
|
|
|
|
|
|
|
|
|
903
|
|
|
|
|
|
|
Martin Hosken L. |
|
904
|
|
|
|
|
|
|
|
|
905
|
|
|
|
|
|
|
|
|
906
|
|
|
|
|
|
|
=head1 LICENSING |
|
907
|
|
|
|
|
|
|
|
|
908
|
|
|
|
|
|
|
Copyright (c) 1998-2014, SIL International (http://www.sil.org) |
|
909
|
|
|
|
|
|
|
|
|
910
|
|
|
|
|
|
|
This module is released under the terms of the Artistic License 2.0. |
|
911
|
|
|
|
|
|
|
For details, see the full text of the license in the file LICENSE. |
|
912
|
|
|
|
|
|
|
|
|
913
|
|
|
|
|
|
|
|
|
914
|
|
|
|
|
|
|
|
|
915
|
|
|
|
|
|
|
=cut |
|
916
|
|
|
|
|
|
|
|