我有使用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)
在所有视图文件中将使用新的语言环境而不是默认的语言环境。配置文件?
答案 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;
}
}
这将是一种方法(你在那个工厂得到容器,所以你可能得到一些用户数据)。
另一种解决方案是使用事件系统,并仅在事件侦听器中声明区域设置,以便检索用户详细信息。