2016-12-29 18 views
0

Я использую ZF 2,4, и я хотел бы изменить сообщения проверки формы на немецкий, так что я использовал код, совместимый с доком - https://framework.zend.com/manual/2.4/en/modules/zend.validator.messages.htmlZF 2 Form Validation Перевод

$translator = new \Zend\Mvc\I18n\Translator(); 
$translator->addTranslationFile(
    'phpArray', 
    './vendor/zendframework/zendframework/resources/languages/en/Zend_Validate.php', //or Zend_Captcha 
    'default', 
    'de_DE' 
); 
\Zend\Validator\AbstractValidator::setDefaultTranslator($translator); 

Unfortunatelly EN используется еще .. Например, сообщение «Значение является обязательным и не может быть пустым» отображается из vendor/zendframework/zendframework/library/Zend/Validator/NotEmpty.php и не переводится с vendor/zendframework/zendframework/resources/languages/de/Zend_Validate.php

ошибок не существует ...

может кто-нибудь помочь мне, пожалуйста? Это очень важно для меня ...

ответ

2

Переводчик по-прежнему указывает на локаль EN. То, что вы хотите сделать, - установить языковой язык транслятора на основе пользовательских настроек или, возможно, даже параметра маршрута. Для этого используйте setLocale($locale) на вашем Translator.

Таким образом, вы можете сделать это в вашем Application\Module.php:

$language = $event->getRouteMatch()->getParam('language', 'en_US'); 
$serviceManager = $event->getApplication()->getServiceManager(); 
$translator = $serviceManager->get('translator'); 
$translator 
    ->setLocale($language) 
    ->setFallbackLocale('en_US') 
    ->addTranslationFilePattern(
     'phpArray', 
     \Zend\I18n\Translator\Resources::getBasePath(), 
     \Zend\I18n\Translator\Resources::getPatternForValidator() 
    ); 

AbstractValidator::setDefaultTranslator($translator); 

Это до вас, где вы получите язык локали из. Если у вас нет маршрута параметров, определенных для языка, но хотите использовать пользовательские настройки, например:

$language = 'en_US'; 
$authService = $auth = $serviceManager->get('zfcuser_auth_service'); 
if ($authService->hasIdentity()) { 
    $language = $authService->getIdentity()->getUserSettings()->getLanguage(); 
} 
+0

Это не работает. Я использовал что-то похожее - http://stackoverflow.com/questions/24956272/zend-framework-2-how-to -make-a-language-switcher, потому что методов из вашего сообщения не существует (Resources :: getBasePath(), Resources :: getPatternForValidator()) –

+0

do You hav Есть идеи? Я думал, что код из моего первого сообщения должен работать, потому что в массиве «default» был передан .. поэтому я подумал, что он установлен как default locale –

+0

Ой, извините, я должен был использовать FQCN вместо простого ресурса. Обновит мой ответ. BTW: вам не нужно создавать новый экземпляр переводчика. Используйте «Переводчик» по умолчанию, который включен в 'ServiceManager'. Если вы выберете «Переводчик», вы создали локаль, это probaly null, поскольку вы не установили его, и внутри класса по умолчанию нет. И возможно, вы могли бы создать переводчик, используя: 'Translator :: factory ($ options)' – Kwido

0

Хаа, это работает, когда я использовал код ниже:

public function onBootstrap(MvcEvent $e) 
{ 
    $eventManager  = $e->getApplication()->getEventManager(); 
    $moduleRouteListener = new ModuleRouteListener(); 
    $moduleRouteListener->attach($eventManager); 
$serviceManager = $e->getApplication()->getServiceManager(); 
    $translator = $serviceManager->get('translator'); 

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

    $translator->setLocale(\Locale::acceptFromHttp($locale)); 
    $translator->addTranslationFile(
     'phpArray', 
     './vendor/zendframework/zendframework/resources/languages/de/Zend_Validate.php', 
     'default', 
     'de_DE' 
    ); 
    \Zend\Validator\AbstractValidator::setDefaultTranslator($translator); 
} 

Я не» t понять, почему он не работал раньше.