turk porno porno escort rokettube
Ergebnis 1 bis 13 von 13

Thema: Default Translator ZF > 2.2.0

  1. #1
    Benutzer
    Registriert seit
    14.06.2012
    Beiträge
    32
    Thanks
    1
    Thanked 9 Times in 3 Posts

    Standard Default Translator ZF > 2.2.0

    Ich versuche einen Default Translator für Validator Messages einzubinden. Es hat auch mal geklappt, ehe im AbstractValidator etwas geändert wurde

    Der Code, der früher funktionierte lautet:

    PHP-Code:
    $translator= new \Zend\I18n\Translator\Translator();
    $translator->addTranslationFile(    'phpArray',    'vendor/zendframework/zendframework/resources/languages/de/Zend_Validate.php');
    //TEST Ausgabe!echo $translator->translate("Value is required and can't be empty");
    \Zend\Validator\AbstractValidator::setDefaultTranslator($translator); 
    Das gibt mittlerweile aber einen FATAL ERROR:
    Catchable fatal error: Argument 1 passed to Zend\Validator\AbstractValidator::setDefaultTransl ator() must be an instance of Zend\Validator\Translator\TranslatorInterface, instance of Zend\I18n\Translator\Translator given,
    Hier ist meine korrigierte, aber nicht funktionierende Version. Es wird nichts übersetzt:
    PHP-Code:
    $translator= new \Zend\I18n\Translator\Translator();
    $translator->addTranslationFile(    'phpArray',    'vendor/zendframework/zendframework/resources/languages/de/Zend_Validate.php',    'default',    'de_DE');
    echo 
    $translator->translate("Value is required and can't be empty");
    \
    Zend\Validator\AbstractValidator::setDefaultTranslator(new \Zend\Mvc\I18n\Translator($translator), 'default'); 
    In der ersten Zeile kann ich auch
    PHP-Code:
    $translator= new \Zend\Mvc\I18n\Translator(); 
    schreiben, am Ergebnis ändert sich nichts -> Validator Messages werden nicht übersetzt! Die Testausgabe oben funktioniert in allen Fällen!

    Kann mir jemand vielleicht ein paar Tipps dazu geben?

  2. #2
    Benutzer
    Registriert seit
    14.06.2012
    Beiträge
    32
    Thanks
    1
    Thanked 9 Times in 3 Posts

    Standard

    Sehr merkwürdig ist, dass die Testausgabe im AbstractValidator noch funktioniert.

    PHP-Code:
    public static function setDefaultTranslator(        Translator\TranslatorInterface $translator null$textDomain null    )    {        static::$defaultTranslator $translator;                        if (null !== $textDomain) {            self::setDefaultTranslatorTextDomain($textDomain);        }                echo "---<br />setDefaultTranslator says: " $translator->translate("Value is required and can't be empty");                echo "set";    } 
    In Zend\Form\View\Helper\FormElementErrors::render aber nicht mehr.

    edit: Wie bekomme ich diese ständigen Formatierungsprobleme weg?

  3. #3
    Super-Moderator Avatar von Kaiuwe
    Registriert seit
    30.12.2006
    Beiträge
    5.520
    Thanks
    4
    Thanked 356 Times in 287 Posts

    Standard

    Zitat Zitat von dennis! Beitrag anzeigen
    \Zend\Validator\AbstractValidator::setDefaultTrans lator(new \Zend\Mvc\I18n\Translator($translator), 'default');[/PHP]
    Wieso Translator als Übergabeparameter an Translater?

    PHP-Code:
    $translator = new Zend\Mvc\I18n\Translator();
    $translator->addTranslationFile(
        
    'phpArray',
        
    'Zend_Validate.php',
        
    'default',
        
    'de_DE'
    );
    $translator->setLocale('de_DE');
    Zend\Validator\AbstractValidator::setDefaultTranslator($translator); 
    Zum Zend Framework stehen jedem folgende Quellen zum Nachschlagen zur Verfügung:

  4. #4
    Super-Moderator Avatar von Kaiuwe
    Registriert seit
    30.12.2006
    Beiträge
    5.520
    Thanks
    4
    Thanked 356 Times in 287 Posts

    Standard

    Zitat Zitat von dennis! Beitrag anzeigen
    edit: Wie bekomme ich diese ständigen Formatierungsprobleme weg?
    Teste mal bitte mit einem anderen Browser.
    Zum Zend Framework stehen jedem folgende Quellen zum Nachschlagen zur Verfügung:

  5. #5
    Benutzer
    Registriert seit
    15.06.2012
    Beiträge
    32
    Thanks
    1
    Thanked 9 Times in 3 Posts

    Standard

    Eine Kleinigkeit noch. Wenn ich in Zend\Form\View\Helper\FormElementErrors::render

    nach

    PHP-Code:
    if (null !== ($translator $self->getTranslator())) { 
    mal spaßes halber

    PHP-Code:
    $translator = \Zend\Validator\AbstractValidator::getDefaultTranslator(); 
    setze, funktioniert alles. Wo ist mein Fehler? Welchen Translator bekommt FormElementErrors??

  6. #6
    Benutzer
    Registriert seit
    15.06.2012
    Beiträge
    32
    Thanks
    1
    Thanked 9 Times in 3 Posts

    Standard

    Test aus IE 10:
    PHP-Code:
    $translator = new \Zend\Mvc\I18n\Translator();
    $translator->addTranslationFile(
        
    'phpArray',
        
    'vendor/zendframework/zendframework/resources/languages/de/Zend_Validate.php'
    );
    $translator->translate("Value is required and can't be empty");
    AbstractValidator::setDefaultTranslator($translator); 
    ...in IE 10 kann ich gar kein [ENTER] eingeben

    TEST Firefox (hier kann ich ENTER eingeben)
    PHP-Code:
    public function setupDefaultFormTranslation(EventInterface $e)
    {
        
    $translator = new \Zend\Mvc\I18n\Translator();

        
    $translator->addTranslationFile(
            
    'phpArray',
            
    'vendor/zendframework/zendframework/resources/languages/de/Zend_Validate.php'
        
    );

        
    $translator->translate("Value is required and can't be empty");
        
    AbstractValidator::setDefaultTranslator($translator);

    Ok, sieht scheinbar gut aus in Firefox. Chrome weniger...

  7. #7
    Benutzer
    Registriert seit
    15.06.2012
    Beiträge
    32
    Thanks
    1
    Thanked 9 Times in 3 Posts

    Standard

    Zitat Zitat von Kaiuwe Beitrag anzeigen
    Wieso Translator als Übergabeparameter an Translater?
    Weil ich zuvor einen Zend\I18n\Translator\Translator hatte. Der ist aber nicht mehr mit Zend\Validator\AbstractValidator kompatibel. Es war einer meiner unzähligen Versuche...

    Dein PHP Code funktioniert so leider auch nicht. :\

    Ich befürchte, das Problem liegt woanders.


    PHP-Code:
    public function setupDefaultFormTranslation(EventInterface $e)
    {
        
    $translator = new \Zend\Mvc\I18n\Translator();
        
    $translator->addTranslationFile(
            
    'phpArray',
            
    'vendor/zendframework/zendframework/resources/languages/de/Zend_Validate.php',
            
    'default',
            
    'de_DE'
        
    );
        
    $translator->setLocale('de_DE');

        echo 
    $translator->translate("Value is required and can't be empty");
        \
    Zend\Validator\AbstractValidator::setDefaultTranslator($translator);

    Das echo bringt mir die korrekte Übersetzung!
    Im Formular (FormElementErrors) bleibt der englische Text.
    Geändert von dennis! (24.10.2013 um 12:56 Uhr)

  8. #8
    Super-Moderator Avatar von Kaiuwe
    Registriert seit
    30.12.2006
    Beiträge
    5.520
    Thanks
    4
    Thanked 356 Times in 287 Posts

    Standard

    Zitat Zitat von dennis! Beitrag anzeigen
    Dein PHP Code funktioniert so leider auch nicht. :\
    Bei mir schon! (Version 2.2.4)
    Zum Zend Framework stehen jedem folgende Quellen zum Nachschlagen zur Verfügung:

  9. #9
    Benutzer
    Registriert seit
    15.06.2012
    Beiträge
    32
    Thanks
    1
    Thanked 9 Times in 3 Posts

    Standard

    Wenn ich folgendes Aufrufe:

    PHP-Code:
    $validatorTest = new \Zend\Validator\EmailAddress();
    $vtranslator $validatorTest->getTranslator();
    echo 
    $vtranslator->translate("Invalid type given. String expected"); 
    Bekomme ich die Meldung: Call to a member function translate() on a non-object

    Sollte ich an dieser Stelle nicht einen gültigen Translator bekommen (eben wegen AbstractValidator:setDefaultTranslator)?

    edit: Seltsam ist, wenn ich alles hintereinander weg aufrufe, klappt es:

    PHP-Code:
    echo "<hr />";
    $translator = new \Zend\Mvc\I18n\Translator();

    echo 
    "<hr />";
    $translator->addTranslationFile(
        
    'phpArray',
        
    'vendor/zendframework/zendframework/resources/languages/de/Zend_Validate.php'
    );

    $translator->setLocale('de_DE');
    echo 
    "<hr />";

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

    $validatorTest = new \Zend\Validator\EmailAddress();
    $vtranslator $validatorTest->getTranslator();
    echo 
    $vtranslator->translate("Invalid type given. String expected"); 
    Geändert von dennis! (24.10.2013 um 15:57 Uhr)

  10. #10
    Benutzer
    Registriert seit
    15.06.2012
    Beiträge
    32
    Thanks
    1
    Thanked 9 Times in 3 Posts

    Standard

    Ich mach mal weiter hier, damit man evtl. meine Überlegungen nachvollziehen kann. Jetzt wird es aus meiner Sicht ein wenig verrückt.

    Ein Auszug aus meinem InputFilter.

    Normal (geht nicht!)
    PHP-Code:
    $this->add(array(
        
    'name'     => 'tatdatum',
        
    'required' => true,
        
    'filters'  => array(
            array(
    'name' => 'StringTrim')
        ),
        
    'validators' => array(
            array(
    'name' => 'Date''options' => array('format' => 'd.m.Y'))
        )
    )); 
    Test (geht!)
    PHP-Code:
    $dateValidator = new \Zend\Validator\Date(array('format' => 'd.m.Y'));

    $this->add(array(
        
    'name'     => 'tatdatum',
        
    'required' => true,
        
    'filters'  => array(
            array(
    'name' => 'StringTrim')
        ),
        
    'validators' => array(
            
    $dateValidator,
        ),
    )); 
    Die Lösung oben wird nicht übersetzt. Die Lösung unten schon.

    Hinzu kommt, dass mein ApplicationListener irgendwie komisch (zumindest anders als ich gedacht habe) läuft. Ich hatte mein setupDefaultFormTranslation wie folgt angehängt:
    PHP-Code:
    $this->listeners[] = $events->attach(
                
    MvcEvent::EVENT_DISPATCH
                array(
    $this'setupDefaultFormTranslation')
            ); 
    Und das in der Application:nBootstrap angehängt:
    PHP-Code:
    $application $e->getTarget();
    $eventManager $application->getEventManager();
    $services $application->getServiceManager();

    // add application listener
    $eventManager->attachAggregate(new ApplicationListener()); 
    Ich habe es jetzt erstmal so in die onBootstrap geschrieben. Dann funktioniert das ganze wenigstens, wenn die Validatoren via new angelegt werden. Aber das kann doch so überhaupt nicht richtig sein, oder?

  11. #11
    Benutzer
    Registriert seit
    15.06.2012
    Beiträge
    32
    Thanks
    1
    Thanked 9 Times in 3 Posts

    Standard

    Und hier (tataaaaa), die Lösung (für mich? oder auch für andere? bitte, bitte mal testen)

    PHP-Code:
    $application $e->getTarget();
    $eventManager $application->getEventManager();
    $services $application->getServiceManager();

    $translator $services->get('MvcTranslator');
    $translator->addTranslationFile(
        
    'phpArray',
        
    'vendor/zendframework/zendframework/resources/languages/de/Zend_Validate.php'
    );

    $translator->setLocale('de_DE');

    \
    Zend\Validator\AbstractValidator::setDefaultTranslator($translator); 
    So werden sowohl Validatoren, die mit new erzeugt werden, als auch solche, die aus dem ValidatorPluginManager geladen werden mit dem (Mvc)Translator versorgt.


    Um das noch mal zusammen zu fassen. Ich hatte zwei Fehler bei mir drin.

    1. Der Listener war falsch an das MvcEvent::EVENT_DISPATCH angehängt. Der Code wurde erst nach der Ausführung der *Action Methode ausgeführt. -> Priorität bei attach()

    2. Ich habe wahllos einen eigenen Translator erstellt (wie viele, viele andere aber wohl auch). Das funktioniert aber nicht, wenn die Validatoren über den ValidatorPluginManager erstellt werden. Denn dort wird folgendes ausgeführt:

    Zeilen 137-145 in Zend\Validator\ValidatorPluginManager
    PHP-Code:
    public function injectTranslator($validator)
    {
        if (
    $validator instanceof Translator\TranslatorAwareInterface) {
            
    $locator $this->getServiceLocator();
            if (
    $locator && $locator->has('MvcTranslator')) {
                
    $validator->setTranslator($locator->get('MvcTranslator'));
            }
        }

    Die Lösung war hier, dem MvcTranslator aus dem ServiceManager die o.g. Zend_Validate.php bekannt zu machen.


    __________________________________________________ _____________________________________________
    Edit: Der Code steht so (noch) in der Application:: onBootstrap
    Edit2: Der Code steht jetzt da wo er hin soll, im ApplicationListener (das aber nur am Rande).
    Geändert von dennis! (24.10.2013 um 16:39 Uhr)

  12. #12
    Benutzer
    Registriert seit
    30.05.2009
    Ort
    München
    Beiträge
    84
    Thanks
    0
    Thanked 37 Times in 14 Posts

    Standard

    Zitat Zitat von dennis! Beitrag anzeigen
    Und hier (tataaaaa), die Lösung (für mich? oder auch für andere? bitte, bitte mal testen)

    PHP-Code:
    $application $e->getTarget();
    $eventManager $application->getEventManager();
    $services $application->getServiceManager();

    $translator $services->get('MvcTranslator');
    $translator->addTranslationFile(
        
    'phpArray',
        
    'vendor/zendframework/zendframework/resources/languages/de/Zend_Validate.php'
    );

    $translator->setLocale('de_DE');

    \
    Zend\Validator\AbstractValidator::setDefaultTranslator($translator); 
    So werden sowohl Validatoren, die mit new erzeugt werden, als auch solche, die aus dem ValidatorPluginManager geladen werden mit dem (Mvc)Translator versorgt.


    Um das noch mal zusammen zu fassen. Ich hatte zwei Fehler bei mir drin.

    1. Der Listener war falsch an das MvcEvent::EVENT_DISPATCH angehängt. Der Code wurde erst nach der Ausführung der *Action Methode ausgeführt. -> Priorität bei attach()

    2. Ich habe wahllos einen eigenen Translator erstellt (wie viele, viele andere aber wohl auch). Das funktioniert aber nicht, wenn die Validatoren über den ValidatorPluginManager erstellt werden. Denn dort wird folgendes ausgeführt:

    Zeilen 137-145 in Zend\Validator\ValidatorPluginManager
    PHP-Code:
    public function injectTranslator($validator)
    {
        if (
    $validator instanceof Translator\TranslatorAwareInterface) {
            
    $locator $this->getServiceLocator();
            if (
    $locator && $locator->has('MvcTranslator')) {
                
    $validator->setTranslator($locator->get('MvcTranslator'));
            }
        }

    Die Lösung war hier, dem MvcTranslator aus dem ServiceManager die o.g. Zend_Validate.php bekannt zu machen.


    __________________________________________________ _____________________________________________
    Edit: Der Code steht so (noch) in der Application:: onBootstrap
    Edit2: Der Code steht jetzt da wo er hin soll, im ApplicationListener (das aber nur am Rande).

    Einfach in der service config (oder in der module.php, falls du deine pluginmanager nicht ausgelagert hast) den mvctranslator als invokable bekannt machen oder über einen alias auf deinen bereits registrierten translator zeigen lassen. Der muss dann allerdings das Zend\Validator\Translator\TranslatorInterface implementieren.

    steht alles hier

    Ich konnte aus deinem Post leider nicht ersehen ob du das so getan hast

  13. #13
    Benutzer
    Registriert seit
    15.06.2012
    Beiträge
    32
    Thanks
    1
    Thanked 9 Times in 3 Posts

    Standard

    Zitat Zitat von michl Beitrag anzeigen
    Einfach in der service config (oder in der module.php, falls du deine pluginmanager nicht ausgelagert hast) den mvctranslator als invokable bekannt machen oder über einen alias auf deinen bereits registrierten translator zeigen lassen. Der muss dann allerdings das Zend\Validator\Translator\TranslatorInterface implementieren.

    steht alles hier

    Ich konnte aus deinem Post leider nicht ersehen ob du das so getan hast
    Ist in der ZendSkeletonApplication doch alles schon getan, oder nicht?
    /module/Application/config/module.config.php
    PHP-Code:
    'service_manager' => array(        'aliases' => array(            'translator' => 'MvcTranslator'
    Irgendwie hatte es dennoch nicht funktioniert. Möglicher Weise habe ich aber auch andere Dinge durcheinander gebracht.

    Edit: Naja, im o.g. Zeilen 137-145 in Zend\Validator\ValidatorPluginManager wird ja auch explizit der MvcTranslator geholt.

    Geändert von dennis! (11.11.2013 um 10:44 Uhr)

Ähnliche Themen

  1. Translator in DI
    Von derPetz im Forum ZF2 Lokalisierung & Internationalisierung
    Antworten: 7
    Letzter Beitrag: 29.08.2013, 14:41
  2. Translator für Select-Box Einträge ausschalten?
    Von claudia.sagner im Forum ZF2 Formulare
    Antworten: 2
    Letzter Beitrag: 28.05.2013, 17:26
  3. Unterschied de_de und de beim Translator
    Von cream im Forum ZF2 Lokalisierung & Internationalisierung
    Antworten: 1
    Letzter Beitrag: 20.05.2013, 00:21
  4. Translator pro Modul
    Von derPetz im Forum ZF2 Lokalisierung & Internationalisierung
    Antworten: 2
    Letzter Beitrag: 05.04.2013, 16:23
  5. Message: Could not find a translator
    Von Innocentus im Forum ZF2 Grundlagen
    Antworten: 3
    Letzter Beitrag: 29.03.2012, 16:11

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •