zf3根据用户选择更改区域设置

时间:2017-03-02 19:05:25

标签: php zend-framework translation setlocale zf3

我有使用po文件的工作翻译的Zend Framework 3应用程序。

我在\ config \ global.php文件中配置了这个:

'translator' => [
    'locale' => 'en_US',
    'translation_file_patterns' => [
        [
            'type'     => 'gettext',
            'base_dir' => getcwd() .  '/data/language/',
            'pattern'  => '/%s/general.mo',
        ],
    ],
],

当我更改"区域设置"的值时它工作正常,找到正确的.po文件。 我需要能够根据用户配置文件保存在数据库中的值来设置区域设置。

我已经从这里检查了文档http://zendframework.github.io/zend-i18n/translation/和这里的教程https://docs.zendframework.com/tutorials/i18n/,但他们只是提到了setLocale()方法而没有任何解释或示例。这里有类似的帖子Zend framework 2 : How to set locale globaly?但它适用于ZF2,它并没有为一些建议提供工作解决方案。

总结我的问题 - 我应该如何以及在何处使用setLocale()方法,以便它在整个应用程序中有效,并且$this->translate($message)在所有视图文件中将使用新的语言环境而不是默认的语言环境。配置文件?

1 个答案:

答案 0 :(得分:0)

您只需要设置PHP语言环境。为此,请使用\Locale::setDefault('en-GB');

看看SlmLocale,这个特定的文件已经完成了。

虽然这是最简单的方法,但我猜你也可以在MvcTranslator上使用setLocale函数。为此,您需要使用自己的工厂覆盖现有工厂,从而装饰原始工厂。

如果查看ConfigProvider file in zend-mvc-i18n,可以看到此处使用别名和工厂来创建MVC转换器。然后你可以看到有问题的工厂如何工作,它基本上创建了一个装饰翻译器,stated in the doc

默认情况下,服务管理器始终提供相同的实例(共享服务),就像单例一样。

我们将做的是覆盖此配置(即确保您自己的模块位于Zend\Mvc\I18n中的modules.config.php之后)。然后,在模块配置中,我们可以提供自己的翻译器。

我们的翻译基本上由文档中的翻译者组成,setLocale被称为翻译者。为此,我们可以使用delegator

return [
    'factories' => [
        TranslatorInterface::class => TranslatorServiceFactory::class,
    ],
    'delegators' => [
        TranslatorInterface::class => [
            \Application\Factory\TranslatorFactory::class,
        ],
    ],
];

然后是TranslatorFactory

use Interop\Container\ContainerInterface;
use Zend\ServiceManager\Factory\DelegatorFactoryInterface;

class TranslatorFactory implements DelegatorFactoryInterface
{
    public function __invoke(ContainerInterface $container, $name, callable $callback, array $options = null)
    {
        $translator = call_user_func($callback);
        $translator->setLocale('en-GB');
        return $translator;
    }
}

这将是一种方法(你在那个工厂得到容器,所以你可能得到一些用户数据)。

另一种解决方案是使用事件系统,并仅在事件侦听器中声明区域设置,以便检索用户详细信息。