|
|
|
@ -319,70 +319,57 @@ describe('locale-aware caching of rendered site pages', function () {
|
|
|
|
})->skip(fn () => firstNonDefaultLocale() === 'en-US', 'needs a second locale');
|
|
|
|
})->skip(fn () => firstNonDefaultLocale() === 'en-US', 'needs a second locale');
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
describe('legacy APP_LOCALE normalization (config/app.php)', function () {
|
|
|
|
describe('legacy locale normalization', function () {
|
|
|
|
/*
|
|
|
|
/*
|
|
|
|
| The normalization lives in config/app.php: it maps a legacy short code
|
|
|
|
| Localization::normalizeLocale maps a legacy short code (e.g. "es") to the
|
|
|
|
| (e.g. "es") from APP_LOCALE to the current locale folder (e.g. "es-ES")
|
|
|
|
| current locale folder (e.g. "es-ES"). config/app.php runs APP_LOCALE and
|
|
|
|
| so instances upgrading with an old APP_LOCALE do not silently fall back
|
|
|
|
| APP_FALLBACK_LOCALE through it so instances upgrading with an old
|
|
|
|
| to English. The config value is resolved once at boot, so these tests
|
|
|
|
| APP_LOCALE do not silently fall back to English.
|
|
|
|
| re-run the config file with a given APP_LOCALE and assert the result.
|
|
|
|
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
$resolveLocale = function (?string $appLocale): string {
|
|
|
|
it('maps a legacy two-letter code to its current locale code', function () {
|
|
|
|
// Set APP_LOCALE the way the config file reads it (via env()).
|
|
|
|
expect(Localization::normalizeLocale('es'))->toBe('es-ES')
|
|
|
|
if ($appLocale === null) {
|
|
|
|
->and(Localization::normalizeLocale('de'))->toBe('de-DE')
|
|
|
|
putenv('APP_LOCALE');
|
|
|
|
->and(Localization::normalizeLocale('fr'))->toBe('fr-FR');
|
|
|
|
unset($_ENV['APP_LOCALE'], $_SERVER['APP_LOCALE']);
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
putenv('APP_LOCALE='.$appLocale);
|
|
|
|
|
|
|
|
$_ENV['APP_LOCALE'] = $appLocale;
|
|
|
|
|
|
|
|
$_SERVER['APP_LOCALE'] = $appLocale;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
$config = require base_path('config/app.php');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return $config['locale'];
|
|
|
|
|
|
|
|
} finally {
|
|
|
|
|
|
|
|
putenv('APP_LOCALE');
|
|
|
|
|
|
|
|
unset($_ENV['APP_LOCALE'], $_SERVER['APP_LOCALE']);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
it('maps a legacy two-letter APP_LOCALE to its current locale code', function () use ($resolveLocale) {
|
|
|
|
|
|
|
|
expect($resolveLocale('es'))->toBe('es-ES')
|
|
|
|
|
|
|
|
->and($resolveLocale('de'))->toBe('de-DE')
|
|
|
|
|
|
|
|
->and($resolveLocale('fr'))->toBe('fr-FR');
|
|
|
|
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
it('maps a legacy region APP_LOCALE to its current locale code', function () use ($resolveLocale) {
|
|
|
|
it('maps a legacy region code to its current locale code', function () {
|
|
|
|
expect($resolveLocale('zh-cn'))->toBe('zh-CN')
|
|
|
|
expect(Localization::normalizeLocale('zh-cn'))->toBe('zh-CN')
|
|
|
|
->and($resolveLocale('zh-tw'))->toBe('zh-TW');
|
|
|
|
->and(Localization::normalizeLocale('zh-tw'))->toBe('zh-TW');
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
it('pins the ambiguous legacy codes deliberately', function () use ($resolveLocale) {
|
|
|
|
it('pins the ambiguous legacy codes deliberately', function () {
|
|
|
|
// "en" must resolve to en-US, not the en-x-pirate novelty locale.
|
|
|
|
// "en" must resolve to en-US, not the en-x-pirate novelty locale.
|
|
|
|
expect($resolveLocale('en'))->toBe('en-US')
|
|
|
|
expect(Localization::normalizeLocale('en'))->toBe('en-US')
|
|
|
|
// "sr" must resolve to the prior single Serbian translation.
|
|
|
|
// "sr" must resolve to the prior single Serbian translation.
|
|
|
|
->and($resolveLocale('sr'))->toBe('sr-CS');
|
|
|
|
->and(Localization::normalizeLocale('sr'))->toBe('sr-CS');
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
it('is case-insensitive on legacy short codes', function () use ($resolveLocale) {
|
|
|
|
it('is case-insensitive on legacy short codes', function () {
|
|
|
|
expect($resolveLocale('ES'))->toBe('es-ES')
|
|
|
|
expect(Localization::normalizeLocale('ES'))->toBe('es-ES')
|
|
|
|
->and($resolveLocale('Zh-Cn'))->toBe('zh-CN');
|
|
|
|
->and(Localization::normalizeLocale('Zh-Cn'))->toBe('zh-CN');
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
it('leaves an already-current locale code unchanged', function () use ($resolveLocale) {
|
|
|
|
it('leaves an already-current locale code unchanged', function () {
|
|
|
|
expect($resolveLocale('es-ES'))->toBe('es-ES')
|
|
|
|
expect(Localization::normalizeLocale('es-ES'))->toBe('es-ES')
|
|
|
|
->and($resolveLocale('en-US'))->toBe('en-US');
|
|
|
|
->and(Localization::normalizeLocale('en-US'))->toBe('en-US');
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
it('leaves unknown or custom locale codes unchanged', function () use ($resolveLocale) {
|
|
|
|
it('leaves unknown or custom locale codes unchanged', function () {
|
|
|
|
expect($resolveLocale('xx-YY'))->toBe('xx-YY')
|
|
|
|
expect(Localization::normalizeLocale('xx-YY'))->toBe('xx-YY')
|
|
|
|
->and($resolveLocale('en-x-pirate'))->toBe('en-x-pirate');
|
|
|
|
->and(Localization::normalizeLocale('en-x-pirate'))->toBe('en-x-pirate');
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
it('falls back to en-US when APP_LOCALE is unset', function () use ($resolveLocale) {
|
|
|
|
it('falls back to en-US for empty or whitespace input', function () {
|
|
|
|
expect($resolveLocale(null))->toBe('en-US');
|
|
|
|
expect(Localization::normalizeLocale(''))->toBe('en-US')
|
|
|
|
|
|
|
|
->and(Localization::normalizeLocale(' '))->toBe('en-US')
|
|
|
|
|
|
|
|
->and(Localization::normalizeLocale(null))->toBe('en-US');
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
it('resolves the configured app locale from a legacy APP_LOCALE', function () {
|
|
|
|
|
|
|
|
// Simulate an upgraded instance whose APP_LOCALE is still "es".
|
|
|
|
|
|
|
|
Config::set('app.locale', Localization::normalizeLocale('es'));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
expect(config('app.locale'))->toBe('es-ES');
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|