[Symfony2] Vertalen van Validator messages

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Struikrover
  • Registratie: Juni 2005
  • Laatst online: 09-09 07:28
Hoi Tweakers,

Ik zit met een onverklaarbaar probleem met betrekking tot het vertalen van foutmeldingen van validatie berichten binnen Symfony2.

Ik gebruik een standaard validator om mijn Entity te valideren en indien een of meerdere velden fout zijn presenteer ik deze aan de gebruiker. Er wordt echter nooit een foutmelding vertaald door symfony. In plaats daarvan krijg ik gewoon de identifier die ik gebruik voor het vertalen terug. Ik verwacht dat niet, omdat Symfony bij het ontbreken van een vertaling terug moet vallen op zijn fallback locale, welke gewoon op Engels staat.

Code
Mijn relevante code is als volgt. Ik heb verkorte namespaces gebruikt om te verduidelijken waar alle code zich bevind.

Validatie van Entity:
Locatie: \CMSBundle\Controllers\AjaxPageController.php
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
        $t = $this -> get('translator');
        ....
        $page = new \PageBundle\Entity\Page(); //Page is mijn Entity
        ....
        //hier worden de properties van $page geset
        ....
        $validator = $this -> get('validator');
        
        $errors = $validator -> validate($page);
        foreach($errors as $error)
        {
            array_push($errors_readable, array('fieldName' => $t -> trans($error -> getPropertyPath()), 'fieldError' => $error -> getMessage()));
        }


Validator bestand
\CMSBundle\Resources\translations\validators.nl.yml
staat tevens op de volgende plaatsen, en op alle plaatsen ook nogmaals onder de naam 'validators.nl_NL.yml' :
\PageBundle\Resources\translations\validators.nl.yml
app\Resources\translations\validators.nl.yml

code:
1
2
3
4
5
6
7
page:
    title:
        notblank: Er is geen titel ingevuld.
        notnull: Er is geen titel ingevuld.
    content:
        notblank: Er is geen inhoud opgegeven.
        notnull: Er is geen inhoud meegestuurd.


Validatie bestand voor 'Page' Entity:
Locatie: \PageBundle\Resources\config\validation.yml
code:
1
2
3
4
5
6
7
8
9
10
11
12
\PageBundle\Entity\Page:
    constraints:
        - Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity: ref
    properties:
        name:
            - NotBlank: { message: "page.title.notblank" }
            - MaxLength: 128
        content:
            - NotBlank: { message: "page.content.notblank" }
            - NotNull: { message: "page.content.notnull" }
        menu:
            - Valid: ~


Ik heb meerder malen mijn cache gecleared, dus daar ligt het niet aan. Het resultaat van de foutmeldingen (dus hetgeen ik als foutmeldingen ophaal) wordt teruggestuurd bij een AJAX call, geëncodeerd als JSON.
Het gekke is dat mijn normale vertaal meldingen wel gewoon vertaald worden, via \Bundle\Resources\translations\messages.yml, maar de validator messages dus niet.

Wat ik in plaats daarvan zie is bijvoorbeeld:

code:
1
2
3
De pagina kon niet worden opgeslagen. Corrigeer onderstaande fouten en probeer het opnieuw:
Titel : page.title.notblank
content : page.content.notblank


Dit is vreemd, want Symfony zou terugmoeten vallen op de fallback locale, welke de standaard Engelse berichten zijn.

Wie o wie kan mij helpen?

[ Voor 29% gewijzigd door Struikrover op 11-08-2012 19:53 ]


Acties:
  • 0 Henk 'm!

  • X_lawl_X
  • Registratie: September 2009
  • Laatst online: 11-09 16:13
Zonder naar je code te kijken - heb je al gekeken of je de laatste versie van het framework gebruikt? Ik had een tijdje terug met symfony ook een vreemd probleem. Later bleekt dat het probleem wat ik had een bug was wat opgelost was in een nieuwere versie.

Acties:
  • 0 Henk 'm!

  • Struikrover
  • Registratie: Juni 2005
  • Laatst online: 09-09 07:28
Ik gebruik versie 2.0.16, de laatste stabiele versie die voor 2.1 beta RC1 komt. Alle bundles zijn geüpdatet naar de meest recente versie. Wat natuurlijk niet wil zeggen dat er geen bugs in voor kunnen komen, maar vooralsnog hoop ik op een simpele oplossing.

Acties:
  • 0 Henk 'm!

  • Manuel
  • Registratie: Maart 2008
  • Laatst online: 17:22
Als je onderstaande code eens in je Twig template zet (gewoon om te testen):
HTML:
1
{{ "page.title.notblank"|trans({}, "validators") }}


Als het goed is zou je nu "Er is geen titel ingevuld." moeten zien. Ik heb echt het idee dat het aan de message catalogue ligt.

Acties:
  • 0 Henk 'm!

  • Struikrover
  • Registratie: Juni 2005
  • Laatst online: 09-09 07:28
Heh, ik zie inderdaad "Er is geen titel ingevuld". Dus het validators domain werkt wel, maar op de een of andere manier wordt hij niet aangeroepen bij het genereren van de validator melding?

Acties:
  • 0 Henk 'm!

  • Struikrover
  • Registratie: Juni 2005
  • Laatst online: 09-09 07:28
Het lag niet aan de message catalogus. Ik was simpelweg vergeten de translator aan te roepen op mijn message.

De oplossing:

Vooraf:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        $t = $this -> get('translator');
        .... 
        $page = new \PageBundle\Entity\Page(); //Page is mijn Entity 
        .... 
        //hier worden de properties van $page geset 
        .... 
        $validator = $this -> get('validator'); 
         
        $errors = $validator -> validate($page); 
        foreach($errors as $error) 
        { 
            array_push($errors_readable, array(
                'fieldName' => $t -> trans($error -> getPropertyPath()), 
                'fieldError' => $error -> getMessage()
             )); 
        }


Achteraf:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        $t = $this -> get('translator');
        .... 
        $page = new \PageBundle\Entity\Page(); //Page is mijn Entity 
        .... 
        //hier worden de properties van $page geset 
        .... 
        $validator = $this -> get('validator'); 
         
        $errors = $validator -> validate($page); 
        foreach($errors as $error) 
        { 
            array_push($errors_readable, array(
                'fieldName' => $t -> trans($error -> getPropertyPath()), 
                'fieldError' => $t -> trans($error -> getMessage(), array(), "validators")
             )); 
        }


Of het anders automatisch had moeten gaan weet ik (nog) niet, het werkt zo in ieder geval.

Bedankt voor het rubberducken O-)

[ Voor 6% gewijzigd door Struikrover op 11-08-2012 19:54 ]

Pagina: 1