diff --git a/modules/system/console/WinterUtil.php b/modules/system/console/WinterUtil.php index 1bbe6d9857..a3f609588a 100644 --- a/modules/system/console/WinterUtil.php +++ b/modules/system/console/WinterUtil.php @@ -194,6 +194,7 @@ protected function utilCompileLang() $srcPath = base_path() . '/modules/system/lang/'.$locale.'/client.php'; $messages = require $fallbackPath; + if (File::isFile($srcPath) && $fallbackPath != $srcPath) { $messages = array_replace_recursive($messages, require $srcPath); } @@ -201,11 +202,25 @@ protected function utilCompileLang() /* * Load possible replacements from /lang */ + $overrides = []; + $parentOverrides = []; + $overridePath = base_path() . '/lang/'.$locale.'/system/client.php'; if (File::isFile($overridePath)) { - $messages = array_replace_recursive($messages, require $overridePath); + $overrides = require $overridePath; } + if (str_contains($locale, '-')) { + list($parentLocale, $country) = explode('-', $locale); + + $parentOverridePath = base_path() . '/lang/'.$parentLocale.'/system/client.php'; + if (File::isFile($parentOverridePath)) { + $parentOverrides = require $parentOverridePath; + } + } + + $messages = array_replace_recursive($messages, $parentOverrides, $overrides); + /* * Compile from stub and save file */ diff --git a/tests/unit/system/console/WinterUtilTest.php b/tests/unit/system/console/WinterUtilTest.php new file mode 100644 index 0000000000..9ea1c88dc8 --- /dev/null +++ b/tests/unit/system/console/WinterUtilTest.php @@ -0,0 +1,85 @@ + \'is coming\'];'); + + // execute compile + $this->artisan('winter:util compile lang')->execute(); + + // validate default lang handling + $lang = file_get_contents(base_path('modules/system/assets/js/lang/lang.en.js')); + $this->assertStringContainsString('winter', $lang); + $this->assertStringContainsString('is coming', $lang); + + // simulate override + $created = []; + + foreach (['lang/en/system', 'lang/en-gb/system'] as $slug) { + $path = rtrim(base_path(), '/'); + foreach (explode('/', $slug) as $dir) { + $path = $path . '/' . $dir; + if (!is_dir($path)) { + mkdir($path, 0755); + $created[] = $path; + } + } + } + + $langClient = base_path('lang/en/system/client.php'); + // handle existing file + if (file_exists($langClient)) { + rename($langClient, $langClient . '.backup'); + } + + file_put_contents($langClient, ' \'is epic\'];'); + + $langCountryClient = base_path('lang/en-gb/system/client.php'); + // handle existing file + if (file_exists($langCountryClient)) { + rename($langCountryClient, $langCountryClient . '.backup'); + } + + file_put_contents($langCountryClient, ' \'winter\'];'); + + // execute compile + $this->artisan('winter:util compile lang')->execute(); + + // validate override handling + $lang = file_get_contents(base_path('modules/system/assets/js/lang/lang.en.js')); + $this->assertStringContainsString('winter', $lang); + $this->assertStringContainsString('is epic', $lang); + + // check that lang subset has included parent overrides + $lang = file_get_contents(base_path('modules/system/assets/js/lang/lang.en-gb.js')); + $this->assertStringContainsString('winter', $lang); + $this->assertStringContainsString('is epic', $lang); + $this->assertStringContainsString('whats_epic', $lang); + $this->assertStringContainsString('winter', $lang); + + // restore + unlink($defaultClient); + rename($defaultClient . '.backup', $defaultClient); + + foreach ([$langClient, $langCountryClient] as $client) { + unlink($client); + if (file_exists($client . '.backup')) { + rename($client . '.backup', $client); + } + } + + foreach (array_reverse($created) as $dir) { + rmdir($dir); + } + + // regenerate original compiled lang + $this->artisan('winter:util compile lang')->execute(); + } +}