diff --git a/bower.json b/bower.json index 8c7ffdb..10794c7 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,7 @@ { "name": "alltube", "dependencies": { - "opensans-googlefont": "*" + "opensans-googlefont": "*", + "flag-icon-css": "~2.8.0" } } diff --git a/classes/Locale.php b/classes/Locale.php new file mode 100644 index 0000000..72e84e6 --- /dev/null +++ b/classes/Locale.php @@ -0,0 +1,92 @@ +language = $parse[1]['language']; + $this->region = $parse[1]['region']; + } + + /** + * Convert the locale to a string. + * + * @return string ISO 15897 code + */ + public function __toString() + { + return $this->getIso15897(); + } + + /** + * Get the full name of the locale. + * + * @param Locale $displayLocale Locale to get the name in + * + * @return string + */ + public function getFullName(Locale $displayLocale) + { + return \Locale::getDisplayName($this->getIso15897(), $displayLocale->getIso15897()); + } + + /** + * Get the ISO 15897 code. + * + * @return string + */ + public function getIso15897() + { + return $this->language.'_'.$this->region; + } + + /** + * Get the BCP 47 code. + * + * @return string + */ + public function getBcp47() + { + return $this->language.'-'.$this->region; + } + + /** + * Get the ISO 3166 code. + * + * @return string + */ + public function getIso3166() + { + return strtolower($this->region); + } +} diff --git a/classes/LocaleManager.php b/classes/LocaleManager.php index f581bc5..d031dcc 100644 --- a/classes/LocaleManager.php +++ b/classes/LocaleManager.php @@ -20,7 +20,7 @@ class LocaleManager /** * Current locale. * - * @var string + * @var Locale */ private $curLocale; @@ -34,19 +34,22 @@ class LocaleManager $session_factory = new \Aura\Session\SessionFactory(); $session = $session_factory->newInstance($cookies); $this->sessionSegment = $session->getSegment('Alltube\LocaleManager'); - $this->setLocale($this->sessionSegment->get('locale')); + $cookieLocale = $this->sessionSegment->get('locale'); + if (isset($cookieLocale)) { + $this->setLocale(new Locale($this->sessionSegment->get('locale'))); + } } /** * Get a list of supported locales. * - * @return array + * @return Locale[] */ public function getSupportedLocales() { $return = []; foreach ($this->supportedLocales as $supportedLocale) { - $return[$supportedLocale] = \Locale::getDisplayName($supportedLocale, $this->curLocale); + $return[] = new Locale($supportedLocale); } return $return; @@ -55,7 +58,7 @@ class LocaleManager /** * Get the current locale. * - * @return string + * @return Locale */ public function getLocale() { @@ -65,9 +68,9 @@ class LocaleManager /** * Set the current locale. * - * @param string $locale Locale code. + * @param Locale $locale Locale */ - public function setLocale($locale) + public function setLocale(Locale $locale) { putenv('LANG='.$locale); setlocale(LC_ALL, [$locale, $locale.'.utf8']); diff --git a/classes/LocaleMiddleware.php b/classes/LocaleMiddleware.php index 19593c5..42f3515 100644 --- a/classes/LocaleMiddleware.php +++ b/classes/LocaleMiddleware.php @@ -34,7 +34,7 @@ class LocaleMiddleware */ public function testLocale(array $proposedLocale) { - foreach ($this->locale->getSupportedLocales() as $locale => $name) { + foreach ($this->locale->getSupportedLocales() as $locale) { $parsedLocale = AcceptLanguage::parse($locale); if (isset($proposedLocale['language']) && $parsedLocale[1]['language'] == $proposedLocale['language'] @@ -59,9 +59,13 @@ class LocaleMiddleware $headers = $request->getHeader('Accept-Language'); $curLocale = $this->locale->getLocale(); if (!isset($curLocale)) { - $this->locale->setLocale( - AcceptLanguage::detect([$this, 'testLocale'], 'en_US', $headers[0]) - ); + if (isset($headers[0])) { + $this->locale->setLocale( + AcceptLanguage::detect([$this, 'testLocale'], 'en_US', $headers[0]) + ); + } else { + $this->locale->setLocale('en_US'); + } } return $next($request, $response); diff --git a/controllers/FrontController.php b/controllers/FrontController.php index 5a2aa16..fb5de9f 100644 --- a/controllers/FrontController.php +++ b/controllers/FrontController.php @@ -6,6 +6,7 @@ namespace Alltube\Controller; use Alltube\Config; +use Alltube\Locale; use Alltube\PasswordException; use Alltube\VideoDownload; use Psr\Container\ContainerInterface; @@ -126,7 +127,7 @@ class FrontController */ public function locale(Request $request, Response $response, array $data) { - $this->locale->setLocale($data['locale']); + $this->locale->setLocale(new Locale($data['locale'])); return $response->withRedirect($this->container->get('router')->pathFor('index')); } diff --git a/templates/inc/head.tpl b/templates/inc/head.tpl index 3fb8052..8c647d8 100644 --- a/templates/inc/head.tpl +++ b/templates/inc/head.tpl @@ -1,6 +1,6 @@ {locale path="../i18n" domain="Alltube"} - +
@@ -10,6 +10,7 @@ {/if} +