8

我不明白!.. 请有人解释一下,如何翻译表单标签?一个简单的例子会很棒。

先感谢您!


类 Search\Form\CourseSearchForm

...

class CourseSearchForm extends Form {

    ...

    public function __construct(array $cities) {
        parent::__construct('courseSearch');
        ...
        $this->add(array(
            'name' => 'city',
            'type'  => 'Zend\Form\Element\Select',
            'options' => array(
                'label' => 'Stadt',
                'value_options' => $this->cities,
                'id'  => 'searchFormCity',
            ),
        ));
        ...
    }
}

查看脚本 /module/Search/view/sea​​rch/search/search-form.phtml

<?php echo $this->form()->openTag($form); ?>
<dl>
    ...
    <dt><label><?php echo $form->get('city')->getLabel(); ?></label></dt>
    <dd><?php echo $this->formRow($form->get('city'), null, false, false); ?></dd>
    ...
</dl>
<?php echo $this->form()->closeTag(); ?>
<!-- The formRow(...) is my MyNamespace\Form\View\Helper (extends Zend\Form\View\Helper\FormRow); the fourth argument of it disables the label. -->

配置module/Application/config/module.config.php为:

return array(
    'router' => ...
    'service_manager' => array(
        'factories' => array(
            'translator' => 'Zend\I18n\Translator\TranslatorServiceFactory',
        ),
    ),
    'translator' => array(
        'locale' => 'de_DE',
        'translation_file_patterns' => array(
            array(
                'type'     => 'gettext',
                'base_dir' => __DIR__ . '/../language',
                'pattern'  => '%s.mo',
            ),
        ),
    ),
    'controllers' => ...
    'view_manager' => ...
);

我还编辑了我的视图并使用了FormLabel视图助手:

<dt><label><?php echo $this->formLabel($form->get('city')); ?></label></dt>

此外,我FormLabel在使用翻译器的地方(第116-120行)调试了 - 似乎没问题。

但它仍然无法正常工作。


编辑

de_DE.po我手动添加到文件中的标签(测试)项目被翻译。ZF2 方面的问题实际上是我使用$form->get('city')->getLabel()而不是$this->formlabel($form->get('city'))在视图脚本中使用。

现在的问题是,标签没有添加到de_DE.po文件中。但这不再是 ZF2 问题,所以我接受了 Ruben 的回答并打开了一个新的 Poedit 问题。

4

4 回答 4

9

而不是使用:

<?php echo $form->get('city')->getLabel(); ?>

您应该使用 formlabel 视图助手。如果您已将其插入 ServiceManager,则此助手会在渲染期间自动使用您的翻译器。您很可能会在应用程序的模块 module.config.php 中使用它:

'service_manager' => array(
        'factories' => array(
            'translator' => 'Zend\I18n\Translator\TranslatorServiceFactory',
        ),
    ),

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

一旦你使用了 formlabel 视图助手:

echo $this->formLabel($form->get('city'));

当然,请确保您的翻译在您的 .po 文件中。

于 2013-04-12T02:37:21.597 回答
5

我认为您的问题是 poedit (或类似工具)未检测到您的标签,因此您必须手动将它们添加到您的 poedit 目录(.po)

要让 poedit 等工具检测到您的标签字符串,您的字符串需要在translate()函数或_()中使用(可以在 Catalog/properties/sources 关键字中添加其他函数)

由于_()函数不是 ZF2 中的用户(今天),所以一个小技巧是在你的 index.php 中添加一个这样的函数(不需要修改任何东西,这样,在 poedit 参数中):

// in index.php
function _($str) 
{ 
    return $str; 
}

在你的代码中,当你的字符串在翻译函数之外时使用它

//...
    $this->add(array(
        'name' => 'city',
        'type'  => 'Zend\Form\Element\Select',
        'options' => array(
            'label' => _('myLabel') ,    // <------ will be detected by poedit
            'value_options' => $this->cities,
            'id'  => 'searchFormCity',
        ),
    ));
//...

或者喜欢这样

$myLabel = _('any label string');  // <--- added to poedit catalog
//...
        'options' => array(
            'label' => $myLabel ,
            'value_options' => $this->cities,
            'id'  => 'searchFormCity',
        ),
于 2013-04-27T13:02:07.557 回答
1

@Ruben 说得对!

我使用PoEdit来生成我的*.mo文件并确保在文件中获得所有翻译,我在某处(例如在视图中)创建了一个名为_lan.phtml的文件,其中包含所有要翻译的文本:

<?php echo $this->translate("My label"); 
... ?>

当然,必须配置Poedit才能找到我的关键字。检查这个如何配置它

于 2013-04-12T07:05:34.833 回答
0

所有解决方案都没有使用 ZF2 的力量。您必须正确配置您的 poedit:

所有的东西都在这里: http ://circlical.com/blog/2013/11/5/localizing-your-twig-using-zend-framework-2-applications

于 2014-03-10T10:48:45.707 回答