Я разрабатываю приложение Zend Framework 2, и теперь я хочу реализовать языковой коммутатор, из которого пользователь / пользователь может выбрать язык, который им нужен, но я не могу понять, как это делается в Zend Framework 2 с использованием хранилища ( а не из URL-адресов), я хочу сохранить предпочитаемый язык гостя в хранилище, как только он его выберет, а для зарегистрированных пользователей я могу получить выбранный файл cookie / database и повторно использовать его с хранилищем. Но где и как мне это начать? Заранее спасибо.
Настройте свои Locales
в global.config.php
:
'locale' => array( 'default' => 'en_US', 'available' => array( 'de_DE' => 'Deutsch', 'nl_NL' => 'Dutch', 'en_US' => 'English', 'fr_FR' => 'French', ), ),
Таким образом, в вашем Application\Module.php
вы можете добавить метод, который устанавливает по умолчанию Zend\Translator\Translator
:
class Module { public function onBootstrap(MvcEvent $e) { $applicaton = $e->getApplication(); $serviceManager = $application->getServiceManager(); // Just a call to the translator, nothing special! $serviceManager->get('translator'); $this->initTranslator($e); // Etc, more of your bootstrap function. } protected function initTranslator(MvcEvent $event) { $serviceManager = $event->getApplication()->getServiceManager(); // Zend\Session\Container $session = New Container('language'); $translator = $serviceManager->get('translator'); $translator ->setLocale($session->language) ->setFallbackLocale('en_US'); } }
Итак, теперь по умолчанию Locale является en_US, поскольку в сеансе не существует Locale. Для изменения языка вам нужно поймать пользователей и проверить доступные локали, которые вы поддерживаете, предоставленные в global.config.php
. Поэтому, чтобы изменить его, вам может потребоваться добавить действие контроллера, которое ловит вход пользователя и устанавливает новый языковой стандарт. Пример действия контроллера без использования формы!
public function changeLocaleAction() { // New Container will get he Language Session if the SessionManager already knows the language session. $session = new Container('language'); $language = $this->getRequest()->getPost()->language; $config = $this->serviceLocator->get('config'); if (isset($config['locale']['available'][$language]) { $session->language = $language; $this->serviceLocator->get('translator')->setLocale($session->language); } }
Сеанс позволяет пользователям изменять свой язык и запоминать его до окончания сеанса, поэтому им не нужно будет менять его, когда они вернутся через некоторое время. Надеюсь, это поможет вам и поможет вам написать код, чтобы сохранить его для зарегистрированных пользователей в вашем приложении.
Я не уверен, мой подход будет работать или нет. Пожалуйста попробуйте:
Мы можем иметь 3 параметра для translate
метода.
$translator->translate($message, $textDomain, $locale);
Параметр $ locale берется из языкового стандарта, установленного в переводчике, и поэтому мы обычно не устанавливаем вручную в коде. Таким образом, вы можете использовать, как показано ниже:
$localeVar = 'de_DE'; OR $localeVar = 'en_US'; // according to user's selection echo $this->translate("Translate me", $textDomain, $localeVar);
У вас может быть пара ключей значений – ключ может быть выбран пользователем, а значение может быть любым из языков.
array( 'english' => 'en_US', 'deutch' => 'de_DE', 'frecnh' => 'fr_FR', // other language );