1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
<?php
namespace Punic;
/**
* Script helper stuff.
*/
class Script
{
/**
* Script alternative name: secondary.
*
* @var string
*/
const ALTERNATIVENAME_SECONDARY = 'secondary';
/**
* Script alternative name: variant.
*
* @var string
*/
const ALTERNATIVENAME_VARIANT = 'variant';
/**
* Script alternative name: short.
*
* @var string
*/
const ALTERNATIVENAME_SHORT = 'short';
/**
* Script alternative name: stand alone.
*
* @var string
*/
const ALTERNATIVENAME_STANDALONE = 'stand-alone';
/**
* Get the list of all the script codes.
*
* @return string[]
*/
public static function getAllScriptCodes()
{
return static::getAvailableScriptCodes('en');
}
/**
* Get the list of all the available script codes that have a translation for a specific language.
*
* @param string $locale The locale to use. If empty we'll use the default locale set in \Punic\Data
*
* @return string[]
*/
public static function getAvailableScriptCodes($locale)
{
$data = Data::get('scripts', $locale);
$scriptCodes = array_keys($data);
sort($scriptCodes);
return $scriptCodes;
}
/**
* Get the name of a script given its code.
*
* @param string|mixed $scriptCode the script code
* @param string $preferredVariant the preferred variant (valid values are the values of the ALTERNATIVENAME_... constants)
* @param bool $fallbackToEnglish some languages may be missing translation for some scripts: should we look for English names in this case?
* @param string $locale The locale to use. If empty we'll use the default locale set in \Punic\Data
*
* @return string empty string if $scriptCode is not a valid script code
*
* @see \Punic\Script::ALTERNATIVENAME_SECONDARY
* @see \Punic\Script::ALTERNATIVENAME_VARIANT
* @see \Punic\Script::ALTERNATIVENAME_SHORT
* @see \Punic\Script::ALTERNATIVENAME_STANDALONE
*/
public static function getScriptName($scriptCode, $preferredVariant = '', $fallbackToEnglish = true, $locale = '')
{
if (!is_string($scriptCode) || $scriptCode === '') {
return '';
}
$data = Data::get('scripts', $locale);
if (!isset($data[$scriptCode])) {
if (!$fallbackToEnglish || $locale === 'en') {
return '';
}
return self::getScriptName($scriptCode, $preferredVariant, false, 'en');
}
return self::extractScriptName($data[$scriptCode], $preferredVariant);
}
/**
* Get all the scripts.
*
* @param string $preferredVariant the preferred variant (valid values are the values of the ALTERNATIVENAME_... constants)
* @param bool $fallbackToEnglish some languages may be missing translation for some scripts: should we look for English names in this case?
* @param string $locale The locale to use. If empty we'll use the default locale set in \Punic\Data
*
* @return array Array keys are the script codes, array values are the script names (the array is sorted by the values)
*
* @see \Punic\Script::ALTERNATIVENAME_SECONDARY
* @see \Punic\Script::ALTERNATIVENAME_VARIANT
* @see \Punic\Script::ALTERNATIVENAME_SHORT
* @see \Punic\Script::ALTERNATIVENAME_STANDALONE
*/
public static function getAllScripts($preferredVariant = '', $fallbackToEnglish = true, $locale = '')
{
$data = Data::get('scripts', $locale);
if ($fallbackToEnglish) {
$data += Data::get('scripts', 'en');
}
$result = array();
foreach ($data as $scriptCode => $scriptData) {
$result[$scriptCode] = self::extractScriptName($scriptData, $preferredVariant);
}
$comparer = new Comparer($locale);
$comparer->sort($result, true);
return $result;
}
/**
* @param string|array $scriptData
* @param string|mixed $preferredVariant
*
* @return string
*/
private static function extractScriptName($scriptData, $preferredVariant)
{
if (is_string($scriptData)) {
return $scriptData;
}
if (!is_string($preferredVariant) || $preferredVariant === '' || !isset($scriptData[$preferredVariant])) {
return $scriptData[''];
}
return $scriptData[$preferredVariant][0];
}
}