app/Helpers/CountriesHelper.php (138 lines of code) (raw):

<?php namespace App\Helpers; use Illuminate\Support\Arr; use Illuminate\Support\Collection; use Illuminate\Support\Facades\App; //use PragmaRX\Countries\Package\Support\Collection; use PragmaRX\CountriesLaravel\Package\Facade as Countries; use PragmaRX\Countries\Package\Support\Collection as Country; class CountriesHelper { /** * Get list of countries. * * @return \Illuminate\Support\Collection<Country> */ public static function getAll(): Collection { $x = Countries::all(); $countries = $x->map(function ($item) { return [ 'id' => $item->cca2, 'country' => static::getCommonNameLocale($item), ]; }); return collect($countries->sortByCollator('country')); } /** * Get country name. * * @param string $iso code of the country * @return string common name (localized) of the country */ public static function get($iso): string { $country = self::getCountry($iso); if (is_null($country)) { return ''; } return static::getCommonNameLocale($country); } /** * Find a country by the (english) name of the country. * * @param string $name Common name of a country * @return string cca2 code of the country */ public static function find($name): string { $country = Countries::where('name.common', $name)->first(); if ($country->count() === 0) { $country = Countries::where('cca2', mb_strtoupper($name))->first(); } if ($country->count() === 0) { return ''; } return $country->cca2; } /** * Get the common name of country, in locale version. * * @param \ArrayAccess $country * @return string */ private static function getCommonNameLocale($country): string { $locale = App::getLocale(); $lang = LocaleHelper::getLocaleAlpha($locale); return Arr::get($country, 'translations.'.$lang.'.common', Arr::get($country, 'name.common', '') ); } /** * Get country for a specific iso code. * * @param string $iso * @return Country|null the Country element */ public static function getCountry($iso): ?Country { $country = Countries::where('cca2', mb_strtoupper($iso))->first(); if ($country->count() === 0) { $country = Countries::where('alt_spellings', mb_strtoupper($iso))->first(); } if ($country->count() === 0) { return null; } return $country; } /** * Get country for a specific language. * * @param string $locale language code (iso) * @return Country|null the Country element */ public static function getCountryFromLocale($locale): ?Country { $countryCode = LocaleHelper::extractCountry($locale); if (empty($countryCode)) { $countryCode = self::getDefaultCountryFromLocale($locale); } if (is_null($countryCode)) { $lang = LocaleHelper::getLocaleAlpha($locale); $country = Countries::whereISO639_3($lang); if ($country->count() === 0) { return null; } } else { $country = Countries::where('cca2', $countryCode); } return $country->first(); } /** * Get default country for a language. * * @param string $locale language code (iso) * @return string|null cca2 code */ private static function getDefaultCountryFromLocale($locale): ?string { switch (mb_strtolower($locale)) { case 'cs': $country = 'CZ'; break; case 'en': $country = 'US'; break; case 'he': $country = 'IL'; break; case 'zh': $country = 'CN'; break; case 'de': case 'es': case 'fr': case 'hr': case 'it': case 'nl': case 'pt': case 'ru': case 'tr': $country = mb_strtoupper($locale); break; default: $country = null; break; } return $country; } /** * Get default timezone for the country. * * @param mixed $country Country element * @return string timezone fo this sountry */ public static function getDefaultTimezone($country): string { // https://en.wikipedia.org/wiki/List_of_tz_database_time_zones // https://en.wikipedia.org/wiki/List_of_time_zones_by_country switch ($country->cca3) { case 'AUS': $timezone = 'Australia/Melbourne'; break; case 'CHN': $timezone = 'Asia/Shanghai'; break; case 'ESP': $timezone = 'Europe/Madrid'; break; case 'PRT': $timezone = 'Europe/Lisbon'; break; case 'RUS': $timezone = 'Europe/Moscow'; break; case 'CAN': $timezone = 'America/Toronto'; break; case 'USA': $timezone = 'America/Chicago'; break; default: $timezone = $country->hydrate('timezones')->timezones->first()->zone_name; break; } return $timezone; } }