vendor/symfony/intl/Intl.php line 193

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of the Symfony package.
  4.  *
  5.  * (c) Fabien Potencier <fabien@symfony.com>
  6.  *
  7.  * For the full copyright and license information, please view the LICENSE
  8.  * file that was distributed with this source code.
  9.  */
  10. namespace Symfony\Component\Intl;
  11. use Symfony\Component\Intl\Data\Bundle\Reader\BufferedBundleReader;
  12. use Symfony\Component\Intl\Data\Bundle\Reader\BundleEntryReader;
  13. use Symfony\Component\Intl\Data\Bundle\Reader\BundleEntryReaderInterface;
  14. use Symfony\Component\Intl\Data\Bundle\Reader\JsonBundleReader;
  15. use Symfony\Component\Intl\Data\Provider\LocaleDataProvider;
  16. use Symfony\Component\Intl\Data\Provider\ScriptDataProvider;
  17. use Symfony\Component\Intl\ResourceBundle\CurrencyBundle;
  18. use Symfony\Component\Intl\ResourceBundle\CurrencyBundleInterface;
  19. use Symfony\Component\Intl\ResourceBundle\LanguageBundle;
  20. use Symfony\Component\Intl\ResourceBundle\LanguageBundleInterface;
  21. use Symfony\Component\Intl\ResourceBundle\LocaleBundle;
  22. use Symfony\Component\Intl\ResourceBundle\LocaleBundleInterface;
  23. use Symfony\Component\Intl\ResourceBundle\RegionBundle;
  24. use Symfony\Component\Intl\ResourceBundle\RegionBundleInterface;
  25. /**
  26.  * Gives access to internationalization data.
  27.  *
  28.  * @author Bernhard Schussek <bschussek@gmail.com>
  29.  */
  30. final class Intl
  31. {
  32.     /**
  33.      * The number of resource bundles to buffer. Loading the same resource
  34.      * bundle for n locales takes up n spots in the buffer.
  35.      */
  36.     public const BUFFER_SIZE 10;
  37.     /**
  38.      * The directory name of the currency data.
  39.      */
  40.     public const CURRENCY_DIR 'currencies';
  41.     /**
  42.      * The directory name of the language data.
  43.      */
  44.     public const LANGUAGE_DIR 'languages';
  45.     /**
  46.      * The directory name of the script data.
  47.      */
  48.     public const SCRIPT_DIR 'scripts';
  49.     /**
  50.      * The directory name of the locale data.
  51.      */
  52.     public const LOCALE_DIR 'locales';
  53.     /**
  54.      * The directory name of the region data.
  55.      */
  56.     public const REGION_DIR 'regions';
  57.     /**
  58.      * The directory name of the zone data.
  59.      */
  60.     public const TIMEZONE_DIR 'timezones';
  61.     /**
  62.      * @var ResourceBundle\CurrencyBundleInterface
  63.      */
  64.     private static $currencyBundle;
  65.     /**
  66.      * @var ResourceBundle\LanguageBundleInterface
  67.      */
  68.     private static $languageBundle;
  69.     /**
  70.      * @var ResourceBundle\LocaleBundleInterface
  71.      */
  72.     private static $localeBundle;
  73.     /**
  74.      * @var ResourceBundle\RegionBundleInterface
  75.      */
  76.     private static $regionBundle;
  77.     /**
  78.      * @var string|bool|null
  79.      */
  80.     private static $icuVersion false;
  81.     /**
  82.      * @var string
  83.      */
  84.     private static $icuDataVersion false;
  85.     /**
  86.      * @var BundleEntryReaderInterface
  87.      */
  88.     private static $entryReader;
  89.     /**
  90.      * Returns whether the intl extension is installed.
  91.      *
  92.      * @return bool Returns true if the intl extension is installed, false otherwise
  93.      */
  94.     public static function isExtensionLoaded(): bool
  95.     {
  96.         return class_exists(\ResourceBundle::class);
  97.     }
  98.     /**
  99.      * Returns the bundle containing currency information.
  100.      *
  101.      * @return CurrencyBundleInterface The currency resource bundle
  102.      *
  103.      * @deprecated since Symfony 4.3, to be removed in 5.0. Use {@see Currencies} instead.
  104.      */
  105.     public static function getCurrencyBundle(): CurrencyBundleInterface
  106.     {
  107.         @trigger_error(sprintf('The method "%s()" is deprecated since Symfony 4.3, use "%s" instead.'__METHOD__Currencies::class), \E_USER_DEPRECATED);
  108.         if (null === self::$currencyBundle) {
  109.             self::$currencyBundle = new CurrencyBundle(
  110.                 self::getDataDirectory().'/'.self::CURRENCY_DIR,
  111.                 self::getEntryReader(),
  112.                 self::$localeBundle ?? self::$localeBundle = new LocaleBundle(self::getDataDirectory().'/'.self::LOCALE_DIRself::getEntryReader())
  113.             );
  114.         }
  115.         return self::$currencyBundle;
  116.     }
  117.     /**
  118.      * Returns the bundle containing language information.
  119.      *
  120.      * @return LanguageBundleInterface The language resource bundle
  121.      *
  122.      * @deprecated since Symfony 4.3, to be removed in 5.0. Use {@see Languages} or {@see Scripts} instead.
  123.      */
  124.     public static function getLanguageBundle(): LanguageBundleInterface
  125.     {
  126.         @trigger_error(sprintf('The method "%s()" is deprecated since Symfony 4.3, use "%s" or "%s" instead.'__METHOD__Languages::class, Scripts::class), \E_USER_DEPRECATED);
  127.         if (null === self::$languageBundle) {
  128.             self::$languageBundle = new LanguageBundle(
  129.                 self::getDataDirectory().'/'.self::LANGUAGE_DIR,
  130.                 self::getEntryReader(),
  131.                 self::$localeBundle ?? self::$localeBundle = new LocaleBundle(self::getDataDirectory().'/'.self::LOCALE_DIRself::getEntryReader()),
  132.                 new ScriptDataProvider(
  133.                     self::getDataDirectory().'/'.self::SCRIPT_DIR,
  134.                     self::getEntryReader()
  135.                 )
  136.             );
  137.         }
  138.         return self::$languageBundle;
  139.     }
  140.     /**
  141.      * Returns the bundle containing locale information.
  142.      *
  143.      * @return LocaleBundleInterface The locale resource bundle
  144.      *
  145.      * @deprecated since Symfony 4.3, to be removed in 5.0. Use {@see Locales} instead.
  146.      */
  147.     public static function getLocaleBundle(): LocaleBundleInterface
  148.     {
  149.         @trigger_error(sprintf('The method "%s()" is deprecated since Symfony 4.3, use "%s" instead.'__METHOD__Locales::class), \E_USER_DEPRECATED);
  150.         if (null === self::$localeBundle) {
  151.             self::$localeBundle = new LocaleBundle(
  152.                 self::getDataDirectory().'/'.self::LOCALE_DIR,
  153.                 self::getEntryReader()
  154.             );
  155.         }
  156.         return self::$localeBundle;
  157.     }
  158.     /**
  159.      * Returns the bundle containing region information.
  160.      *
  161.      * @return RegionBundleInterface The region resource bundle
  162.      *
  163.      * @deprecated since Symfony 4.3, to be removed in 5.0. Use {@see Countries} instead.
  164.      */
  165.     public static function getRegionBundle(): RegionBundleInterface
  166.     {
  167.         @trigger_error(sprintf('The method "%s()" is deprecated since Symfony 4.3, use "%s" instead.'__METHOD__Countries::class), \E_USER_DEPRECATED);
  168.         if (null === self::$regionBundle) {
  169.             self::$regionBundle = new RegionBundle(
  170.                 self::getDataDirectory().'/'.self::REGION_DIR,
  171.                 self::getEntryReader(),
  172.                 self::$localeBundle ?? self::$localeBundle = new LocaleBundle(self::getDataDirectory().'/'.self::LOCALE_DIRself::getEntryReader())
  173.             );
  174.         }
  175.         return self::$regionBundle;
  176.     }
  177.     /**
  178.      * Returns the version of the installed ICU library.
  179.      *
  180.      * @return string|null The ICU version or NULL if it could not be determined
  181.      */
  182.     public static function getIcuVersion(): ?string
  183.     {
  184.         if (false === self::$icuVersion) {
  185.             if (!self::isExtensionLoaded()) {
  186.                 self::$icuVersion self::getIcuStubVersion();
  187.             } elseif (\defined('INTL_ICU_VERSION')) {
  188.                 self::$icuVersion = \INTL_ICU_VERSION;
  189.             } else {
  190.                 try {
  191.                     $reflector = new \ReflectionExtension('intl');
  192.                     ob_start();
  193.                     $reflector->info();
  194.                     $output strip_tags(ob_get_clean());
  195.                     preg_match('/^ICU version (?:=>)?(.*)$/m'$output$matches);
  196.                     self::$icuVersion trim($matches[1]);
  197.                 } catch (\ReflectionException $e) {
  198.                     self::$icuVersion null;
  199.                 }
  200.             }
  201.         }
  202.         return self::$icuVersion;
  203.     }
  204.     /**
  205.      * Returns the version of the installed ICU data.
  206.      *
  207.      * @return string The version of the installed ICU data
  208.      */
  209.     public static function getIcuDataVersion(): string
  210.     {
  211.         if (false === self::$icuDataVersion) {
  212.             self::$icuDataVersion trim(file_get_contents(self::getDataDirectory().'/version.txt'));
  213.         }
  214.         return self::$icuDataVersion;
  215.     }
  216.     /**
  217.      * Returns the ICU version that the stub classes mimic.
  218.      *
  219.      * @return string The ICU version of the stub classes
  220.      */
  221.     public static function getIcuStubVersion(): string
  222.     {
  223.         return '68.2';
  224.     }
  225.     /**
  226.      * Returns the absolute path to the data directory.
  227.      *
  228.      * @return string The absolute path to the data directory
  229.      */
  230.     public static function getDataDirectory(): string
  231.     {
  232.         return __DIR__.'/Resources/data';
  233.     }
  234.     /**
  235.      * Returns the cached bundle entry reader.
  236.      */
  237.     private static function getEntryReader(): BundleEntryReaderInterface
  238.     {
  239.         if (null === self::$entryReader) {
  240.             self::$entryReader = new BundleEntryReader(new BufferedBundleReader(
  241.                 new JsonBundleReader(),
  242.                 self::BUFFER_SIZE
  243.             ));
  244.             $localeDataProvider = new LocaleDataProvider(
  245.                 self::getDataDirectory().'/'.self::LOCALE_DIR,
  246.                 self::$entryReader
  247.             );
  248.             self::$entryReader->setLocaleAliases($localeDataProvider->getAliases());
  249.         }
  250.         return self::$entryReader;
  251.     }
  252.     /**
  253.      * This class must not be instantiated.
  254.      */
  255.     private function __construct()
  256.     {
  257.     }
  258. }