我正在尝试将验证消息翻译成另一种语言。我正在使用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));
答案 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);
?>