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 :

Site multilingue avec variable dans l'URL


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2012
    Messages : 42
    Par défaut Site multilingue avec variable dans l'URL
    Bonjour à tous.

    Je souhaite re-coder mon site sous symfony2.

    Je souhaite que celui-ci soit multi-langues. Voici ce que j'ai fait pour le moment:

    J'ai donc instaurer dans chaque path une variable _locale qui déterminera la langue. Je veux donc que les URL soit de cette forme :www.monsite.com/fr ou www.monsite.com/de, etc.. Pour les autres pages, ça suivra la même logique : www.monsite.com/fr/documents , etc...

    Voici mon routing.yml de base (dans app) :
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    collaide_domain:
        resource: "@CollaideDomainBundle/Resources/config/routing.yml"
        prefix:   /{_locale}/domains
        defaults: {_locale: null}
        requirements:
            _locale: en|fr|de|dev
     
    collaide_document:
        resource: "@CollaideDocumentBundle/Resources/config/routing.yml"
        prefix:   /{_locale}/documents
        defaults: {_locale: null}
        requirements:
            _locale: en|fr|de|dev
     
    collaide_user:
        resource: "@CollaideUserBundle/Resources/config/routing.yml"
        prefix:   /{_locale}
        defaults: {_locale: null}
        requirements:
            _locale: en|fr|de|dev
     
    fos_user_security:
        resource: "@FOSUserBundle/Resources/config/routing/security.xml"
        prefix: /{_locale}
        defaults: {_locale: null}
        requirements:
            _locale: en|fr|de|dev
     
    fos_user_profile:
        resource: "@FOSUserBundle/Resources/config/routing/profile.xml"
        prefix: /{_locale}/profile
        defaults: {_locale: null}
        requirements:
            _locale: en|fr|de|dev
     
    fos_user_register:
        resource: "@FOSUserBundle/Resources/config/routing/registration.xml"
        prefix: /{_locale}/register
        defaults: {_locale: null}
        requirements:
            _locale: en|fr|de|dev
     
    fos_user_resetting:
        resource: "@FOSUserBundle/Resources/config/routing/resetting.xml"
        prefix: /{_locale}/resetting
        defaults: {_locale: null}
        requirements:
            _locale: en|fr|de|dev
     
    fos_user_change_password:
        resource: "@FOSUserBundle/Resources/config/routing/change_password.xml"
        prefix: /{_locale}/profile
        defaults: {_locale: null}
        requirements:
            _locale: en|fr|de|dev
     
    collaide_main:
        resource: "@CollaideMainBundle/Resources/config/routing.yml"
        prefix:   /{_locale}
        defaults: {_locale: null}
        requirements:
            _locale: en|fr|de|dev
    Le problème, c'est que la j'ai énormément de code à double ! Je viens donc vous demander si ma façon de procédé est correct. Sinon, comment dois-je procéder pour faire les choses le plus proprement possible?

    J'ai aussi un autre soucis. J'aimerais, dans le header, donner la possibilité à l'utilisateur de choisir la langue. Pour le moment, j'ai donc mis ça dans le layout de base (dans app) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <ul id="choose_language">{{"body.language.choose"|trans}}:
                            <li><a href="{{path('collaide_main_index', {'_locale':'fr'})}}">{{"body.language.french"|trans}}</a> </li>
                            <li><a href="{{path('collaide_main_index', {'_locale':'en'})}}">{{"body.language.english"|trans}}</a> </li>
                            <li><a href="{{path('collaide_main_index', {'_locale':'de'})}}">{{"body.language.german"|trans}}</a></li>
                            <li><a href="{{path('collaide_main_index', {'_locale':'dev'})}}">{{"body.language.developement"|trans}}</a></li>
                        </ul>

    Le problème avec ce code, c'est que lorsque l'utilisateur clique sur une langue, il est redirigé directement sur la page d'accueil (normal, vu la route). Comme faire pour donc mettre la route de la page actuelle ?

    J'espère avoir été assez clair dans l'explication de mon problème.

    Merci d'avance pour vos réponses.

  2. #2
    Membre régulier
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Novembre 2011
    Messages : 11
    Par défaut
    Salut, voila comment j'ai fait moi,
    Dans /app/config/routing.php :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <?php
     
    use Symfony\Component\Routing\RouteCollection;
     
    $collection = new RouteCollection();
     
    $collection->addCollection($loader->import("@NamespaceTonBundle/Resources/config/routing.yml"));
     
    $collection->addPrefix('/{_locale}', array('_locale' => 'fr'), array('_locale' => 'fr|en'));
     
    return $collection;
    Et dans ton config.yml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        router:
            resource: "%kernel.root_dir%/config/routing.php"
    Et sinon pour changer de langue, tu a le nom de la route disponible dans twig : app.request.attributes.get('_route'), ce qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    {{ path(app.request.attributes.get('_route'), {'_locale':'fr'}) }}

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2012
    Messages : 42
    Par défaut
    Alors déjà, merci énormément !!

    Pour les path, ça fonctionne parfaitement !

    Cependant, pour le routing.php ça ne fonctionne pas encore, mais je pense qu'on est pas loin du tout...

    Déjà, moi j'ai mis mes routes principales dans /app/resources/config/routing.yml (CF dans mon premier poste). Ce routing.yml appelle les routings des bundles.. Normal.

    Ensuite, j'ai créer un /app/resources/config/routing.php comme tu m'as dit de faire. J'ai mis dedans le code que tu m'as donné. Cependant dans le code que tu me donne tu dis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $collection->addCollection($loader->import("@NamespaceTonBundle/Resources/config/routing.yml"));
    Mais moi j'aimerais que $collection contienne toutes les routes, et pas seulement celle d'un bundle. J'ai donc changer par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $collection->addCollection($loader->import("/app/Resources/config/routing.yml"));
    Est-ce aussi correct ainsi ?

    Ensuite j'ai modifié mon config.yml ainsi :
    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
    imports:
        - { resource: parameters.yml }
        - { resource: security.yml }
     
    framework:
        #esi:             ~
        translator:      { fallback: fr }
        session:
            default_locale: fr
        secret:          %secret%
        router:
            resource: "%kernel.root_dir%/config/routing.php"
            resource: "%kernel.root_dir%/config/routing.yml"
            strict_requirements: %kernel.debug%
        form:            true
        csrf_protection: true
    ....... etc.....
    Et puis j'ai viré les _local de mon /app/resources/config/routing.yml (vu que le routing.php les ajoutes).

    J'ai ensuite lancé une page http://localhost/collaide/web/app_de.../domains/crud/
    Mais il me dit qu'il n'y a pas de route pour cette page.. J'ai ensuite essayer d'enlever le /fr et ça fonctionnait (il n'a donc pas ajouter les prefix /_local)..
    Donc pour le moment ça ne fonctionne pas.

    Sais-tu d'ou peut provenir le problème ?

    Merci beaucoup, c'est déjà super que tu m'as donné cette fonction twig !!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {{path(app.request.attributes.get('_route'), {'_locale':'dev'})}}

  4. #4
    Membre régulier
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Novembre 2011
    Messages : 11
    Par défaut
    En fait, le routing.php remplace le routing.yml. Donc tu oublie le
    resource: "%kernel.root_dir%/config/routing.yml"
    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
     
    <?php
     
    use Symfony\Component\Routing\RouteCollection;
     
    $collection = new RouteCollection();
     
    $collection->addCollection($loader->import("@NamespaceTonBundle/Resources/config/routing.yml"));
    $collection->addCollection($loader->import("@NamespaceTonBundle2/Resources/config/routing.yml"));
    $collection->addCollection($loader->import("@NamespaceTonBundle3/Resources/config/routing.yml"));
     
     
    $collection->addPrefix('/{_locale}', array('_locale' => 'fr'), array('_locale' => 'fr|en'));
     
    return $collection;

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2012
    Messages : 42
    Par défaut
    Merci pour ces précisions !

    Et comment j'ajoute alors mes prefix par bundle ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    collaide_domain:
        resource: "@CollaideDomainBundle/Resources/config/routing.yml"
        prefix:   /{_locale}/domains
     
    collaide_document:
        resource: "@CollaideDocumentBundle/Resources/config/routing.yml"
        prefix:   /{_locale}/documents
    Et j'ai une deuxième question..
    J'ai la route pour ma page d'acceuil :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    collaide_main:
        resource: "@CollaideMainBundle/Resources/config/routing.yml"
        prefix:   /{_locale}
        defaults: {_locale: null}
        requirements:
            _locale: en|fr|de|dev
    _locale devrait être facultatif mais il ne l'ai pas. Si je vais sur la page /, il ne trouve rien, je dois obligatoirement mettre en, fr, de ou dev..

    Merci d'avance !

  6. #6
    Membre régulier
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Novembre 2011
    Messages : 11
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    // app/config/routing.php
    use Symfony\Component\Routing\RouteCollection;
     
    $collection = new RouteCollection();
    $collection->addCollection($loader->import("@CollaideDomainBundle/Resources/config/routing.yml"), '/domains');
    $collection->addCollection($loader->import("@CollaideDocumentBundle/Resources/config/routing.yml"), '/documents');
     
    $collection->addPrefix('/{_locale}', array('_locale' => 'fr'), array('_locale' => 'en|fr|de|dev'));
     
    return $collection;
    Voila comment ton fichier devrait se présenter. La local par défaut est bien définie ici : array('_locale' => 'fr'), donc logiquement quand tu accède depuis / , ça devrait fonctionner.

Discussions similaires

  1. URL avec variable dans le src d'une image
    Par PedroBD dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 24/04/2014, 15h29
  2. Réponses: 5
    Dernier message: 16/12/2012, 21h21
  3. Envoi de variable avec incrément dans l'URL
    Par Hybride76 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 03/03/2011, 14h23
  4. [MySQL] Lien avec variable dans l'URL
    Par mikael2235 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 21/01/2010, 08h33
  5. [Tableaux] Variable dans l'url avec EasyPhp 1.8
    Par zoheir_hm dans le forum Langage
    Réponses: 6
    Dernier message: 24/06/2006, 16h14

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