Php Zend framework 2-如何制作语言切换器

Php Zend framework 2-如何制作语言切换器,php,zend-framework2,translation,Php,Zend Framework2,Translation,我正在开发一个Zend Framework 2应用程序,现在我想实现一个语言切换器,来宾/注册用户可以从中选择他们想要的语言,但我不明白的是,Zend Framework 2是如何使用存储(而不是URL)来实现的,我希望在guest选择一种语言后,将其保留在存储中,对于注册用户,我可以从cookie/数据库中检索首选语言,并将其与存储一起重用。但我应该从何处开始/如何实施? 提前谢谢。我不确定,我的方法是否有效。请尝试: 对于translate方法,我们可以有3个参数 $translator-&

我正在开发一个Zend Framework 2应用程序,现在我想实现一个语言切换器,来宾/注册用户可以从中选择他们想要的语言,但我不明白的是,Zend Framework 2是如何使用存储(而不是URL)来实现的,我希望在guest选择一种语言后,将其保留在存储中,对于注册用户,我可以从cookie/数据库中检索首选语言,并将其与存储一起重用。但我应该从何处开始/如何实施?
提前谢谢。

我不确定,我的方法是否有效。请尝试:

对于
translate
方法,我们可以有3个参数

$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
);

global.config.php
中设置您的
locale

'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');
    }
}
因此,由于会话没有可用的区域设置,现在默认的区域设置是en_US。要更改区域设置,您需要捕获用户输入并验证您支持的可用区域设置,这在
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);
    }
}

会话允许用户更改他们的区域设置,并在会话结束前记住它,因此他们在一段时间后返回时不需要更改它。希望这将对您有所帮助,并能帮助您编写一些代码,以便在应用程序上为注册用户保存这些代码。

非常好的解释和解决方案。现在我明白了如何使用翻译,我想这会更复杂,或者你只是解释得很好。非常感谢。我完全按照你解释的那样做了,但不起作用。您是否也可以添加module.config.php文件。@AdarshKhatri,因为您不清楚在哪个步骤中?
module.config.php
不应该引起任何关注。请注意,代码中有一些拼写错误,所以不要盲目地复制粘贴它,并认为它可能适合您。也许您可以添加一些关于哪些不适合您的信息。首先,我在zend skeleton中默认没有
global.config.php
,所以我创建了一个新文件。我在这里有点迷茫。我是Zend的学习者,不想改变地点。@Kwido非常感谢你,伙计。我欠你一杯啤酒。不过,我已经在这里发布了我的答案,以了解更多细节。谢谢你的回答,工藤提供的解决方案对我来说很有效,我也能理解。