2016-12-29 9 views
0

verwende ich ZF 2.4 und ich möchte Formularvalidierung Nachrichten Deutsch ändern, so habe ich Code kompatibel mit doc - https://framework.zend.com/manual/2.4/en/modules/zend.validator.messages.htmlZF2 Form Validation Übersetzungen

$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 verwendet wird, nach wie vor .. Zum Beispiel Nachricht „Wert ist erforderlich und darf nicht leer sein“ wird von vendor/zendframework/zendframework/library/Zend/Validator/NotEmpty.php angezeigt und wird nicht von vendor/zendframework/zendframework/resources/languages/de/Zend_Validate.php

keine Fehler gibt es ...

Könnte jemand mir bitte helfen? Das ist sehr wichtig für mich ...

Antwort

2

Der Übersetzer zeigt immer noch auf das Gebietsschema von EN. Was Sie tun möchten, ist das Gebietsschema des Übersetzers basierend auf den Benutzereinstellungen oder vielleicht sogar einem Routenparameter. Um dies zu tun, verwenden Sie die setLocale($locale) auf Ihrem Translator.

So könnten Sie dies tun in Ihrem 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); 

Es liegt an Ihnen, wo Sie die Gebietsschema aus erhalten. Wenn Sie nicht über eine Route param für die Sprache definiert haben, aber die Benutzereinstellungen zum Beispiel verwenden möchten:

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

Es funktioniert immer noch nicht .... Ich habe etwas ähnliches - http://stackoverflow.com/questions/24956272/zend-framework-2-how-to -make-a-language-switcher, weil Methoden aus Deinem Post nicht existieren (Resources :: getBasePath(), Resources :: getPatternForValidator()) –

+0

hast du e irgendeine Idee? Ich dachte, dass Code aus meinem ersten Beitrag funktionieren sollte, weil im Array "default" übergeben wurde .. also dachte ich, dass es als Standard-Locale eingestellt ist –

+0

Oh Entschuldigung, ich hätte die FQCN anstatt nur 'Resource' verwenden sollen. Wird meine Antwort aktualisieren. Übrigens: Sie müssen keine neue Instanz des Übersetzers erstellen. Verwenden Sie den Standard 'Translator', der im' ServiceManager' enthalten ist. Wenn Sie den "Translator" auschecken, den Sie erstellt haben, ist das Gebietsschema wahrscheinlich null, da Sie es nicht festgelegt haben, und innerhalb der Klasse gibt es keinen Standardwert. Und vielleicht könnten Sie den Übersetzer mit Hilfe von: 'Translator :: factory ($ options)' – Kwido

0

Haa, funktioniert es, wenn ich unten Code verwendet:

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); 
} 

I don‘ t verstehe, warum es vorher nicht funktionierte ..