ZF2.3翻译验证消息

时间:2014-04-18 10:10:10

标签: php zend-framework2

我正在尝试将验证消息翻译成另一种语言。我正在使用ZF 2.3和骨架应用程序。

我已经配置了翻译:

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

但是我的视图文件中没有翻译以下字符串(并确保此字符串包含在我的语言文件中):

echo $this->translate('Invalid type given. String, integer or float expected');

来自验证器的消息仍然是默认/未翻译。

我到处寻找解决方案,但似乎翻译已经在ZF 2.3中进行了重构,我找到的所有解决方案都适用于旧版本。

以下文档页面应提供解决方案: http://framework.zend.com/manual/2.3/en/modules/zend.validator.messages.html

但是“使用预翻译验证消息”下的代码'不起作用:

$translator = new Zend\Mvc\I18n\Translator();
$translator->addTranslationFile(
    'phpArray',
    'resources/languages/en.php',
    'default',
    'en_US'
);

Zend\Validator\AbstractValidator::setDefaultTranslator($translator);

这将导致致命错误:

Catchable fatal error: Argument 1 passed to Zend\Mvc\I18n\Translator::__construct() must implement interface Zend\I18n\Translator\TranslatorInterface, none given

是否有针对ZF 2.3的已知解决方案?

解决方案:

在配置中:

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

在模块引导事件中:

    $translator = $e->getApplication()->getServiceManager()->get('translator');
    $translator->addTranslationFile('phpArray', __DIR__ . '/language_php/Zend_Validate.php', 'default', 'nl_NL');

    \Zend\Validator\AbstractValidator::setDefaultTranslator(new \Zend\Mvc\I18n\Translator($translator));

3 个答案:

答案 0 :(得分:2)

解决方案如下 http://framework.zend.com/manual/2.2/en/modules/zend.validator.html#translating-messages 他们说:一项新服务也已在MVC,MvcTranslator

注册

所以你可以用

初始化$ translator变量
$translator = $serviceLocator->get('MvcTranslator');

您必须确保能够访问serviceLocator。

答案 1 :(得分:2)

这是我翻译验证消息的工作代码:

<强>配置/自动加载/ global.php

<?php
return array(

        .........

    'service_manager' => array(
        'aliases' => array(
            'translator' => 'MvcTranslator',
        ),
    ),

        .........

);

<强>模块/应用程序/ Module.php

<?php

namespace Application;

use Zend\Validator\AbstractValidator;
use Zend\Mvc\MvcEvent;

class Module
{
    public function onBootstrap(MvcEvent $e)
    {
        date_default_timezone_set('Europe/Madrid');

        $serviceManager = $e->getApplication()->getServiceManager();
        $translator = $serviceManager->get('translator');

        //$locale = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
        $locale = 'es_ES';
        //$locale = 'en_US';

        $translator->setLocale(\Locale::acceptFromHttp($locale));
        $translator->addTranslationFile(
            'phpArray',
            'lang/es/Zend_Validate.php',
            'default',
            'es_ES'
        );
        AbstractValidator::setDefaultTranslator($translator);
    }
}

我希望这可以帮到你。祝你有愉快的一天。

答案 2 :(得分:1)

试试这个:

<?php
      $translatorI = new \Zend\I18n\Translator\Translator();
      $translatorI->setLocale('es');


      $translator = new \Zend\Mvc\I18n\Translator($translatorI);
      $translator->addTranslationFile(
          'phpArray',
          './vendor/zendframework/zendframework/resources/languages/es/Zend_Validate.php',
          'default',
          'es'
      );

      \Zend\Validator\AbstractValidator::setDefaultTranslator($translator);
?>