[Intl] Fixed support of Locale::getFallback

This commit is contained in:
Grégoire Pineau 2017-09-11 19:24:55 +02:00
parent cd8374586b
commit 256055218e
2 changed files with 82 additions and 10 deletions

View File

@ -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;
}
}
/**

View 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));
}
}