2014-12-23 5 views
1

Я создаю сайт администратора i18n с пакетом админов сонаты. Теперь я хочу изменить свой язык и перевод с помощью набора локали администратора. Например, у меня есть два администратора, один из которых - en (userA), а другой - zh (UserB). локаль пользователя устанавливается ан/гк в пользователя админ панели управления соответственноИзменение локали администратора сонаты с администратором Локаль пользователя

Мой администратор службы:.

services: 
    sonata.admin.post: 
     class: Acme\StoreBundle\Admin\PostAdmin 
     tags: 
      - { name: sonata.admin, manager_type: orm, group: "Content", label: "Project", label_translator_strategy: sonata.admin.label.strategy.underscore } 
     arguments: 
      - ~ 
      - Acme\StoreBundle\Entity\Product 
      - ~ 
     calls: 
      - [ setTranslationDomain, [AcmeStoreBundle]] 
      - [ setLabelTranslatorStrategy, [ @sonata.admin.label.strategy.native ]] 

Тогда мои ресурсы/переводы/AcmeStoreBundle.en.xliff и ресурсы/переводы/AcmeStoreBundle.zh.xliff просто например:

<?xml version="1.0"?> 
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2"> 
    <file source-language="en" datatype="plaintext" original="file.ext"> 
     <body> 
      <trans-unit id="1"> 
       <source>label.product.name</source> 
       <target>Product Name</target> ##---> zh is diffrent here!!! 
      </trans-unit> 
     </body> 
    </file> 
</xliff> 

Затем, я loggin admin от UserA, сообщение (название продукта) в порядке. Но я loggin UserB это сообщение по-прежнему en locale (название продукта). Конечно, я могу изменить глобальную локаль в параметрах.yml (% locale%) для userB, но это не хорошо для userA.

Итак, как я могу изменить языковой стандарт моего сайта (сообщение или перевод) с помощью пользовательской локализации пользователя? Спасибо заранее.

+0

Где вы храните локал пользователя в базе? –

+0

Извините, не забывайте об этом. Я использовал сонату [user bundle] (http://sonata-project.org/bundles/user/2-2/doc/index.html), чтобы добавить моего администратора сайта, а затем изменить профиль пользователя (локаль) в панели управления пользователя sonata admin. И я также вижу, что результат изменения в таблице базы данных (fos_user_user) в порядке. – pysome

ответ

0

Вы можете расширить обработчик успеха входа и установить локаль пользователя в сеансе. Например:

# app/config/config.yml 
services: 
    login_success_handler: 
     parent: security.authentication.success_handler 
     class: MyVendor\MyBundle\LoginSuccessHandler 

UPDATE: Убедитесь, чтобы указать для этого приемника в вашем security.yml:

# app/config/security.yml 
security: 
    firewalls: 
     secured_area: 
      pattern: ^/ 
      anonymous: ~ 
      form_login: 
       login_path: login 
       check_path: login_check 
       success_handler: login_success_handler 

Затем добавить Войти класс обработчик успеха:

class LoginSuccessHandler extends DefaultAuthenticationSuccessHandler 
{ 
    public function onAuthenticationSuccess(Request $request, TokenInterface $token) 
    { 
     $locale = $token->getUser()->getLocale() 

     $request->getSession()->set('_locale', $locale); 
     $request->setLocale($locale); 

     return parent::onAuthenticationSuccess($request, $token); 
    } 
} 

Тогда вам может create a LocaleListener аналогичен или точно такой же, как в документации Symfony. Единственное отличие в том, если вы никогда не будете определять _locale в маршрутах можно изменить:

if ($locale = $request->attributes->get('_locale')) { 
    $request->getSession()->set('_locale', $locale); 
} else { 
    $request->setLocale($request->getSession()->get('_locale', $this->defaultLocale)); 
} 

просто

$request->setLocale($request->getSession()->get('_locale', $this->defaultLocale)); 
+0

Это нормально. Большое спасибо. Кстати, метод onAuthenticationSuccess должен вернуть ответ.Поэтому я добавляю 'return parent :: onAuthenticationSuccess ($ request, $ token);' в последней строке метода; – pysome

+0

О да, извините, я как бы конденсировал только соответствующие части кода, но имеет смысл показать это. Это точная строка, которую вы хотели бы вернуть, и я отредактировал свое сообщение, чтобы скрыть это. –

0

Спасибо Джейсона. Я сделал это в качестве hint.But, то login_success_handler кажется не назовешь полностью

мой config.yml:.

services: 
    login_success_handler: 
     parent: security.authentication.success_handler 
     class: Acme\StoreBundle\EventListener\LoginSuccessHandler 

    acme_locale.locale_listener: 
     class: Acme\StoreBundle\EventListener\LocaleListener 
     arguments: ["%kernel.default_locale%"] 
     tags: 
      - { name: kernel.event_subscriber } 

И SRC/Acme/StoreBundle/EventListener/LoginSuccessHandler.php

namespace Acme\StoreBundle\EventListener; 
use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; 

class LoginSuccessHandler extends DefaultAuthenticationSuccessHandler 
{ 
    public function onAuthenticationSuccess(Request $request, TokenInterface $token) 
    { 
     $locale = $token->getUser()->getLocale(); 
     file_put_contents('/tmp/login.log', $locale, FILE_APPEND); ## I can't find the log file 
     $request->getSession()->set('_locale', $locale); 
     $request->setLocale($locale); 
    } 
} 

И ЦСИ/Acme/StoreBundle/EventListener/LocaleListener.php

namespace Acme\StoreBundle\EventListener; 

use Symfony\Component\HttpKernel\Event\GetResponseEvent; 
use Symfony\Component\HttpKernel\KernelEvents; 
use Symfony\Component\EventDispatcher\EventSubscriberInterface; 

class LocaleListener implements EventSubscriberInterface 
{ 
    private $defaultLocale; 

    public function __construct($defaultLocale = 'en') 
    { 
     $this->defaultLocale = $defaultLocale; 
    } 

    public function onKernelRequest(GetResponseEvent $event) 
    { 
     $request = $event->getRequest(); 
     if (!$request->hasPreviousSession()) { 
      return; 
     } 
     $request->setLocale($request->getSession()->get('_locale', $this->defaultLocale)); 
    } 

    public static function getSubscribedEvents() 
    { 
     return array(
      // must be registered before the default Locale listener 
      KernelEvents::REQUEST => array(array('onKernelRequest', 17)), 
     ); 
    } 
} 

Что со мной не так? Благодарю.

+0

К сожалению, я забыл упомянуть, что вы должны добавить к своему новому обработчику успеха файл security.yml. Я обновил свой пост, чтобы включить эту информацию. –

Смежные вопросы