diff options
Diffstat (limited to 'library/intl/src/Country')
-rw-r--r-- | library/intl/src/Country/Country.php | 168 | ||||
-rw-r--r-- | library/intl/src/Country/CountryInterface.php | 99 | ||||
-rw-r--r-- | library/intl/src/Country/CountryRepository.php | 124 | ||||
-rw-r--r-- | library/intl/src/Country/CountryRepositoryInterface.php | 31 |
4 files changed, 422 insertions, 0 deletions
diff --git a/library/intl/src/Country/Country.php b/library/intl/src/Country/Country.php new file mode 100644 index 000000000..5ac65fd0d --- /dev/null +++ b/library/intl/src/Country/Country.php @@ -0,0 +1,168 @@ +<?php + +namespace CommerceGuys\Intl\Country; + +class Country implements CountryInterface +{ + /** + * The two-letter country code. + * + * @var string + */ + protected $countryCode; + + /** + * The country name. + * + * @var string + */ + protected $name; + + /** + * The three-letter country code. + * + * @var string + */ + protected $threeLetterCode; + + /** + * The numeric country code. + * + * @var string + */ + protected $numericCode; + + /** + * The country telephone code. + * + * @var string + */ + protected $telephoneCode; + + /** + * The country locale (i.e. "en_US"). + * + * The country name is locale specific. + * + * @var string + */ + protected $locale; + + /** + * Returns the string representation of the Country. + * + * @return string + */ + public function __toString() + { + return $this->getCountryCode(); + } + + /** + * {@inheritdoc} + */ + public function getCountryCode() + { + return $this->countryCode; + } + + /** + * {@inheritdoc} + */ + public function setCountryCode($countryCode) + { + $this->countryCode = $countryCode; + + return $this; + } + + /** + * {@inheritdoc} + */ + public function getName() + { + return $this->name; + } + + /** + * {@inheritdoc} + */ + public function setName($name) + { + $this->name = $name; + + return $this; + } + + /** + * {@inheritdoc} + */ + public function getThreeLetterCode() + { + return $this->threeLetterCode; + } + + /** + * {@inheritdoc} + */ + public function setThreeLetterCode($threeLetterCode) + { + $this->threeLetterCode = $threeLetterCode; + + return $this; + } + + /** + * {@inheritdoc} + */ + public function getNumericCode() + { + return $this->numericCode; + } + + /** + * {@inheritdoc} + */ + public function setNumericCode($numericCode) + { + $this->numericCode = $numericCode; + + return $this; + } + + /** + * {@inheritdoc} + */ + public function getTelephoneCode() + { + return $this->telephoneCode; + } + + /** + * {@inheritdoc} + */ + public function setTelephoneCode($telephoneCode) + { + $this->telephoneCode = $telephoneCode; + + return $this; + } + + /** + * {@inheritdoc} + */ + public function getLocale() + { + return $this->locale; + } + + /** + * {@inheritdoc} + */ + public function setLocale($locale) + { + $this->locale = $locale; + + return $this; + } +} diff --git a/library/intl/src/Country/CountryInterface.php b/library/intl/src/Country/CountryInterface.php new file mode 100644 index 000000000..245a49be9 --- /dev/null +++ b/library/intl/src/Country/CountryInterface.php @@ -0,0 +1,99 @@ +<?php + +namespace CommerceGuys\Intl\Country; + +interface CountryInterface +{ + /** + * Gets the two-letter country code. + * + * @return string + */ + public function getCountryCode(); + + /** + * Sets the two-letter country code. + * + * @param string $countryCode The two-letter country code. + */ + public function setCountryCode($countryCode); + + /** + * Gets the country name. + * + * Note that certain locales have incomplete translations, in which + * case the english version of the country name is used instead. + * + * @return string + */ + public function getName(); + + /** + * Sets the country name. + * + * @param string $name The country name. + */ + public function setName($name); + + /** + * Gets the three-letter country code. + * + * Note that not every country has a three-letter code. + * CLDR lists "Canary Islands" (IC) and "Ceuta and Melilla" (EA) + * as separate countries, even though they are formally a part of Spain + * and have no three-letter or numeric ISO codes. + * + * @return string|null + */ + public function getThreeLetterCode(); + + /** + * Sets the three-letter country code. + * + * @param string $threeLetterCode The three-letter country code. + */ + public function setThreeLetterCode($threeLetterCode); + + /** + * Gets the numeric country code. + * + * The numeric code has three digits, and the first one can be a zero, + * hence the need to pass it around as a string. + * + * Note that not every country has a numeric code. + * CLDR lists "Canary Islands" (IC) and "Ceuta and Melilla" (EA) + * as separate countries, even though they are formally a part of Spain + * and have no three-letter or numeric ISO codes. + * "Ascension Island" (AE) also has no numeric code, even though it has a + * three-letter code. + * + * @return string|null + */ + public function getNumericCode(); + + /** + * Sets the numeric country code. + * + * @param string $numericCode The numeric country code. + */ + public function setNumericCode($numericCode); + + /** + * Gets the country telephone code. + * + * Also known as the calling code. + * + * Note that not every country has a telephone code. + * Right now Tristan da Cunha (TI) is the only such example. + * + * @return string|null + */ + public function getTelephoneCode(); + + /** + * Sets the country telephone code. + * + * @param string $telephoneCode The telephone code. + */ + public function setTelephoneCode($telephoneCode); +} diff --git a/library/intl/src/Country/CountryRepository.php b/library/intl/src/Country/CountryRepository.php new file mode 100644 index 000000000..b1fea803d --- /dev/null +++ b/library/intl/src/Country/CountryRepository.php @@ -0,0 +1,124 @@ +<?php + +namespace CommerceGuys\Intl\Country; + +use CommerceGuys\Intl\LocaleResolverTrait; +use CommerceGuys\Intl\Exception\UnknownCountryException; + +/** + * Manages countries based on JSON definitions. + */ +class CountryRepository implements CountryRepositoryInterface +{ + use LocaleResolverTrait; + + /** + * Base country definitions. + * + * Contains data common to all locales, such as the country numeric, + * three-letter, telephone codes. + * + * @var array + */ + protected $baseDefinitions = array(); + + /** + * Per-locale country definitions. + * + * @var array + */ + protected $definitions = array(); + + /** + * Creates a CountryRepository instance. + * + * @param string $definitionPath The path to the country definitions. + * Defaults to 'resources/country'. + */ + public function __construct($definitionPath = null) + { + $this->definitionPath = $definitionPath ? $definitionPath : __DIR__ . '/../../resources/country/'; + } + + /** + * {@inheritdoc} + */ + public function get($countryCode, $locale = null, $fallbackLocale = null) + { + $locale = $this->resolveLocale($locale, $fallbackLocale); + $definitions = $this->loadDefinitions($locale); + if (!isset($definitions[$countryCode])) { + throw new UnknownCountryException($countryCode); + } + + return $this->createCountryFromDefinition($definitions[$countryCode], $locale); + } + + /** + * {@inheritdoc} + */ + public function getAll($locale = null, $fallbackLocale = null) + { + $locale = $this->resolveLocale($locale, $fallbackLocale); + $definitions = $this->loadDefinitions($locale); + $countries = array(); + foreach ($definitions as $countryCode => $definition) { + $countries[$countryCode] = $this->createCountryFromDefinition($definition, $locale); + } + + return $countries; + } + + /** + * Loads the country definitions for the provided locale. + * + * @param string $locale The desired locale. + * + * @return array + */ + protected function loadDefinitions($locale) + { + if (!isset($this->definitions[$locale])) { + $filename = $this->definitionPath . $locale . '.json'; + $this->definitions[$locale] = json_decode(file_get_contents($filename), true); + + // Make sure the base definitions have been loaded. + if (empty($this->baseDefinitions)) { + $this->baseDefinitions = json_decode(file_get_contents($this->definitionPath . 'base.json'), true); + } + // Merge-in base definitions. + foreach ($this->definitions[$locale] as $countryCode => $definition) { + $this->definitions[$locale][$countryCode] += $this->baseDefinitions[$countryCode]; + } + } + + return $this->definitions[$locale]; + } + + /** + * Creates a country object from the provided definition. + * + * @param array $definition The country definition. + * @param string $locale The locale of the country definition. + * + * @return Country + */ + protected function createCountryFromDefinition(array $definition, $locale) + { + $country = new Country(); + $country->setCountryCode($definition['code']); + $country->setName($definition['name']); + $country->setLocale($locale); + if (isset($definition['three_letter_code'])) { + $country->setThreeLetterCode($definition['three_letter_code']); + } + if (isset($definition['numeric_code'])) { + $country->setNumericCode($definition['numeric_code']); + } + if (isset($definition['telephone_code'])) { + $country->setTelephoneCode($definition['telephone_code']); + } + + return $country; + } +} diff --git a/library/intl/src/Country/CountryRepositoryInterface.php b/library/intl/src/Country/CountryRepositoryInterface.php new file mode 100644 index 000000000..ae1cbd0c9 --- /dev/null +++ b/library/intl/src/Country/CountryRepositoryInterface.php @@ -0,0 +1,31 @@ +<?php + +namespace CommerceGuys\Intl\Country; + +/** + * Country repository interface. + */ +interface CountryRepositoryInterface +{ + /** + * Returns a country instance matching the provided country code. + * + * @param string $countryCode The country code. + * @param string $locale The locale (i.e. fr-FR). + * @param string $fallbackLocale A fallback locale (i.e "en"). + * + * @return CountryInterface + */ + public function get($countryCode, $locale = null, $fallbackLocale = null); + + /** + * Returns all available country instances. + * + * @param string $locale The locale (i.e. fr-FR). + * @param string $fallbackLocale A fallback locale (i.e "en"). + * + * @return array An array of countries implementing the CountryInterface, + * keyed by country code. + */ + public function getAll($locale = null, $fallbackLocale = null); +} |