phonePrefixDataDirectory = $phonePrefixDataDirectory; $this->loadMappingFileProvider(); } protected function loadMappingFileProvider() { $mapPath = $this->phonePrefixDataDirectory . DIRECTORY_SEPARATOR . 'Map.php'; if (!file_exists($mapPath)) { throw new \InvalidArgumentException("Invalid data directory: $mapPath"); } $map = require $mapPath; $this->mappingFileProvider = new MappingFileProvider($map); } /** * @param $prefixMapKey * @param $language * @param $script * @param $region * @return PhonePrefixMap|null */ public function getPhonePrefixDescriptions($prefixMapKey, $language, $script, $region) { $fileName = $this->mappingFileProvider->getFileName($prefixMapKey, $language, $script, $region); if (strlen($fileName) == 0) { return null; } if (!isset($this->availablePhonePrefixMaps[$fileName])) { $this->loadPhonePrefixMapFromFile($fileName); } return $this->availablePhonePrefixMaps[$fileName]; } protected function loadPhonePrefixMapFromFile($fileName) { $path = $this->phonePrefixDataDirectory . DIRECTORY_SEPARATOR . $fileName; if (!file_exists($path)) { throw new \InvalidArgumentException('Data does not exist'); } $map = require $path; $areaCodeMap = new PhonePrefixMap($map); $this->availablePhonePrefixMaps[$fileName] = $areaCodeMap; } public function mayFallBackToEnglish($language) { // Don't fall back to English if the requested language is among the following: // - Chinese // - Japanese // - Korean return ($language != 'zh' && $language != 'ja' && $language != 'ko'); } /** * Returns a text description in the given language for the given phone number. * * @param PhoneNumber $number the phone number for which we want to get a text description * @param string $language two or three-letter lowercase ISO language as defined by ISO 639 * @param string $script four-letter titlecase (the first letter is uppercase and the rest of the letters * are lowercase) ISO script code as defined in ISO 15924 * @param string $region two-letter uppercase ISO country code as defined by ISO 3166-1 * @return string a text description for the given language code for the given phone number, or empty * string if the number passed in is invalid or could belong to multiple countries */ public function getDescriptionForNumber(PhoneNumber $number, $language, $script, $region) { $phonePrefix = $number->getCountryCode() . PhoneNumberUtil::getInstance()->getNationalSignificantNumber($number); $phonePrefixDescriptions = $this->getPhonePrefixDescriptions($phonePrefix, $language, $script, $region); $description = ($phonePrefixDescriptions !== null) ? $phonePrefixDescriptions->lookup($number) : null; // When a location is not available in the requested language, fall back to English. if (($description === null || strlen($description) === 0) && $this->mayFallBackToEnglish($language)) { $defaultMap = $this->getPhonePrefixDescriptions($phonePrefix, 'en', '', ''); if ($defaultMap === null) { return ''; } $description = $defaultMap->lookup($number); } return ($description !== null) ? $description : ''; } }