1
0
mirror of https://github.com/nerzhul/ocsms.git synced 2025-11-07 13:57:22 +00:00
Greg Ross 6e86c48486 Updated phone formatter (#241)
* 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.
2018-06-26 09:49:22 +02:00

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