ZF2导航翻译导航标签和标题

时间:2015-03-25 13:38:19

标签: php zend-framework zend-framework2 zend-translate

我试图找到翻译标签和标题的方法。 根据他ZF2 Manual,我必须这样做:

  

导航助手支持页面标签和标题的翻译。您可以使用$ helper-> setTranslator($ translator)在帮助程序中设置Zend \ I18n \ Translator类型的翻译器。

所以我的导航在配置文件

中看起来像这样
return array(
    'navigation' => array(
        'default' => array(
            array(
                'label' => 'Home',
                'route' => 'home',
            ),
            array(
                'label' => 'Users',
                'route' => 'tar-users',
            ),
        ),
    ),
);

这是在global.php

return array(
    'service_manager' => array(
        'factories' => array(
            'navigation' => 'Zend\Navigation\Service\DefaultNavigationFactory',
        ),
    ),

    //...
);

在我的布局中,我有:

<?php echo $this->navigation('navigation')
        ->setTranslator($this->plugin('translate')->getTranslator())
        ->menu()
        ->setUlClass('nav navbar-nav')
        ->setMaxDepth(0)
    ?>

导航正在运行,但未进行翻译。 我确定我错过了什么或者我做错了什么。我想知道什么。我不知道你要写的代码只是一些提示。

谢谢。

6 个答案:

答案 0 :(得分:1)

Zend使用.po文件夹中的Application/language个文件,您需要使用poedit来编辑gettext翻译。 Poedit会扫描。php(或本例中为.phtml个文件),以便翻译短语,更准确地说,搜索翻译函数名称(在本例中为translate)。检查HERE如何为Zend配置poedit,HERE是翻译菜单标签的简单解决方案。我刚刚开始学习Zend,我不确定这是否是正确的方法,但它是我遇到的最简单的解决方案。您只需要在$translator->translate( ... )中添加标签值为Application/config/module.config.php,配置转换器(在骨架应用程序中,en_US区域设置和gettext类型)。在打开.po文件并刷新目录之后,应添加新行以进行翻译(同样,您不能,也不应添加程序自动找不到的新翻译)。我已对上述内容进行了测试,菜单会在没有setTranslator( ... )调用的情况下自动翻译。

答案 1 :(得分:0)

你在module.config.php中设置翻译服务和语言环境吗? 像这样的东西:

'translator' => array(
    'locale' => 'it_IT',
    'translation_files' => array(
        array(
            'type'     => 'phpArray',
            'filename' => __DIR__ . '/../language/Zend_Captcha.php',
            'text_domain' => 'default'
        ),
        array(
            'type'     => 'phpArray',
            'filename' => __DIR__ . '/../language/Zend_Validate.php',
            'text_domain' => 'default'
        ),
    ),
    'translation_file_patterns' => array(
        array(
            'type'     => 'gettext',
            'base_dir' => __DIR__ . '/../language',
            'pattern'  => '%s.mo',
        ),
    ),
),

答案 2 :(得分:0)

我遇到了一个令人费解的情况,我也正确地设置了一切,但翻译不会执行...因为操作系统上没有安装正确的语言环境。我试图将en_US翻译成fr_CA。这很快就解决了我的问题:

sudo locale-gen fr_CA sudo locale-gen fr_CA.UTF-8

答案 3 :(得分:0)

我遇到了同样的问题,这是我的解决方案。 (使用gettext

示例:

module.config.php

array (
    'label' => _('Home'),
    'route' => 'home'
),

在视图中,您将使用以下内容:

$this->translate(HERE_COMES_THE_ITENS_OF_NAVIGATION)

在我的情况下,我使用它:

foreach ( $this->container as $page ) {
   $this->translate($page->getlabel ());
}

在POEDIT计划中,您将插入两个来源关键字

1 - translate
2 - _

&#34; _&#34;是按POEDIT映射关键字,ZEND使用&#34;翻译&#34;用您在POEDIT中输入的值替换它。

答案 4 :(得分:0)

Zend带有导航翻译,但不是在渲染之前。 这个片段可以解决这个问题。 (Zend 3)

$sm = $event->getApplication()->getServiceManager();
$vhm = $sm->get('ViewHelperManager');
$translator = $sm->get('translator');
$vhm->get('navigation')->setTranslator($translator);

答案 5 :(得分:0)

查看module.config.php中的脚本

// module.config.php
fufunction _(string $msg){return $msg}

function _(string $msg){return $msg}

return array(
    'navigation' => array(
        'default' => array(
            array(
                'label' => _('Home'),
                'route' => 'home',
            ),
            array(
                'label' => _('Users'),
                'route' => 'tar-users',
            ),
        ),
    ),
    'view_helpers' => [
        'aliases' => [
            '_'                 => Translate::class,
            'numberFormat'      => NumberFormat::class,
            'formLabel'         => FormLabel::class,
            'formSubmit'        => FormSubmit::class,
            'menu'              => Navigation::class,
        ],

        'factories' => [

            Translate::class => function($container) {
                $instance = new Translate();
                $instance->setTranslator($container->get(Translator::class));
                return $instance;
            },

            FormLabel::class => function($container) {
                $instance = new FormLabel();
                $instance->setTranslator($container->get(Translator::class));
                return $instance;
            },

            FormSubmit::class => function($container) {
                $instance = new FormSubmit();
                $instance->setTranslator($container->get(Translator::class));
                return $instance;
            },

            Navigation::class => function($container) {
                $instance = new Navigation();
                $instance->setTranslator($container->get(Translator::class));
                $instance->setServiceLocator($container);
                return $instance;
            },
        ]
);