@@ -61,6 +61,33 @@ class RegionDataGenerator extends AbstractDataGenerator
6161 'ZZ ' => true , // Unknown Region
6262 ];
6363
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+
6491 /**
6592 * Collects all available language codes.
6693 *
@@ -133,10 +160,21 @@ protected function generateDataForMeta(BundleEntryReaderInterface $reader, strin
133160 $ alpha3ToAlpha2 = array_flip ($ alpha2ToAlpha3 );
134161 asort ($ alpha3ToAlpha2 );
135162
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+
136172 return [
137173 'Regions ' => $ this ->regionCodes ,
138174 'Alpha2ToAlpha3 ' => $ alpha2ToAlpha3 ,
139175 'Alpha3ToAlpha2 ' => $ alpha3ToAlpha2 ,
176+ 'Alpha2ToNumeric ' => $ alpha2ToNumeric ,
177+ 'NumericToAlpha2 ' => $ numericToAlpha2 ,
140178 ];
141179 }
142180
@@ -159,10 +197,12 @@ protected function generateRegionNames(ArrayAccessibleResourceBundle $localeBund
159197 private function generateAlpha2ToAlpha3Mapping (array $ countries , ArrayAccessibleResourceBundle $ metadataBundle ): array
160198 {
161199 $ aliases = iterator_to_array ($ metadataBundle ['alias ' ]['territory ' ]);
200+
162201 $ alpha2ToAlpha3 = [];
163202
164203 foreach ($ aliases as $ alias => $ data ) {
165204 $ country = $ data ['replacement ' ];
205+
166206 if (2 === \strlen ($ country ) && 3 === \strlen ($ alias ) && 'overlong ' === $ data ['reason ' ]) {
167207 if (isset (self ::PREFERRED_ALPHA2_TO_ALPHA3_MAPPING [$ country ])) {
168208 // Validate to prevent typos
@@ -190,4 +230,35 @@ private function generateAlpha2ToAlpha3Mapping(array $countries, ArrayAccessible
190230
191231 return $ alpha2ToAlpha3 ;
192232 }
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+ }
193264}
0 commit comments