[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)
|
public static function getFallback($locale)
|
||||||
{
|
{
|
||||||
if (false === $pos = strrpos($locale, '_')) {
|
if (function_exists('locale_parse')) {
|
||||||
if (self::$defaultFallback === $locale) {
|
$localeSubTags = locale_parse($locale);
|
||||||
return 'root';
|
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
|
array_pop($localeSubTags);
|
||||||
// Normal locales have two or three letters
|
|
||||||
if (strlen($locale) < 4) {
|
|
||||||
return self::$defaultFallback;
|
|
||||||
}
|
|
||||||
|
|
||||||
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