0

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

我在我的 \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)在所有视图文件中都将使用新的语言环境而不是配置文件中使用的默认语言环境?

4

1 回答 1

0

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

看看SlmLocale,这个特定的文件就是它完成的地方。


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

如果您查看zend-mvc-i18n 中的 ConfigProvider 文件,您可以看到这里使用了别名和工厂来创建 MVC 转换器。然后你可以看到有问题的工厂是如何工作的,它基本上创建了一个装饰翻译器,如文档中所述

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

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

我们的翻译器基本上由文档中的翻译器组成,在其setLocale上调用了。为此,我们可以使用委托人

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;
    }
}

那将是一种方法(您在该工厂中获得容器,因此您可能会获得一些用户数据)。


另一种解决方案是使用事件系统,并且仅在您检索用户详细信息的事件侦听器中声明语言环境。

于 2017-03-02T21:41:53.493 回答