Revert "Revert "Language names via intl library.""

This reverts commit 4f35efa0ba.
This commit is contained in:
Stefan Parviainen
2014-12-31 10:42:08 +01:00
parent 24a16434bc
commit 7bf7f8180d
994 changed files with 498717 additions and 7 deletions

View File

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

View File

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

View File

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

View File

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