<?php
/**
* Pimcore
*
* This source file is available under two different licenses:
* - GNU General Public License version 3 (GPLv3)
* - Pimcore Commercial License (PCL)
* Full copyright and license information is available in
* LICENSE.md which is distributed with this source code.
*
* @copyright Copyright (c) Pimcore GmbH (http://www.pimcore.org)
* @license http://www.pimcore.org/license GPLv3 and PCL
*/
namespace Pimcore\Localization;
use Pimcore\Translation\Translator;
use Symfony\Component\HttpFoundation\RequestStack;
class LocaleService implements LocaleServiceInterface
{
/**
* @var string
*/
protected $locale;
/**
* @var null|RequestStack
*/
protected $requestStack;
/**
* @var Translator|null
*/
protected $translator;
/**
* @param RequestStack|null $requestStack
* @param Translator|null $translator
*/
public function __construct(RequestStack $requestStack = null, Translator $translator = null)
{
$this->requestStack = $requestStack;
$this->translator = $translator;
}
/**
* @param string $locale
*
* @return bool
*/
public function isLocale($locale)
{
$locales = array_flip($this->getLocaleList());
$exists = isset($locales[$locale]);
return $exists;
}
/**
* @return string
*/
public function findLocale()
{
if ($requestLocale = $this->getLocaleFromRequest()) {
return $requestLocale;
}
$defaultLocale = \Pimcore\Tool::getDefaultLanguage();
if ($defaultLocale) {
return $defaultLocale;
}
return '';
}
/**
* @return null|string
*/
protected function getLocaleFromRequest()
{
if ($this->requestStack) {
$masterRequest = $this->requestStack->getMainRequest();
if ($masterRequest) {
return $masterRequest->getLocale();
}
}
return null;
}
/**
* @return array
*/
public function getLocaleList()
{
$locales = \ResourceBundle::getLocales(null);
return $locales;
}
/**
* @param string|null $locale
*
* @return array
*/
public function getDisplayRegions($locale = null)
{
if (!$locale) {
$locale = $this->findLocale();
}
$dataPath = PIMCORE_COMPOSER_PATH . '/umpirsky/country-list/data/';
if (file_exists($dataPath . $locale . '/country.php')) {
$regions = include($dataPath . $locale . '/country.php');
} else {
$regions = include($dataPath . 'en/country.php');
}
return $regions;
}
/**
* @return string|null
*/
public function getLocale()
{
if (null === $this->locale) {
$this->locale = $this->getLocaleFromRequest();
}
return $this->locale;
}
/**
* @param string|null $locale
*/
public function setLocale($locale)
{
$this->locale = $locale;
if ($locale && is_string($locale)) {
if ($this->requestStack) {
$masterRequest = $this->requestStack->getMainRequest();
if ($masterRequest) {
$masterRequest->setLocale($locale);
}
$currentRequest = $this->requestStack->getCurrentRequest();
if ($currentRequest) {
$currentRequest->setLocale($locale);
}
}
if ($this->translator) {
$this->translator->setLocale($locale);
}
}
}
/**
* @return bool
*/
public function hasLocale()
{
return $this->getLocale() !== null;
}
}