IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

traduction d'informations dans différentes langues


Sujet :

Symfony PHP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    501
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 501
    Points : 102
    Points
    102
    Par défaut traduction d'informations dans différentes langues
    Bonjour, je travail actuellement sur la traduction de mon site dans certaine langue étrangère, et pour le moment je teste mes langue en modifiant la local:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $request->setLocale('en_US');
    mais je voudrais savoir comment ce déroule le processus par exemple pour un utilisateur Allemand qui vera mon site traduit en allemand, car ici il n'est plus question de variable local ou Symfony intercepte que le navigateur ou l'utilisateur est Allemand.

    Je suis en pleine confusion!

  2. #2
    Membre averti

    Inscrit en
    Juin 2008
    Messages
    307
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 307
    Points : 364
    Points
    364
    Par défaut
    Il existe de nombreux tutoriaux qui expliquent cela très bien notamment sur developpez.com

    et la doc officielle :

    http://symfony.com/doc/current/book/translation.html

    Olivier

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    501
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 501
    Points : 102
    Points
    102
    Par défaut
    bonjour l'ami, je connais ces différentes doc mais je voudrais des infos notamment sur ce que j'ai mentionné dans le précédent post.
    Comme par exemple l'utilisateur Anglais ne doit tout de même pas entrer url suivante pour avoir le site en anglais

    et un utilsateur belge
    c'est bon pour les test local mais dans un cas réel quelle url entre dans la barre d'adresse l'utilisateur

    Merci

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 168
    Points : 219
    Points
    219

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    501
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 501
    Points : 102
    Points
    102
    Par défaut
    merci goabonga, mais après lecture de ta documentation je ne sais pouvoir l'utiliser.

    Comment le processus de traduction pour un utilisateur étranger ce met en place ?

    le paramètre "default_local" est doit être toujours à 'fr' je pige pas

  6. #6
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Points : 1 050
    Points
    1 050
    Par défaut
    Bonjour

    dans un cas réel quelle url entre dans la barre d'adresse l'utilisateur
    les url seront du type www.monsite.com/fr/index, www.monsite.com/en/index , etc...

    Il suffit dans ton fichier routing de spécifier un prefixe à une collection de route, et toutes ces routes seront préfixé par la locale

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    mon_bundle
      ressource: @MonBundle:Controller
      type: annotation
      prefix:/{_locale}

    A partir de là faire un language switcher dans twig est assez simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    {%for locale,lang in {'en':'Anglais','fr':'Français'} %}
       <a href="{{url('ma_route_index',{'_locale':locale})}}">lang</a>
    {%endfor%}

  7. #7
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2012
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 133
    Points : 208
    Points
    208
    Par défaut
    Salut,

    Sur ma dernière application Symfony2, j'ai créé un service qui écoute les évènements du kernel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            tags:
                - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }
                - { name: kernel.event_listener, event: kernel.response, method: onKernelResponse }
                - { name: kernel.event_listener, event: kernel.exception, method: onKernelException }
    Et pour chacune des trois méthodes appelées, j'applique la locale soumise par le navigateur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $request = $event->getRequest();
    $locale = $request->getPreferredLanguage(array('fr_FR', 'fr', 'en_UK', 'en_US', 'en', ...));
    $request->setLocale($locale);
    Avantage de la manœuvre, c'est la même url qui est appelée quelque soit la langue.
    Inconvénient, on ne peut pas changer de langue en changeant juste l'url, il faut mettre en place un formulaire exprès qui va outrepasser le code ci-dessus.
    Par ailleurs, niveau référencement c'est pas bon puisque le google bot ne verra qu'une seule langue.

    C'est donc un système a n'utiliser que pour une application et non pas pour un site à référencer.

    ++

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    501
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 501
    Points : 102
    Points
    102
    Par défaut
    Mesage pour arnooo999,

    Ton astuce de passser donner la possibilité a l'utilisateur de changer ca langue est trés intéréssant, mais j'aurais voulu que l'ulisateur aprés avoir tapé l'url du site ce retrouve avec le site dans sa langue.

    Avec les lignes ci-dessous et la langue du navigateur, le site ce mais dans la langue de l'utilisateura condition qu'elle soit mentionné dans dans le tableau en parametre de la methode "getPreferredLanguage"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     $request = $this->getRequest();
     $locale = $request->getPreferredLanguage(array('fr_FR', 'fr', 'en_UK', 'en_US', 'en'));
    $request->setLocale($locale);
    var_dump($request->getLocale());

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    501
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 501
    Points : 102
    Points
    102
    Par défaut
    message pour lilalex


    J'ai réalisé une sorte de service en dans la config de mon application symfony comme ce ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    services:
    app_bundle.listener.locale_listener:
    class: AppBundle\Listener\LocaleListener
    arguments: [@router, %locale%, %locales%]
    scope: request
    tags:
    - { name: kernel.event_listener, event: kernel.request , method: onKernelRequest }
    Je réussi donc a récupéré la langue:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    array (size=1)
      '_locale' => string 'en' (length=2)
     
    string '/?_locale=en' (length=12)
    la classe LocaleListener à cette ligne genere une nouvelle url ne prenant ma route et les parametres en parametre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $url = $this->getRouter()->generate($route, array_merge($params,$query));
    donc moi cela me donne ceci, la route est formé de cette maniére:
    moi je voudrais donc:
    donc je passe un parametre {_locale} pour l'avoir de cette forme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $url = $this->getRouter()->generate('maroute', $array('_locale' =>  'en' );
    et voici ma route:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    maroute:
        resource: "@FrontendDefaultBundle/Resources/config/routing.yml"
        prefix:   /{_locale}
    Et pouf erreur.
    Une erreur sur l'erreur suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ( ! ) Fatal error: Uncaught exception 'Symfony\Component\Routing\Exception\ResourceNotFoundException' in F:\projets\monprojets\app\cache\dev\classes.php on line 1881
    ( ! ) Symfony\Component\Routing\Exception\ResourceNotFoundException: in F:\projets\monprojets\app\cache\dev\appDevUrlMatcher.php on line 617
    Merci les amis

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    501
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 501
    Points : 102
    Points
    102
    Par défaut
    Pour les utilisateur que cela intérésse j'ai résolu le probléme:

    Je rappel que j'ai utilisé le lien de goabonga

    Donc au parametre $route j'ai l'obligation de l'ecrire en dur ( il se pourrait que goabonga sache pourquoi)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $url = $this->getRouter()->generate($route, array_merge($params,$query));
    Devien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $url = $this->getRouter()->generate('maroute', array_merge($params,$query));
    Donc au chargement de l'application:

    http://monapplication/

    Devien
    http://monapplication/en

    Selon la langue du navigateur
    Car dans les différente documentation, il figure que c'est l'utilisateur qui doit indiquer la langue dans l'url.
    A cette endroit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Voici ce que cela donne sur notre route de test :
     
    # app/config/routing_dev.yml
    oc_platform_translation:
        path: /{_locale}/traduction/{name}
        defaults: { _controller: "OCPlatformBundle:Advert:translation" }
     
    Les paramètres de route sont différents des variables que vous pouvez passer en GET. Ainsi, l'URL /traduction/winzou?_locale=ur ne traduira pas votre page (en ourdou dans le cas présent), car ici _locale n'est pas un paramètre de route.
     
    Vous pouvez déjà tester en essayant /fr/traduction/winzou ou /de/traduction/winzou, le contenu de la page est bien traduit.

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    501
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 501
    Points : 102
    Points
    102
    Par défaut
    Bonjour, je revien vers vous les amis, enfin si certain d'entre vous suivent encore mon post, peut être qu'ils en ont marre

    Bon en faite je disais dans le message précédent que tout étais résolut et que mon url final étais de la forme suivante aprés le service d'ecoute:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    http://monapplication/en
    Mais il ce trouve que, pour l'entité LocalListener:https://gist.github.com/goabonga/99161a077a246e4c5ed3
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    http://monapplication/fr
    //cela ne fonctionne pas la reponse plante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     public function onKernelRequest(GetResponseEvent $event)
    {
    /** @var \Symfony\Component\HttpFoundation\Request $request */
    $request = $event->getRequest();
    $locale = $request->get('_locale', $this->getDefaultLocale());
    $route = $request->attributes->get('_route');
    $params = $request->attributes->get('_route_params');
    $query = $request->query->all();
    $uaLocale = $request->getPreferredLanguage($this->getLocales());
    if ($locale !== $uaLocale) {
    $params['_locale'] = $uaLocale;
    $url = $this->getRouter()->generate($route, array_merge($params,$query));
    /** @var \Symfony\Component\HttpFoundation\RedirectResponse $response */
    $response = new RedirectResponse($url);
    $event->setResponse($response);
    }
    }
    Ils ce trouve que quand la condition n'est pas résolut donc $local == $ualocal

    Donc si pour exemple pour nous les francais:
    $locale = fr;
    $uaLocale= fr;
    if('fr'!=='fr'){
    traitement
    }
    la condition n'est pas résolu donc aucune réponse

    Donc j'ai retiré la condition pour:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     public function onKernelRequest(GetResponseEvent $event)
    {
    /** @var \Symfony\Component\HttpFoundation\Request $request */
    $request = $event->getRequest();
    $locale = $request->get('_locale', $this->getDefaultLocale());
    $route = $request->attributes->get('_route');
    $params = $request->attributes->get('_route_params');
    $query = $request->query->all();
    $uaLocale = $request->getPreferredLanguage($this->getLocales());
     
    $params['_locale'] = $uaLocale;
    $url = $this->getRouter()->generate($route, array_merge($params,$query));
    /** @var \Symfony\Component\HttpFoundation\RedirectResponse $response */
    $response = new RedirectResponse($url);
    $event->setResponse($response);
     
    }
    Maintenant tout le process plante à la methode "$event->setResponse($response);"
    l'url ($url) est bien bonne:
    var_dump($url);exit;
    string '/en/' (length=4)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    http://monapplication/en
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    http://monapplication/fr
    s'il n'y pas la condition dans la fonction "onKernelRequest", le process plante pour n'importe quel langue ($locales )

    Mon fichier config:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    locale: fr
        locales: fr|de|en 
    services:
        app_bundle.listener.locale_listener:
            class: Backend\UtilityBundle\Listener\LocaleListener
            arguments: [@router, %locale%, %locales%]
            scope: request
            tags:
                - { name: kernel.event_listener, event: kernel.request , method: onKernelRequest }
    merci les amis

Discussions similaires

  1. Réponses: 1
    Dernier message: 26/03/2014, 07h06
  2. Réponses: 1
    Dernier message: 08/08/2011, 18h40
  3. Réponses: 3
    Dernier message: 16/10/2008, 09h26
  4. [GD] Différentes informations dans une image.
    Par ~~PriVate JoKe~~ dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 16/11/2006, 22h29
  5. [Installation] dans une langue différente
    Par max44410 dans le forum Windows XP
    Réponses: 2
    Dernier message: 01/09/2006, 13h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo