Php 什么';在我的ZF2系统中使用语言切换器的最佳选择是什么?

Php 什么';在我的ZF2系统中使用语言切换器的最佳选择是什么?,php,localization,zend-framework2,zend-translate,Php,Localization,Zend Framework2,Zend Translate,我为我的一个客户开发了小型ZF2条令系统。到目前为止一切都很好,但他们需要两种语言的系统 我可以从我的module/Application/config/module.config.php 'translator' => array( 'locale' => 'en_US', 'translation_file_patterns' => array( array( 'type' => 'gettext',

我为我的一个客户开发了小型ZF2条令系统。到目前为止一切都很好,但他们需要两种语言的系统

我可以从我的
module/Application/config/module.config.php

'translator' => array(
    'locale' => 'en_US',
    'translation_file_patterns' => array(
        array(
            'type'     => 'gettext',
            'base_dir' => __DIR__ . '/../language',
            'pattern'  => '%s.mo',
        ),
    ),
),
public function onBootstrap(MvcEvent $e)
{
    $application = $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('zh_CN')
        ;


}
我还可以使用此方法在
module.php

'translator' => array(
    'locale' => 'en_US',
    'translation_file_patterns' => array(
        array(
            'type'     => 'gettext',
            'base_dir' => __DIR__ . '/../language',
            'pattern'  => '%s.mo',
        ),
    ),
),
public function onBootstrap(MvcEvent $e)
{
    $application = $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('zh_CN')
        ;


}
这很好,现在我的系统显示默认语言为中文。但是,我想让用户选择

我该怎么做?

我找到了这个,但我没能让它工作

当我在
Application/IndexController.php
中添加以下函数时,它不会执行任何操作
http://myurl.com/changeLocal
抛出
404错误
。我是否也需要在
module.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 = $request->getPost()->language;
    $config = $this->serviceLocator->get('config');
    if (isset($config['locale']['available'][$language])) {
        $session->language = $language;
        $this->serviceLocator->get('translator')->setLocale($session->language);
    }
}

您需要一些方法来调用
changeLocaleAction
。连接到此控制器操作的路由确实是最简单的:

'language' => array(
    'type' => 'literal',
    'options' => array(
        'route' => '/language',
        'defaults' => array(
            'controller' => `Application\Controller\IndexController`,
            'action' => 'changeLocaleAction'
        )
    )
),
您需要在方法中捕获语言的post值:

$request->getPost('language');
或者在控制器中使用params插件:

$this->params()->fromPost('language');
因此,这建议用户发布一个带有
语言
字段的表单,该字段保存首选语言设置,例如
'zh_CN'
'en_US'

您可以简化客户端,因为您只有两种语言选项。您只需使用一个按钮切换语言并发布其他值:


因此,如果当前的语言是
'en_US'
您可以发布
'zh_CN'
,反之亦然。

您需要一些方法来调用
ChangeLocalAction
。连接到此控制器操作的路由确实是最简单的:

'language' => array(
    'type' => 'literal',
    'options' => array(
        'route' => '/language',
        'defaults' => array(
            'controller' => `Application\Controller\IndexController`,
            'action' => 'changeLocaleAction'
        )
    )
),
您需要在方法中捕获语言的post值:

$request->getPost('language');
或者在控制器中使用params插件:

$this->params()->fromPost('language');
因此,这建议用户发布一个带有
语言
字段的表单,该字段保存首选语言设置,例如
'zh_CN'
'en_US'

您可以简化客户端,因为您只有两种语言选项。您只需使用一个按钮切换语言并发布其他值:


因此,如果目前的语言是“en_US”你发布了
'zh_CN'
,反之亦然。

经过长期的战斗,我是如何做到这一点的。特别感谢和@Wilt让我走上了正确的方向(我已经投票支持了他们)

Application/config/module.config.php

return array(
    'controllers' => array(
        'invokables' => array(
            'Application\Controller\Index' => 'Application\Controller\IndexController'
        ),
    ),
    'router' => array(
        'routes' => array(
            'home' => array(
                'type' => 'Zend\Mvc\Router\Http\Literal',
                'options' => array(
                    'route'    => '/',
                    'defaults' => array(
                        'controller' => 'Application\Controller\Index',
                        'action'     => 'index',
                    ),
                ),
            ),

            'language' => array(
                'type' => 'Segment',
                'options' => array(
                    //'route' => '/[:language]',
                    'route' => '/en',
                    'constraints' => array(
                        'language' => 'en',
                    ),
                    'defaults' => array(
                        'controller' => 'Application\Controller\Index',
                        'action' => 'changeLocaleEnglish'
                    )
                )
            ),
            'languageChinese' => array(
                'type' => 'Segment',
                'options' => array(
                    //'route' => '/[:language]',
                    'route' => '/cn',
                    'constraints' => array(
                        'language' => 'cn',
                    ),
                    'defaults' => array(
                        'controller' => 'Application\Controller\Index',
                        'action' => 'changeLocaleChinese'
                    )
                )
            ),
            ////
            // other stuff
            //////////// like child routes etc
        ),
    ),
    'service_manager' => array(
        'abstract_factories' => array(
            'Zend\Cache\Service\StorageCacheAbstractServiceFactory',
            'Zend\Log\LoggerAbstractServiceFactory',
        ),
        'factories' => array(
            'translator' => 'Zend\Mvc\Service\TranslatorServiceFactory',
        ),
    ),

    'translator' => array(
        'locale' => 'zh_CN', //default is english which is set in module.php
        'translation_file_patterns' => array(
            array(
                'type'     => 'gettext',
                'base_dir' => __DIR__ . '/../language',
                'pattern'  => '%s.mo',
            ),
        ),
    ),

    'view_helpers' => array(
        'invokables'=> array(
            'PaginationHelper' => 'Application\View\Helper\PaginationHelper'
        )
    ),

    'view_manager' => array(
        //....... view stuff
    ),
    // Placeholder for console routes
    'console' => array(
        'router' => array(
            'routes' => array(
            ),
        ),
    ),
);
public function onBootstrap(MvcEvent $e)
{
    $application = $e->getApplication();
    $serviceManager = $application->getServiceManager();
    // Just a call to the translator, nothing special!
    $serviceManager->get('translator');
    $this->initTranslator($e);
}

protected function initTranslator(MvcEvent $event)
{
    $serviceManager = $event->getApplication()->getServiceManager();

    // use Zend\Session\Container add this to top
    $session = New Container('language');

    $translator = $serviceManager->get('translator');
    if($session['language'] != 'zh_CN'){ //if session doesn't have zh_CN then set it as english
    $translator
        ->setLocale($session->language)
        ->setFallbackLocale('en_US')
        ;
    }
}
Application/module.php

return array(
    'controllers' => array(
        'invokables' => array(
            'Application\Controller\Index' => 'Application\Controller\IndexController'
        ),
    ),
    'router' => array(
        'routes' => array(
            'home' => array(
                'type' => 'Zend\Mvc\Router\Http\Literal',
                'options' => array(
                    'route'    => '/',
                    'defaults' => array(
                        'controller' => 'Application\Controller\Index',
                        'action'     => 'index',
                    ),
                ),
            ),

            'language' => array(
                'type' => 'Segment',
                'options' => array(
                    //'route' => '/[:language]',
                    'route' => '/en',
                    'constraints' => array(
                        'language' => 'en',
                    ),
                    'defaults' => array(
                        'controller' => 'Application\Controller\Index',
                        'action' => 'changeLocaleEnglish'
                    )
                )
            ),
            'languageChinese' => array(
                'type' => 'Segment',
                'options' => array(
                    //'route' => '/[:language]',
                    'route' => '/cn',
                    'constraints' => array(
                        'language' => 'cn',
                    ),
                    'defaults' => array(
                        'controller' => 'Application\Controller\Index',
                        'action' => 'changeLocaleChinese'
                    )
                )
            ),
            ////
            // other stuff
            //////////// like child routes etc
        ),
    ),
    'service_manager' => array(
        'abstract_factories' => array(
            'Zend\Cache\Service\StorageCacheAbstractServiceFactory',
            'Zend\Log\LoggerAbstractServiceFactory',
        ),
        'factories' => array(
            'translator' => 'Zend\Mvc\Service\TranslatorServiceFactory',
        ),
    ),

    'translator' => array(
        'locale' => 'zh_CN', //default is english which is set in module.php
        'translation_file_patterns' => array(
            array(
                'type'     => 'gettext',
                'base_dir' => __DIR__ . '/../language',
                'pattern'  => '%s.mo',
            ),
        ),
    ),

    'view_helpers' => array(
        'invokables'=> array(
            'PaginationHelper' => 'Application\View\Helper\PaginationHelper'
        )
    ),

    'view_manager' => array(
        //....... view stuff
    ),
    // Placeholder for console routes
    'console' => array(
        'router' => array(
            'routes' => array(
            ),
        ),
    ),
);
public function onBootstrap(MvcEvent $e)
{
    $application = $e->getApplication();
    $serviceManager = $application->getServiceManager();
    // Just a call to the translator, nothing special!
    $serviceManager->get('translator');
    $this->initTranslator($e);
}

protected function initTranslator(MvcEvent $event)
{
    $serviceManager = $event->getApplication()->getServiceManager();

    // use Zend\Session\Container add this to top
    $session = New Container('language');

    $translator = $serviceManager->get('translator');
    if($session['language'] != 'zh_CN'){ //if session doesn't have zh_CN then set it as english
    $translator
        ->setLocale($session->language)
        ->setFallbackLocale('en_US')
        ;
    }
}
现在在Application/src/Application/Controller/IndexController.php中,我添加了两个操作来捕获会话并设置语言:

public function changeLocaleChineseAction() 
    {
        $result = new ViewModel();
        $result->setTerminal(true);
        $response = $this->getResponse();


        // New Container will get he Language Session if the SessionManager already knows the language session.
        $session = new Container('language');
        $request = $this->getRequest();
        $config = $this->serviceLocator->get('config');

        $language = $config['translator']['locale']; //default locale from Application/config/module.config.php
        if (isset($config['translator']['locale'])) {
            $session->language = $language;
            $this->serviceLocator->get('translator')->setLocale('zh_CN')
                ->setFallbackLocale('zh_CN')
                ;

        }

        return $this->redirect()->toRoute('home'); 

    }

    public function changeLocaleEnglishAction() 
    {
        // New Container will get he Language Session if the SessionManager already knows the language session.
        $session = new Container('language');

        //just clear the language session
        $session->getManager()->getStorage()->clear('language');
        $language = 'en_US'; //set new language
        $request = $this->getRequest();
        $config = $this->serviceLocator->get('config');
        $session->language = $language;
        $this->serviceLocator->get('translator')->setLocale('en_US')
            ->setFallbackLocale('en_US')
            ;
        return $this->redirect()->toRoute('home');

    }
现在只需在
layout.phtml
中添加链接,即可使用语言切换器:

<a href="<?php echo $this->url('home')."cn";?>"><?php echo $this->translate("Chinese");?></a>
<a href="<?php echo $this->url('home')."en";?>"><?php echo $this->translate("English");?></a>


希望这对以后的人有帮助。

经过漫长的战斗,我是如何做到这一点的。特别感谢和@Wilt让我走上了正确的方向(我已经投票支持了他们)

Application/config/module.config.php

