0

我是 Zend 框架的新手,目前正在研究 Zend2...我想询问 Zend 表单中的翻译器使用情况...如果我想使用翻译器,我直接在表单视图 ieform_view.php 中使用标签

$this->formLabel()->setTranslator($translator, 'date_of_birth');

但我想在表单中添加翻译器,例如 src/my_module/Form/UserForm.php

$this->add(array(
        'name' => 'date_of_birth',
        'attributes' => array(
            'type'  => 'text',
            'id' => 'date_of_birth',
        ),
        'options' => array(
            'label' => 'DateOfBirth',
        ),                                 //Here there is any option to put translator
    ));

请帮助我......任何答案都会像我问的那样对我有帮助

提前致谢

4

3 回答 3

2

你真的不需要这样做。由于使用 factory-key 设置的 Translatortranslator会自动注入到 Form 中。

最好的方法(在我看来)是广泛使用翻译器text_domain

'translator' => array(
    'locale' => 'de_DE',
    'translation_file_patterns' => array(
        array(
            'type'        => 'phparray',
            'base_dir'    => __DIR__ . '/../language',
            'pattern'     => '%s.php',
            'text_domain' => 'MyModuleTextDomain'
        ),
    ),
),

通过这个设置,你的模块文件将自动插入到每个 Zend\Form 都知道的默认 TranslatorService 中。

因此,最终您所要做的就是ViewHelpers了解TextDomain您正在使用的内容。这是通过以下方式完成的:

$this->formLabel()->setTranslatorTextDomain('MyModuleTextDomain');
$this->formButton()->setTranslatorTextDomain('MyModuleTextDomain');
$this->formElementErrors()->setTranslatorTextDomain('MyModuleTextDomain');

您需要在各自的view.phtmlbefore(!) 中使用 ViewHelpers 像$this->formElement($element)$this->formCollection($form)

这就是它的全部。我记得在某处看到过关于使传递文本域数据更容易的讨论,但我现在找不到。所以将来事情可能会变得容易一些;)现在,虽然只需要 3 行!

于 2013-06-12T11:18:24.130 回答
1

上面的答案是完全没有必要的......因为您的翻译器已自动添加到 zend 表单以呈现表单标签并且......仅在您的模块配置中使用此代码:

'translator' => array(
        'locale' => 'en_US',
        'translation_file_patterns' => array(
            array(
                'type'     => 'phparray',
                'base_dir' => __DIR__ . '/../language',
                'pattern'  => '%s.php',
            ),
        ),
    ),

如果您使用正确的视图助手来呈现表单元素(或整个表单),它将自动翻译

于 2013-02-08T14:09:27.597 回答
0

这不是推荐的方法,因为如果您配置了翻译器(如果您使用 Skeleton 应用程序,您会这样做),则会自动翻译表单。但是,由于您询问如何在表单中直接使用翻译器,我将向您展示如何做到这一点。请仔细考虑您是否真的想这样做,因为我无法想象有必要的用例。

要完全按照您的要求进行操作,您可以将翻译器注入您的表单中。您可以在控制器或工厂中执行此操作。我将在此示例中使用工厂,因为它更DRY

// In your module's config file
'service_manager' => array(
    'factories' => array(
        'YourModule\Form\YourForm' => function($sm) {
            $translator = $sm->get('Translator');
            return new \YourModule\Form\YourForm($translator);
        },
    ),
),

然后在您的表单类中,您可以这样做:

namespace YourModule\Form;

class RegisterForm extends \Zend\Form\Form {
    public function __construct($translator) {
        // Do something

        $translated_string = $translator->translate('string to translate');
    }
}

然后在你的控制器中,你可以这样做:

$your_form = $this->servicelocator->get('YourModule\Form\YourForm');

或者如果你不想使用工厂,你可以选择不添加它,而是这样做:

$your_form = new \YourModule\Form\YourForm($this->servicelocator->get('Translator'));

不过我还是建议去工厂。

于 2013-02-08T12:23:45.413 回答