8

ユーザーが希望する言語に応じて、ロケールを動的に変更する必要があります。

次のように Application/Module.php でロケールを設定できます。

public function onBootstrap(MvcEvent $e)
{
    $translator = $e->getApplication()->getServiceManager()->get('translator');
    $translator->setLocale('hu_HU');
}

しかし、言語を変更したい場合、コントローラーでこれを行うにはどうすればよいですか? 私はこれを試しましたが、この後、この1つのリクエストに対してのみロケールを変更でき、グローバルではありません。

$translator = $this->getServiceLocator()->get('translator');
$translator->setLocale('srb_SRB');
4

5 に答える 5

2

構成レベルでデフォルトのロケールを設定してください! ZendSkeletonApplications アプリケーション モジュールの#61module.config.php参照してください。

'translator' => array(
    'locale' => 'en_US',
)
于 2013-04-11T10:59:05.510 に答える
1

同じ問題がありました。ユーザー ログイン モジュールで、ブートストラップの MvcEvent に登録しました。

use Zend\Mvc\MvcEvent;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\Session\SessionManager;
use Zend\Session\Container as SessionContainer;
use \Zend\I18n\Translator\TranslatorInterface;

... 

public function onBootstrap(MvcEvent $event)
{
    // Get event manager.
    $eventManager = $event->getApplication()->getEventManager();
    $sharedEventManager = $eventManager->getSharedManager();
    // Register the event listener method. 
    $sharedEventManager->attach(AbstractActionController::class, 
            MvcEvent::EVENT_DISPATCH, [$this, 'onDispatch'], 100);
}

次に、そのイベントが発生したら、URL からの情報に基づいてロケールを設定します。

public function onDispatch(MvcEvent $event)
{
    $servicemanager = $event->getApplication()->getServiceManager();
    $lang = $event->getRouteMatch()->getParam('lang','jp-JP');

    $translator = $servicemanager->get(TranslatorInterface::class);
    if( $translator != null )
    {
        $translator->setLocale($lang);
    } 
    ...

結局、これは実際にはロケールをグローバルにするわけではなく、すべてのリクエストに対してロケールを設定するだけです。コードの観点から見ると、最終的な効果は同じです。つまり、すべてのコントローラーでロケールを設定する必要はありません。

それが役立つことを願っています。

于 2017-05-19T01:34:34.287 に答える
0

これは私にとってはうまくいきます:

public function onBootstrap(MvcEvent $e)
{
    $localeFromHttp = \Locale::acceptFromHttp($_SERVER['HTTP_ACCEPT_LANGUAGE']);
            if (false === stripos($localeFromHttp, '-')) {
                $locale = $localeFromHttp . '_' . strtoupper($localeFromHttp);

                $e->getApplication()
                    ->getServiceManager()
                    ->get('MvcTranslator')
                    ->setLocale($locale);               
               }
               else {

                   $e->getApplication()->getServiceManager()->get('MvcTranslator')->setFallbackLocale('en_US');
               }

}

そして私の modal.config.php:

'service_manager' => array(
     'abstract_factories' => array(
         'Zend\Cache\Service\StorageCacheAbstractServiceFactory',
         'Zend\Log\LoggerAbstractServiceFactory',
     ),
     'aliases' => array(
         'translator' => 'MvcTranslator',
     ),
 ),
 'service_manager' => array(
     'factories' => array(
         'translator' => 'Zend\I18n\Translator\TranslatorServiceFactory',
     ),
 ),
 'translator' => array(
     'translation_file_patterns' => array(
         array(
             'type'     => 'gettext',
             'base_dir' => __DIR__ . '/../language',
             'pattern'  => '%s.mo',
             'text_domain' => __NAMESPACE__,
         ),
     ),
 ),
于 2015-04-05T16:10:22.933 に答える
0

modal.config ファイルでは、translator にエイリアス「MvcTranslator」を使用しているため、以下は必要ないと思います。

'service_manager' => array(
'factories' => array(
    'translator' => 'Zend\I18n\Translator\TranslatorServiceFactory',
),
于 2015-11-25T20:32:42.933 に答える