mirror of
https://github.com/nerzhul/ocsms.git
synced 2025-11-07 13:57:22 +00:00
* Add locale and libphonenumber libraries. * Update country code information Updated existing country codes, fixed incorrect NANP codes for member countries (as well as several UK based ones). Also added in Country Name to ISO country code mapping array for use with libphonenumber. * Convert phone number formatting to use libphonenumber libphonenumber parses phone number more consistantly than the old regex's that mismatched number on a regular basis.
175 lines
4.6 KiB
PHP
175 lines
4.6 KiB
PHP
<?php
|
|
|
|
namespace Giggsey\Locale;
|
|
|
|
class Locale
|
|
{
|
|
protected static $dataDir = '../data/';
|
|
|
|
/**
|
|
* Gets the primary language for the input locale
|
|
*
|
|
* @param string $locale Input locale (e.g. en-GB)
|
|
* @return string Primary Language (e.g. en)
|
|
*/
|
|
public static function getPrimaryLanguage($locale)
|
|
{
|
|
$parts = explode('-', str_replace('_', '-', $locale));
|
|
|
|
return strtolower($parts[0]);
|
|
}
|
|
|
|
/**
|
|
* Get the region for the input locale
|
|
*
|
|
* @param string $locale Input locale (e.g. de-CH-1991)
|
|
* @return string Region (e.g. CH)
|
|
*/
|
|
public static function getRegion($locale)
|
|
{
|
|
$parts = explode('-', str_replace('_', '-', $locale));
|
|
|
|
if (count($parts) === 1) {
|
|
return '';
|
|
}
|
|
|
|
$region = end($parts);
|
|
|
|
if (strlen($region) === 4) {
|
|
return '';
|
|
}
|
|
|
|
if ($region === 'POSIX') {
|
|
$region = 'US';
|
|
}
|
|
|
|
return strtoupper($region);
|
|
}
|
|
|
|
/**
|
|
* Get the localised display name for the region of the input locale
|
|
*
|
|
* @param string $locale The locale to return a display region for
|
|
* @param string $inLocale Format locale to display the region name
|
|
* @return string Display name for the region, or an empty string if no result could be found
|
|
*/
|
|
public static function getDisplayRegion($locale, $inLocale)
|
|
{
|
|
$dataDir = __DIR__ . DIRECTORY_SEPARATOR . static::$dataDir;
|
|
|
|
// Convert $locale into a region
|
|
$region = static::getRegion($locale);
|
|
|
|
$regionList = require $dataDir . '_list.php';
|
|
|
|
/*
|
|
* Loop through each part of the $inLocale, and see if we have data for that locale
|
|
*
|
|
* E.g zh-Hans-HK will look for zh-Hanks-HK, zh-Hanks, then finally zh
|
|
*/
|
|
$fallbackParts = explode('-', str_replace('_', '-', $inLocale));
|
|
$filesToSearch = array();
|
|
|
|
$i = count($fallbackParts);
|
|
while ($i > 0) {
|
|
$searchLocale = strtolower(implode('-', $fallbackParts));
|
|
|
|
if (isset($regionList[$searchLocale])) {
|
|
$filesToSearch[] = $searchLocale;
|
|
}
|
|
|
|
array_pop($fallbackParts);
|
|
$i--;
|
|
}
|
|
|
|
/*
|
|
* Load data files, and load the region (if it exists) from it
|
|
*/
|
|
|
|
foreach ($filesToSearch as $fileToSearch) {
|
|
// Load data file
|
|
$data = require $dataDir . $fileToSearch . '.php';
|
|
|
|
if (isset($data[$region])) {
|
|
return $data[$region];
|
|
}
|
|
}
|
|
|
|
return '';
|
|
}
|
|
|
|
public static function getVersion()
|
|
{
|
|
$file = __DIR__ . DIRECTORY_SEPARATOR . static::$dataDir . '_version.php';
|
|
|
|
return require $file;
|
|
}
|
|
|
|
/**
|
|
* Return a list of all the supported locales
|
|
*
|
|
* @return string[]
|
|
*/
|
|
public static function getSupportedLocales()
|
|
{
|
|
$dataDir = __DIR__ . DIRECTORY_SEPARATOR . static::$dataDir;
|
|
$regionList = require $dataDir . '_list.php';
|
|
|
|
return array_keys($regionList);
|
|
}
|
|
|
|
/**
|
|
* Load a list of all countries supported by a particular Locale
|
|
*
|
|
* @param string $locale
|
|
* @return string[] Associative array of Country Code => Country Name
|
|
* @throws \RuntimeException On an invalid region
|
|
*/
|
|
public static function getAllCountriesForLocale($locale)
|
|
{
|
|
$dataDir = __DIR__ . DIRECTORY_SEPARATOR . static::$dataDir;
|
|
$regionList = require $dataDir . '_list.php';
|
|
|
|
if (!isset($regionList[$locale])) {
|
|
throw new \RuntimeException("Locale is not supported");
|
|
}
|
|
|
|
/*
|
|
* Loop through each part of the $locale, and load data for that locale
|
|
*
|
|
* E.g zh-Hans-HK will look for zh-Hanks-HK, zh-Hanks, then finally zh
|
|
*/
|
|
$fallbackParts = explode('-', str_replace('_', '-', $locale));
|
|
$filesToSearch = array();
|
|
|
|
$i = count($fallbackParts);
|
|
while ($i > 0) {
|
|
$searchLocale = strtolower(implode('-', $fallbackParts));
|
|
|
|
if (isset($regionList[$searchLocale])) {
|
|
$filesToSearch[] = $searchLocale;
|
|
}
|
|
|
|
array_pop($fallbackParts);
|
|
$i--;
|
|
}
|
|
|
|
/*
|
|
* Load data files, and load the region (if it exists) from it
|
|
*/
|
|
|
|
$returnData = array();
|
|
|
|
foreach ($filesToSearch as $fileToSearch) {
|
|
// Load data file
|
|
$data = require $dataDir . $fileToSearch . '.php';
|
|
|
|
$returnData += $data;
|
|
}
|
|
|
|
ksort($returnData);
|
|
|
|
return $returnData;
|
|
}
|
|
}
|