1414use Symfony \Component \Filesystem \Filesystem ;
1515use Symfony \Component \Intl \Data \Bundle \Compiler \BundleCompilerInterface ;
1616use Symfony \Component \Intl \Data \Bundle \Reader \BundleEntryReaderInterface ;
17- use Symfony \Component \Intl \Data \Provider \LanguageDataProvider ;
18- use Symfony \Component \Intl \Data \Provider \RegionDataProvider ;
19- use Symfony \Component \Intl \Data \Provider \ScriptDataProvider ;
2017use Symfony \Component \Intl \Data \Util \LocaleScanner ;
2118use Symfony \Component \Intl \Exception \MissingResourceException ;
2219use Symfony \Component \Intl \Locale ;
3128 */
3229class LocaleDataGenerator extends AbstractDataGenerator
3330{
34- private $ languageDataProvider ;
35- private $ scriptDataProvider ;
36- private $ regionDataProvider ;
3731 private $ locales ;
3832 private $ localeAliases ;
3933 private $ fallbackMapping ;
4034 private $ fallbackCache = [];
4135
42- public function __construct (BundleCompilerInterface $ compiler , $ dirName , LanguageDataProvider $ languageDataProvider , ScriptDataProvider $ scriptDataProvider , RegionDataProvider $ regionDataProvider )
43- {
44- parent ::__construct ($ compiler , $ dirName );
45-
46- $ this ->languageDataProvider = $ languageDataProvider ;
47- $ this ->scriptDataProvider = $ scriptDataProvider ;
48- $ this ->regionDataProvider = $ regionDataProvider ;
49- }
50-
5136 /**
5237 * {@inheritdoc}
5338 */
@@ -66,8 +51,12 @@ protected function scanLocales(LocaleScanner $scanner, $sourceDir)
6651 protected function compileTemporaryBundles (BundleCompilerInterface $ compiler , $ sourceDir , $ tempDir )
6752 {
6853 $ filesystem = new Filesystem ();
69- $ filesystem ->mkdir ($ tempDir .'/lang ' );
54+ $ filesystem ->mkdir ([
55+ $ tempDir .'/lang ' ,
56+ $ tempDir .'/region ' ,
57+ ]);
7058 $ compiler ->compile ($ sourceDir .'/lang ' , $ tempDir .'/lang ' );
59+ $ compiler ->compile ($ sourceDir .'/region ' , $ tempDir .'/region ' );
7160 }
7261
7362 /**
@@ -83,19 +72,14 @@ protected function preGenerate()
8372 */
8473 protected function generateDataForLocale (BundleEntryReaderInterface $ reader , $ tempDir , $ displayLocale )
8574 {
86- // Generate aliases, needed to enable proper fallback from alias to its
87- // target
75+ // Don't generate aliases, as they are resolved during runtime
8876 if (isset ($ this ->localeAliases [$ displayLocale ])) {
89- return [ ' %%ALIAS ' => $ this -> localeAliases [ $ displayLocale ]] ;
77+ return ;
9078 }
9179
9280 // Generate locale names for all locales that have translations in
9381 // at least the language or the region bundle
94- try {
95- $ displayFormat = $ reader ->readEntry ($ tempDir .'/lang ' , $ displayLocale , ['localeDisplayPattern ' ]);
96- } catch (MissingResourceException $ e ) {
97- $ displayFormat = $ reader ->readEntry ($ tempDir .'/lang ' , 'root ' , ['localeDisplayPattern ' ]);
98- }
82+ $ displayFormat = $ reader ->readEntry ($ tempDir .'/lang ' , $ displayLocale , ['localeDisplayPattern ' ]);
9983 $ pattern = $ displayFormat ['pattern ' ] ?? '{0} ({1}) ' ;
10084 $ separator = $ displayFormat ['separator ' ] ?? '{0}, {1} ' ;
10185 $ localeNames = [];
@@ -110,7 +94,7 @@ protected function generateDataForLocale(BundleEntryReaderInterface $reader, $te
11094 // Each locale name has the form: "Language (Script, Region, Variant1, ...)
11195 // Script, Region and Variants are optional. If none of them is
11296 // available, the braces are not printed.
113- $ localeNames [$ locale ] = $ this ->generateLocaleName ($ locale , $ displayLocale , $ pattern , $ separator );
97+ $ localeNames [$ locale ] = $ this ->generateLocaleName ($ reader , $ tempDir , $ locale , $ displayLocale , $ pattern , $ separator );
11498 } catch (MissingResourceException $ e ) {
11599 // Silently ignore incomplete locale names
116100 // In this case one should configure at least one fallback locale that is complete (e.g. English) during
@@ -158,22 +142,26 @@ protected function generateDataForMeta(BundleEntryReaderInterface $reader, $temp
158142 /**
159143 * @return string
160144 */
161- private function generateLocaleName ($ locale , $ displayLocale , $ pattern , $ separator )
145+ private function generateLocaleName (BundleEntryReaderInterface $ reader , $ tempDir , $ locale , $ displayLocale , $ pattern , $ separator )
162146 {
163147 // Apply generic notation using square brackets as described per http://cldr.unicode.org/translation/language-names
164- $ name = str_replace (['( ' , ') ' ], ['[ ' , '] ' ], $ this -> languageDataProvider -> getName ( \Locale::getPrimaryLanguage ($ locale ), $ displayLocale ));
148+ $ name = str_replace (['( ' , ') ' ], ['[ ' , '] ' ], $ reader -> readEntry ( $ tempDir . ' /lang ' , $ displayLocale , [ ' Languages ' , \Locale::getPrimaryLanguage ($ locale )] ));
165149 $ extras = [];
166150
167151 // Discover the name of the script part of the locale
168152 // i.e. in zh_Hans_MO, "Hans" is the script
169153 if ($ script = \Locale::getScript ($ locale )) {
170- $ extras [] = str_replace (['( ' , ') ' ], ['[ ' , '] ' ], $ this -> scriptDataProvider -> getName ( $ script , $ displayLocale ));
154+ $ extras [] = str_replace (['( ' , ') ' ], ['[ ' , '] ' ], $ reader -> readEntry ( $ tempDir . ' /lang ' , $ displayLocale, [ ' Scripts ' , $ script ] ));
171155 }
172156
173157 // Discover the name of the region part of the locale
174158 // i.e. in de_AT, "AT" is the region
175159 if ($ region = \Locale::getRegion ($ locale )) {
176- $ extras [] = str_replace (['( ' , ') ' ], ['[ ' , '] ' ], $ this ->regionDataProvider ->getName ($ region , $ displayLocale ));
160+ if (!RegionDataGenerator::isValidCountryCode ($ region )) {
161+ throw new MissingResourceException ('Skipping " ' .$ locale .'" due an invalid country. ' );
162+ }
163+
164+ $ extras [] = str_replace (['( ' , ') ' ], ['[ ' , '] ' ], $ reader ->readEntry ($ tempDir .'/region ' , $ displayLocale , ['Countries ' , $ region ]));
177165 }
178166
179167 if ($ extras ) {
0 commit comments