[Intl] Fixed support of Locale::getFallback
This commit is contained in:
parent
cd8374586b
commit
256055218e
@ -67,21 +67,44 @@ final class Locale extends \Locale
|
||||
*/
|
||||
public static function getFallback($locale)
|
||||
{
|
||||
if (false === $pos = strrpos($locale, '_')) {
|
||||
if (self::$defaultFallback === $locale) {
|
||||
return 'root';
|
||||
if (function_exists('locale_parse')) {
|
||||
$localeSubTags = locale_parse($locale);
|
||||
if (1 === count($localeSubTags)) {
|
||||
if (self::$defaultFallback === $localeSubTags['language']) {
|
||||
return 'root';
|
||||
}
|
||||
|
||||
// Don't return default fallback for "root", "meta" or others
|
||||
// Normal locales have two or three letters
|
||||
if (strlen($locale) < 4) {
|
||||
return self::$defaultFallback;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
// Don't return default fallback for "root", "meta" or others
|
||||
// Normal locales have two or three letters
|
||||
if (strlen($locale) < 4) {
|
||||
return self::$defaultFallback;
|
||||
}
|
||||
array_pop($localeSubTags);
|
||||
|
||||
return;
|
||||
return locale_compose($localeSubTags);
|
||||
}
|
||||
|
||||
return substr($locale, 0, $pos);
|
||||
if (false !== $pos = strrpos($locale, '_')) {
|
||||
return substr($locale, 0, $pos);
|
||||
}
|
||||
|
||||
if (false !== $pos = strrpos($locale, '-')) {
|
||||
return substr($locale, 0, $pos);
|
||||
}
|
||||
|
||||
if (self::$defaultFallback === $locale) {
|
||||
return 'root';
|
||||
}
|
||||
|
||||
// Don't return default fallback for "root", "meta" or others
|
||||
// Normal locales have two or three letters
|
||||
if (strlen($locale) < 4) {
|
||||
return self::$defaultFallback;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
49
src/Symfony/Component/Intl/Tests/LocaleTest.php
Normal file
49
src/Symfony/Component/Intl/Tests/LocaleTest.php
Normal file
@ -0,0 +1,49 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Intl\Tests;
|
||||
|
||||
use PHPUnit\Framework\TestCase;
|
||||
use Symfony\Component\Intl\Locale;
|
||||
|
||||
class LocaleTest extends TestCase
|
||||
{
|
||||
public function provideGetFallbackTests()
|
||||
{
|
||||
$tests = array(
|
||||
array('sl_Latn_IT', 'sl_Latn_IT_nedis'),
|
||||
array('sl_Latn', 'sl_Latn_IT'),
|
||||
array('fr', 'fr_FR'),
|
||||
array('fr', 'fr-FR'),
|
||||
array('en', 'fr'),
|
||||
array('root', 'en'),
|
||||
array(null, 'root'),
|
||||
);
|
||||
|
||||
if (function_exists('locale_parse')) {
|
||||
$tests[] = array('sl_Latn_IT', 'sl-Latn-IT-nedis');
|
||||
$tests[] = array('sl_Latn', 'sl-Latn_IT');
|
||||
} else {
|
||||
$tests[] = array('sl-Latn-IT', 'sl-Latn-IT-nedis');
|
||||
$tests[] = array('sl-Latn', 'sl-Latn-IT');
|
||||
}
|
||||
|
||||
return $tests;
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider provideGetFallbackTests
|
||||
*/
|
||||
public function testGetFallback($expected, $locale)
|
||||
{
|
||||
$this->assertSame($expected, Locale::getFallback($locale));
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user