翻译导航面包屑

时间:2017-10-05 16:06:22

标签: zend-framework2

我正在尝试翻译位于module/Application/config/module.config.php配置文件中的面包屑,如:

'navigation' => array(
    'default' => array(
        array(
            'label' => \Application\Util\Translator::translate('Home'),
            'route' => 'home',
            'resource' => 'route/home',
            'pages' => array(
            ),
        ),

面包屑Home应以法语显示为Accueil

翻译器适用于其他应用程序。但是没有一个面包屑被翻译过来。语言资源文件已经过一次又一次的验证和编辑。

在完全相同的配置文件中,是翻译器

configuration:
    'service_manager' => array(
        'factories' => array(
            'account_navigation' => 'Application\Navigation\Service\AccountNavigationFactory',
            'navigation' => 'Zend\Navigation\Service\DefaultNavigationFactory',
            'translator' => 'Zend\I18n\Translator\TranslatorServiceFactory',
            'Application\Collector\RouteCollector'  => 'Application\Service\RouteCollectorServiceFactory',
        ),
    ),
    'translator' => array(
        'locale' => 'fr_FR',  // langue par défaut
        'translation_file_patterns' => array(
            array(
                'type'     => 'gettext',
                'base_dir' => __DIR__ . '/../language',
                'pattern'  => '%s.mo',
            ),
        ),
        'translation_files' => array(
            array(
                'type'     => 'phpArray',
                'filename' => __DIR__ . '/../../../vendor/zendframework/zendframework/resources/languages/fr/Zend_Validate.php',
                'locale'   => 'fr_FR'
            ),
            array(
                'type'     => 'gettext',
                'filename' => __DIR__ . '/../../../vendor/zf-commons/zfc-user/src/ZfcUser/language/fr_FR.mo',
                'locale'   => 'fr_FR'
            ),
            array(
                'type'     => 'phpArray',
                'filename' => __DIR__ . '/../language/fr_FR.php',
                'locale'   => 'fr_FR'
            )
        )
    ),

我的应用程序引导程序如下:

class Module
{

    public function onBootstrap(MvcEvent $e)
    {
        $eventManager = $e->getApplication()->getEventManager();
        $moduleRouteListener = new ModuleRouteListener();

        $sm = $e->getParam('application')->getServiceManager();

        // Add ACL information to the Navigation view helper
        $authorize = $sm->get('BjyAuthorize\Service\Authorize');
        $acl = $authorize->getAcl();
        $role = $authorize->getIdentity();
        \Zend\View\Helper\Navigation::setDefaultAcl($acl);
        \Zend\View\Helper\Navigation::setDefaultRole($role);

        $id = $sm->get('zfcuser_auth_service')->getIdentity();
        if (! is_null($id)) {
            $em = $sm->get('Doctrine\ORM\EntityManager');
            $usr = $em->find('Application\Entity\User', $id->getId());

            $blameableListener = new \Gedmo\Blameable\BlameableListener();
            $blameableListener->setUserValue($usr);
            $em->getEventManager()->addEventSubscriber($blameableListener);
        } else {
            // redirection
            if (isset($_SERVER['SERVER_NAME']) && preg_match('/monxxxxx/', $_SERVER['SERVER_NAME'])) {
                $strategy = new RedirectionStrategy();
                $strategy->setRedirectRoute('driver/login');
                $eventManager->attach($strategy);
            }
        }
        if ($sm->has('MvcTranslator')) {
            \Zend\Validator\AbstractValidator::setDefaultTranslator($sm->get('MvcTranslator'));
        }

        Locale::setDefault('fr_FR');

        // custom layout
        $e->getApplication()->getEventManager()->getSharedManager()->attach('Zend\Mvc\Controller\AbstractController', 'dispatch', function($e) {
            $route = $e->getRouteMatch();
            $controller = $e->getTarget();
            // change layout for login
            if($route->getParam('controller') == 'zfcuser' && $route->getParam('action') == 'login'){
                $controller->layout('layout/login');
            }
        }, 100);

        // Log the exceptions
        $application   = $e->getApplication();
        $sm = $application->getServiceManager();
        $sharedManager = $application->getEventManager()->getSharedManager();
        $sharedManager->attach('Zend\Mvc\Application', 'dispatch.error',
          function($e) use ($sm) {
            if ($e->getParam('exception') && strpos($e->getParam('exception'), 'are not authorized') === false) {  
              $sm->get('Zend\Log\Logger')->crit($e->getParam('exception'));

              $toEmail = "xxxxx@xxxxx.com";
              $toName = "Service IT";
              $subject = "Exception error";
              $body = $e->getParam('exception');
              \Application\Util\Common::sendMail($toEmail, $toName, $subject, $body);
            }
          }
        );
    }

    public function getConfig()
    {
        return include __DIR__ . '/config/module.config.php';
    }

    public function getAutoloaderConfig()
    {
        return array(
            'Zend\Loader\StandardAutoloader' => array(
                'namespaces' => array(
                    __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__
                )
            )
        );
    }

    public function init($moduleManager)
    {
         $moduleManager->loadModule('ZfcUser');
    }
}

我在ZF2上2.2.5

2 个答案:

答案 0 :(得分:1)

可能是一个愚蠢的问题,但你有PHP gettext模块(通过你的phpinfo()验证)?如果是,您可以更轻松地将_('Translatable string')用于需要翻译的字符串。您在.mo文件夹(.polanguage旁边等)中有srcpublic个文件。)。

(上述问题是因为您似乎在为此付出了很多努力,即使您的代码显示您使用gettext作为翻译器,这应该允许您已经翻译静态字符串,例如{{ 1}}在配置文件中)

以下图片为例,它是我自己的ZF2供应商模块的基本设置:

File structure setup

接下来,您需要Poedit(免费版本应该充足。)

注意:确保始终使用Poedit编辑home文件。

使用Poedit打开.mo/.po文件夹中的文件,无需"翻译"字符串与它们应该使用的语言相同的字符串,除非您使用字符串的快捷方式(即。"索引"字符串应显示"显示概述",但请不要& #39; t:p)

在Poedit中,您可以选择添加在文件中搜索的其他字符串,还可以添加其他文件扩展名。我建议你看看这些字符串:

  • language
  • $this->translate()

和这些文件扩展名:

  • .PHP
  • 一个.phtml

这样你已经涵盖了基础知识。当然您的设置可能不同,因此请根据需要进行修改。

最后,您需要在模块配置中注册_() PHP扩展的用法。您需要为每个模块执行此操作,因为您需要提供语言文件夹路径,因为这是您的模块应该在的位置。被翻译(尽管你可以自由地使它成为全球性的,并且如果必须的话,有一个巨大的翻译文件,不推荐)。

将以下位添加到gettext文件中:

module.config.php

完成上述所有操作后,翻译面包屑的方法应该如下:

'translator' => [
    'locale' => 'en_US', // This line needs to be in the "root" config, feel free to override with/per module settings and/or user settings
    'translation_file_patterns' => [
        [
            'type'     => 'gettext',
            'base_dir' => __DIR__ . '/../language',
            'pattern'  => '%s.mo',
        ],
    ],
],

答案 1 :(得分:0)

似乎是命名空间Zend\View\Helper\Navigation\Breadcrumbs;在您的服务管理器中没有正确实例化。因此,翻译器将无法工作,因为它也由服务经理提供为依赖性

您应该做的是验证在加载面包屑时是否实际解析了Zend\View\Helper\Navigation\Breadcrumbs::line#113。至少这一个。

您还可以检查htmlify的{​​{1}}方法,以测试是否启用了翻译器。