return array(
    'controllers' => array(
        'invokables' => array(
            'Application\Controller\Index' => 'Application\Controller\IndexController'
        ),
    ),
    'router' => array(
        'routes' => array(
            'home' => array(
                'type' => 'Zend\Mvc\Router\Http\Literal',
                'options' => array(
                    'route'    => '/',
                    'defaults' => array(
                        'controller' => 'Application\Controller\Index',
                        'action'     => 'index',
                    ),
                ),
            ),

            'language' => array(
                'type' => 'Segment',
                'options' => array(
                    //'route' => '/[:language]',
                    'route' => '/en',
                    'constraints' => array(
                        'language' => 'en',
                    ),
                    'defaults' => array(
                        'controller' => 'Application\Controller\Index',
                        'action' => 'changeLocaleEnglish'
                    )
                )
            ),
            'languageChinese' => array(
                'type' => 'Segment',
                'options' => array(
                    //'route' => '/[:language]',
                    'route' => '/cn',
                    'constraints' => array(
                        'language' => 'cn',
                    ),
                    'defaults' => array(
                        'controller' => 'Application\Controller\Index',
                        'action' => 'changeLocaleChinese'
                    )
                )
            ),
            ////
            // other stuff
            //////////// like child routes etc
        ),
    ),
    'service_manager' => array(
        'abstract_factories' => array(
            'Zend\Cache\Service\StorageCacheAbstractServiceFactory',
            'Zend\Log\LoggerAbstractServiceFactory',
        ),
        'factories' => array(
            'translator' => 'Zend\Mvc\Service\TranslatorServiceFactory',
        ),
    ),

    'translator' => array(
        'locale' => 'zh_CN', //default is english which is set in module.php
        'translation_file_patterns' => array(
            array(
                'type'     => 'gettext',
                'base_dir' => __DIR__ . '/../language',
                'pattern'  => '%s.mo',
            ),
        ),
    ),

    'view_helpers' => array(
        'invokables'=> array(
            'PaginationHelper' => 'Application\View\Helper\PaginationHelper'
        )
    ),

    'view_manager' => array(
        //....... view stuff
    ),
    // Placeholder for console routes
    'console' => array(
        'router' => array(
            'routes' => array(
            ),
        ),
    ),
);
public function onBootstrap(MvcEvent $e)
{
    $application = $e->getApplication();
    $serviceManager = $application->getServiceManager();
    // Just a call to the translator, nothing special!
    $serviceManager->get('translator');
    $this->initTranslator($e);
}

protected function initTranslator(MvcEvent $event)
{
    $serviceManager = $event->getApplication()->getServiceManager();

    // use Zend\Session\Container add this to top
    $session = New Container('language');

    $translator = $serviceManager->get('translator');
    if($session['language'] != 'zh_CN'){ //if session doesn't have zh_CN then set it as english
    $translator
        ->setLocale($session->language)
        ->setFallbackLocale('en_US')
        ;
    }
}
Application/module.php

return array(
    'controllers' => array(
        'invokables' => array(
            'Application\Controller\Index' => 'Application\Controller\IndexController'
        ),
    ),
    'router' => array(
        'routes' => array(
            'home' => array(
                'type' => 'Zend\Mvc\Router\Http\Literal',
                'options' => array(
                    'route'    => '/',
                    'defaults' => array(
                        'controller' => 'Application\Controller\Index',
                        'action'     => 'index',
                    ),
                ),
            ),

            'language' => array(
                'type' => 'Segment',
                'options' => array(
                    //'route' => '/[:language]',
                    'route' => '/en',
                    'constraints' => array(
                        'language' => 'en',
                    ),
                    'defaults' => array(
                        'controller' => 'Application\Controller\Index',
                        'action' => 'changeLocaleEnglish'
                    )
                )
            ),
            'languageChinese' => array(
                'type' => 'Segment',
                'options' => array(
                    //'route' => '/[:language]',
                    'route' => '/cn',
                    'constraints' => array(
                        'language' => 'cn',
                    ),
                    'defaults' => array(
                        'controller' => 'Application\Controller\Index',
                        'action' => 'changeLocaleChinese'
                    )
                )
            ),
            ////
            // other stuff
            //////////// like child routes etc
        ),
    ),
    'service_manager' => array(
        'abstract_factories' => array(
            'Zend\Cache\Service\StorageCacheAbstractServiceFactory',
            'Zend\Log\LoggerAbstractServiceFactory',
        ),
        'factories' => array(
            'translator' => 'Zend\Mvc\Service\TranslatorServiceFactory',
        ),
    ),

    'translator' => array(
        'locale' => 'zh_CN', //default is english which is set in module.php
        'translation_file_patterns' => array(
            array(
                'type'     => 'gettext',
                'base_dir' => __DIR__ . '/../language',
                'pattern'  => '%s.mo',
            ),
        ),
    ),

    'view_helpers' => array(
        'invokables'=> array(
            'PaginationHelper' => 'Application\View\Helper\PaginationHelper'
        )
    ),

    'view_manager' => array(
        //....... view stuff
    ),
    // Placeholder for console routes
    'console' => array(
        'router' => array(
            'routes' => array(
            ),
        ),
    ),
);
public function onBootstrap(MvcEvent $e)
{
    $application = $e->getApplication();
    $serviceManager = $application->getServiceManager();
    // Just a call to the translator, nothing special!
    $serviceManager->get('translator');
    $this->initTranslator($e);
}

