kekrozsak/vendor/symfony/symfony/src/Symfony/Component/Locale/Locale.php

259 lines
7.5 KiB
PHP

<?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\Locale;
class Locale extends \Locale
{
/**
* Caches the countries in different locales
* @var array
*/
protected static $countries = array();
/**
* Caches the languages in different locales
* @var array
*/
protected static $languages = array();
/**
* Caches the different locales
* @var array
*/
protected static $locales = array();
/**
* Returns the country names for a locale
*
* @param string $locale The locale to use for the country names
*
* @return array The country names with their codes as keys
*
* @throws RuntimeException When the resource bundles cannot be loaded
*/
public static function getDisplayCountries($locale)
{
if (!isset(self::$countries[$locale])) {
$bundle = \ResourceBundle::create($locale, __DIR__.'/Resources/data/region');
if (null === $bundle) {
throw new \RuntimeException(sprintf('The country resource bundle could not be loaded for locale "%s"', $locale));
}
$collator = new \Collator($locale);
$countries = array();
$bundleCountries = $bundle->get('Countries') ?: array();
foreach ($bundleCountries as $code => $name) {
// Global countries (f.i. "America") have numeric codes
// Countries have alphabetic codes
// "ZZ" is the code for unknown country
if (ctype_alpha($code) && 'ZZ' !== $code) {
$countries[$code] = $name;
}
}
$fallbackLocale = self::getFallbackLocale($locale);
if (null !== $fallbackLocale) {
$countries = array_merge(self::getDisplayCountries($fallbackLocale), $countries);
}
$collator->asort($countries);
self::$countries[$locale] = $countries;
}
return self::$countries[$locale];
}
/**
* Returns all available country codes
*
* @return array The country codes
* @throws RuntimeException When the resource bundles cannot be loaded
*/
public static function getCountries()
{
return array_keys(self::getDisplayCountries(self::getDefault()));
}
/**
* Returns the language names for a locale
*
* @param string $locale The locale to use for the language names
*
* @return array The language names with their codes as keys
*
* @throws RuntimeException When the resource bundles cannot be loaded
*/
public static function getDisplayLanguages($locale)
{
if (!isset(self::$languages[$locale])) {
$bundle = \ResourceBundle::create($locale, __DIR__.'/Resources/data/lang');
if (null === $bundle) {
throw new \RuntimeException(sprintf('The language resource bundle could not be loaded for locale "%s"', $locale));
}
$collator = new \Collator($locale);
$languages = array();
$bundleLanguages = $bundle->get('Languages') ?: array();
foreach ($bundleLanguages as $code => $name) {
// "mul" is the code for multiple languages
if ('mul' !== $code) {
$languages[$code] = $name;
}
}
$fallbackLocale = self::getFallbackLocale($locale);
if (null !== $fallbackLocale) {
$languages = array_merge(self::getDisplayLanguages($fallbackLocale), $languages);
}
$collator->asort($languages);
self::$languages[$locale] = $languages;
}
return self::$languages[$locale];
}
/**
* Returns all available language codes
*
* @return array The language codes
* @throws RuntimeException When the resource bundles cannot be loaded
*/
public static function getLanguages()
{
return array_keys(self::getDisplayLanguages(self::getDefault()));
}
/**
* Returns the locale names for a locale
*
* @param string $locale The locale to use for the locale names
* @return array The locale names with their codes as keys
* @throws RuntimeException When the resource bundles cannot be loaded
*/
public static function getDisplayLocales($locale)
{
if (!isset(self::$locales[$locale])) {
$bundle = \ResourceBundle::create($locale, __DIR__.'/Resources/data/names');
if (null === $bundle) {
throw new \RuntimeException(sprintf('The locale resource bundle could not be loaded for locale "%s"', $locale));
}
$collator = new \Collator($locale);
$locales = array();
$bundleLocales = $bundle->get('Locales') ?: array();
foreach ($bundleLocales as $code => $name) {
$locales[$code] = $name;
}
$fallbackLocale = self::getFallbackLocale($locale);
if (null !== $fallbackLocale) {
$locales = array_merge(self::getDisplayLocales($fallbackLocale), $locales);
}
$collator->asort($locales);
self::$locales[$locale] = $locales;
}
return self::$locales[$locale];
}
/**
* Returns all available locale codes
*
* @return array The locale codes
* @throws RuntimeException When the resource bundles cannot be loaded
*/
public static function getLocales()
{
return array_keys(self::getDisplayLocales(self::getDefault()));
}
/**
* Returns the ICU version
*
* @return string|null The ICU version
*/
public static function getIcuVersion()
{
if (defined('INTL_ICU_VERSION')) {
return INTL_ICU_VERSION;
}
try {
$reflector = new \ReflectionExtension('intl');
} catch (\ReflectionException $e) {
return;
}
ob_start();
$reflector->info();
$output = strip_tags(ob_get_clean());
preg_match('/^ICU version (?:=>)?(.*)$/m', $output, $matches);
return trim($matches[1]);
}
/**
* Returns the ICU Data version
*
* @return string|null The ICU Data version
*/
public static function getIcuDataVersion()
{
if (defined('INTL_ICU_DATA_VERSION')) {
return INTL_ICU_DATA_VERSION;
}
try {
$reflector = new \ReflectionExtension('intl');
} catch (\ReflectionException $e) {
return;
}
ob_start();
$reflector->info();
$output = strip_tags(ob_get_clean());
preg_match('/^ICU Data version (?:=>)?(.*)$/m', $output, $matches);
return trim($matches[1]);
}
/**
* Returns the fallback locale for a given locale, if any
*
* @param $locale The locale to find the fallback for
* @return string|null The fallback locale, or null if no parent exists
*/
protected static function getFallbackLocale($locale)
{
if ($locale === self::getDefault()) {
return null;
}
if (false === $pos = strrpos($locale, '_')) {
return self::getDefault();
}
return substr($locale, 0, $pos);
}
}