@@ -61,6 +61,33 @@ class RegionDataGenerator extends AbstractDataGenerator
61
61
'ZZ ' => true , // Unknown Region
62
62
];
63
63
64
+ // @see https://en.wikipedia.org/wiki/ISO_3166-1_numeric#Withdrawn_codes
65
+ private const WITHDRAWN_CODES = [
66
+ 128 , // Canton and Enderbury Islands
67
+ 200 , // Czechoslovakia
68
+ 216 , // Dronning Maud Land
69
+ 230 , // Ethiopia
70
+ 249 , // France, Metropolitan
71
+ 278 , // German Democratic Republic
72
+ 280 , // Germany, Federal Republic of
73
+ 396 , // Johnston Island
74
+ 488 , // Midway Islands
75
+ 530 , // Netherlands Antilles
76
+ 532 , // Netherlands Antilles
77
+ 536 , // Neutral Zone
78
+ 582 , // Pacific Islands (Trust Territory)
79
+ 590 , // Panama
80
+ 658 , // Saint Kitts-Nevis-Anguilla
81
+ 720 , // Yemen, Democratic
82
+ 736 , // Sudan
83
+ 810 , // USSR
84
+ 849 , // United States Miscellaneous Pacific Islands
85
+ 872 , // Wake Island
86
+ 886 , // Yemen Arab Republic
87
+ 890 , // Yugoslavia, Socialist Federal Republic of
88
+ 891 , // Serbia and Montenegro
89
+ ];
90
+
64
91
/**
65
92
* Collects all available language codes.
66
93
*
@@ -133,10 +160,21 @@ protected function generateDataForMeta(BundleEntryReaderInterface $reader, strin
133
160
$ alpha3ToAlpha2 = array_flip ($ alpha2ToAlpha3 );
134
161
asort ($ alpha3ToAlpha2 );
135
162
163
+ $ alpha2ToNumeric = $ this ->generateAlpha2ToNumericMapping ($ metadataBundle );
164
+ $ numericToAlpha2 = [];
165
+ foreach ($ alpha2ToNumeric as $ alpha2 => $ numeric ) {
166
+ // Add underscore prefix to force keys with leading zeros to remain as string keys.
167
+ $ numericToAlpha2 ['_ ' .$ numeric ] = $ alpha2 ;
168
+ }
169
+
170
+ asort ($ numericToAlpha2 );
171
+
136
172
return [
137
173
'Regions ' => $ this ->regionCodes ,
138
174
'Alpha2ToAlpha3 ' => $ alpha2ToAlpha3 ,
139
175
'Alpha3ToAlpha2 ' => $ alpha3ToAlpha2 ,
176
+ 'Alpha2ToNumeric ' => $ alpha2ToNumeric ,
177
+ 'NumericToAlpha2 ' => $ numericToAlpha2 ,
140
178
];
141
179
}
142
180
@@ -159,10 +197,12 @@ protected function generateRegionNames(ArrayAccessibleResourceBundle $localeBund
159
197
private function generateAlpha2ToAlpha3Mapping (array $ countries , ArrayAccessibleResourceBundle $ metadataBundle ): array
160
198
{
161
199
$ aliases = iterator_to_array ($ metadataBundle ['alias ' ]['territory ' ]);
200
+
162
201
$ alpha2ToAlpha3 = [];
163
202
164
203
foreach ($ aliases as $ alias => $ data ) {
165
204
$ country = $ data ['replacement ' ];
205
+
166
206
if (2 === \strlen ($ country ) && 3 === \strlen ($ alias ) && 'overlong ' === $ data ['reason ' ]) {
167
207
if (isset (self ::PREFERRED_ALPHA2_TO_ALPHA3_MAPPING [$ country ])) {
168
208
// Validate to prevent typos
@@ -190,4 +230,35 @@ private function generateAlpha2ToAlpha3Mapping(array $countries, ArrayAccessible
190
230
191
231
return $ alpha2ToAlpha3 ;
192
232
}
233
+
234
+ private function generateAlpha2ToNumericMapping (ArrayAccessibleResourceBundle $ metadataBundle ): array
235
+ {
236
+ $ aliases = iterator_to_array ($ metadataBundle ['alias ' ]['territory ' ]);
237
+
238
+ $ alpha2ToNumeric = [];
239
+
240
+ foreach ($ aliases as $ alias => $ data ) {
241
+ if (!is_numeric ($ alias )) {
242
+ continue ;
243
+ }
244
+
245
+ if (\in_array ($ alias , self ::WITHDRAWN_CODES )) {
246
+ continue ;
247
+ }
248
+
249
+ if (isset (self ::DENYLIST [$ data ['replacement ' ]])) {
250
+ continue ;
251
+ }
252
+
253
+ if ('deprecated ' === $ data ['reason ' ]) {
254
+ continue ;
255
+ }
256
+
257
+ $ alpha2ToNumeric [$ data ['replacement ' ]] = (string ) $ alias ;
258
+ }
259
+
260
+ ksort ($ alpha2ToNumeric );
261
+
262
+ return $ alpha2ToNumeric ;
263
+ }
193
264
}
0 commit comments