protected function initTranslator(MvcEvent $event)
{
    $serviceManager = $event->getApplication()->getServiceManager();

    // use Zend\Session\Container add this to top
    $session = New Container('language');

    $translator = $serviceManager->get('translator');
    if($session['language'] != 'zh_CN'){ //if session doesn't have zh_CN then set it as english
    $translator
        ->setLocale($session->language)
        ->setFallbackLocale('en_US')
        ;
    }
}
现在在Application/src/Application/Controller/IndexController.php中,我添加了两个操作来捕获会话并设置语言:

public function changeLocaleChineseAction() 
    {
        $result = new ViewModel();
        $result->setTerminal(true);
        $response = $this->getResponse();


        // New Container will get he Language Session if the SessionManager already knows the language session.
        $session = new Container('language');
        $request = $this->getRequest();
        $config = $this->serviceLocator->get('config');

        $language = $config['translator']['locale']; //default locale from Application/config/module.config.php
        if (isset($config['translator']['locale'])) {
            $session->language = $language;
            $this->serviceLocator->get('translator')->setLocale('zh_CN')
                ->setFallbackLocale('zh_CN')
                ;

        }

        return $this->redirect()->toRoute('home'); 

    }

    public function changeLocaleEnglishAction() 
    {
        // New Container will get he Language Session if the SessionManager already knows the language session.
        $session = new Container('language');

        //just clear the language session
        $session->getManager()->getStorage()->clear('language');
        $language = 'en_US'; //set new language
        $request = $this->getRequest();
        $config = $this->serviceLocator->get('config');
        $session->language = $language;
        $this->serviceLocator->get('translator')->setLocale('en_US')
            ->setFallbackLocale('en_US')
            ;
        return $this->redirect()->toRoute('home');

    }
现在只需在
layout.phtml
中添加链接,即可使用语言切换器:

<a href="<?php echo $this->url('home')."cn";?>"><?php echo $this->translate("Chinese");?></a>
<a href="<?php echo $this->url('home')."en";?>"><?php echo $this->translate("English");?></a>


希望这对以后的其他人有所帮助。

$request->getPost()->language
返回
NULL
。无论用户输入什么,我都乐意以中文或英文发布或查看数据。我唯一关心的是有一个语言切换器,在这个切换器中,我的
$this->translate('My name')
会相应地用用户选择的语言进行翻译。@AdarshKhatri例如,您可以为它制作一个语言视图帮助程序。。。您是否从您的客户那里发布了一个名为
language
的字段?尝试
$this->getRequest()->getPost('language')
我已经能够更改
www.domain/language
的语言,但它不会保存到会话,当我转到任何其他URL时,语言会返回到另一个URL。
$session=new Container('language')$request=$this->getRequest()$config=$this->serviceLocator->get('config')$语言=$config['translator']['locale'];if(isset($config['translator']['locale']){$session->language=$language;$this->serviceLocator->get('translator')->setLocale('en_-US')->setFallbackLocale('en_-US');}返回true
$request->getPost()->language
返回
NULL
。无论用户输入什么,我都乐意以中文或英文发布或查看数据。我唯一关心的是有一个语言切换器,在这个切换器中,我的
$this->translate('My name')
会相应地用用户选择的语言进行翻译。@AdarshKhatri例如,您可以为它制作一个语言视图帮助程序。。。您是否从您的客户那里发布了一个名为
language
的字段?尝试
$this->getRequest()->getPost('language')
我已经能够更改
www.domain/language
的语言,但它不会保存到会话,当我转到任何其他URL时,语言会返回到另一个URL。
$session=new Container('language')$request=$this->getRequest()$config=$this->serviceLocator->get('config')$语言=$config['translator']['locale'];if(isset($config['translator']['locale']){$session->language=$language;$this->serviceLocator->get('translator')->setLocale('en_-US')->setFallbackLocale('en_-US');}返回true干杯。很乐意帮忙。干杯。很乐意帮忙。