我在翻译中遇到了问题。我想为每个模块使用模块特定的文本域( NAMESPACE )。首先我发现ZF2需要从版本2.2开始将转换器注入验证器,所以我在我的Application \ Module.php中做了这样的思考
class Module
{
public function onBootstrap(\Zend\Mvc\MvcEvent $e)
{
$translator = new \Zend\Mvc\I18n\Translator(
$e->getApplication()->getServiceManager()->get('translator')
);
\Zend\Validator\AbstractValidator::setDefaultTranslator($translator);
}
}
这可以注入默认的转换器。所以现在我需要为Validators设置TextDomain。当时我通过Validator Factory为每个模块验证器设置它们,如
Class PasswordFactory implements FactoryInterface
{
public function CreateServcie(ServiceLocatorInterface $sl) {
$validator = new PasswordValidator();
$validator->setTranslatorTextDomain('User'); // User = Module namespace
}
}
这可行,但它有点单调乏味并且使代码膨胀。 那么有一种简单的方法来处理Validators的TextDomains吗?例如,在Event:Dispatch或通过Initializer?
中附加它们问候
答案 0 :(得分:0)
您可以在模块
中设置默认TextDomain
class Module
{
public function onBootstrap(\Zend\Mvc\MvcEvent $e)
{
...
\Zend\Validator\AbstractValidator::setDefaultTranslatorTextDomain(__NAMESPACE__);
是的,它不起作用,因为 NAMESPACE 获得本地NAMESPACE
要获得最新动态__NAMESPACE__
,您可以使用MvcEvent::EVENT_DISPATCH
操作。
public function onBootstrap(MvcEvent $e)
{
...
$eventManager = $e->getApplication()->getEventManager();
$eventManager->attach(MvcEvent::EVENT_DISPATCH, array($this, 'setTextDomain'), 100);
}
public function setTextDomain(MvcEvent $e)
{
$currentNameSpace = $e->getRouteMatch()->getParam('__NAMESPACE__');
\Zend\Validator\AbstractValidator::setDefaultTranslatorTextDomain(currentNameSpace);
}