我不赞成所选的答案:P
在您的配置中添加新的翻译器时,不要使用默认的翻译器文本域。语法如下:
$translator->addTranslationFile(
$type,
$resource,
$textDomain, //<-- this is the important one
$lang
);
在您的示例中,您已将文件添加到默认文本域。可悲的是,这带来了很多麻烦,因为它不会总是按预期工作。每当您添加翻译文件时,请将它们添加到您自己的文本域中!
之后,您需要做的就是分配Zend\Form\View\Helper
您的文本域。这是通过以下方式完成的:
// For Labels
$this->formLabel()->setTranslatorTextDomain('your-textdomain');
// For Buttons (input type submit)
$this->formButton()->setTranslatorTextDomain('your-textdomain');
// For Error-Messages
$this->formElementErrors()->setTranslatorTextDomain('your-textdomain');
如何让 ServiceManager 进入表单?
这也很容易。最简单的方法是使用或constructor-injection
注入您的表单。在控制器级别上,这看起来像这样:ServiceManager
ServiceLocator
__construct()
$serviceLocator = $this->getServiceLocator();
$form = new My\Form($serviceLocator);
可以在我的博客上找到对 Form-Dependencies 的更深入介绍,其中我说明了Zend\Form\Element\Select
依赖 Database-Connections 上的 -Element 的数量。
关于翻译器本身
另一件需要注意的事情是:只要有一个 Translator-Service 附加到您的配置中,名称为translator
,它将自动附加到表单作为默认翻译器。这是我经常在我的模块中使用的示例配置:
'translator' => array(
'locale' => 'de_DE',
'translation_file_patterns' => array(
array(
'type' => 'phparray',
'base_dir' => __DIR__ . '/lang',
'pattern' => '%s.php',
'text_domain' => __NAMESPACE__,
),
),
),