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


ZF2 navigation translate navigation labels and titles

我正试图找到一种翻译标签和标题的方法。根据ZF2手册,我所要做的就是:

导航助手支持页面标签和标题的翻译。您可以使用$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)
    ?>

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

谢谢。

Zend使用Application/language文件夹中的.po文件,您需要使用poedit来编辑gettext翻译。Poedit扫描。要翻译的短语的php(在这种情况下为.phtml文件),更准确地说,寻找翻译函数名称(在这种情形下为translate)。查看这里如何为Zend配置poedit,这里是翻译菜单标签的简单解决方案。我刚开始学习Zend,我不确定这是否是正确的方法,但这是我遇到的最简单的解决方案。您只需要在配置翻译器Application/config/module.config.php(在骨架应用程序、en_US语言环境和gettext类型中)中添加标签值作为$translator->translate( ... )。在打开.po文件并刷新目录之后,应该添加新行进行翻译(此外,您不能也不应该添加程序未自动找到的新翻译)。我已经测试了以上内容,菜单在没有setTranslator( ... )调用的情况下自动翻译。

您在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',
        ),
    ),
),

我遇到了一个令人困惑的情况,我也正确地设置了所有内容,但翻译无法执行。。。因为操作系统上没有安装正确的区域设置。我正试图将en_US翻译成fr_CA。这很快为我解决了问题:

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

我遇到了同样的问题,下面是我的解决方案。(使用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 - _

"_"是通过POEDIT映射关键字,ZEND使用"translate"将其替换为您放入POEDIT中的值。

Zend在导航时提供翻译,但在渲染之前不提供。这个片段就可以了。(Zend 3)

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

查看模块.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;
            },
        ]
);