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

Langage PHP Discussion :

[Tableaux] Réécrire liens internes pour un site multilangue [Fait]


Sujet :

Langage PHP

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 4
    Points : 3
    Points
    3
    Par défaut [Tableaux] Réécrire liens internes pour un site multilangue
    Bonjour,
    j'ai un site web en 3 langues (anglais, allemand, francais).

    J'ai fait la traduction par des tableaux de variables. C'est-à-dire que j'ai ce genre de fichiers :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    translation.php :
     
    $LHome = array("Home","Home","Accueil") ;
    $LSitemap = array("Sitemap","Sitemap","Plan du site") ;
    $LContact = array("Contact","Kontakt","Contact") ;
    $LAboutUs = array("About us","Impressum","Qui sommes-nous ?") ;
     
    $LLanguage = substr( $HTTP_ACCEPT_LANGUAGE, 0, 2) ;
     
    $Ll = 0 ; // anglais par defaut
    if     ($LLanguage == 'en' ) { $Ll = 0 ; }
    elseif ($LLanguage == 'de' ) { $Ll = 1 ; }
    elseif ($LLanguage == 'fr' ) { $Ll = 2 ; }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    header.php
     
    include("translation.php")
     
    <a href=...> <? echo $LHome[$Ll] ?> </a> - 
    <a href=...> <? echo $LSitemap[$Ll] ?> </a> - 
    <a href=...> <? echo $LContact[$Ll] ?> </a> - 
    etc.
    Ainsi, la langue du site se calque sur la configuration du navigateur. Cependant, j'aurai aimé qu'un-e utilisateur-trice puisse choisir aussi une autre langue que celle de son navigateur.

    J'ai donc changé le translation.php en :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $LLanguage = substr( $_SERVER["HTTP_ACCEPT_LANGUAGE"], 0, 2) ;
     
    if ($_REQUEST['lang'] == '') 
     
    {	if     ($LLanguage == 'en' ) { $Ll = 0 ; }
    	elseif ($LLanguage == 'de' ) { $Ll = 1 ; }
    	elseif ($LLanguage == 'fr' ) { $Ll = 2 ; }
    }
     
    else { $Ll = $_REQUEST['lang'] ; }
    et j'ai ajouté dans le header.php des petits drapeaux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $toutesleslangues = array('en','de','fr') ; // meme numerotation que dans translation.php
     
    for ($i=0 ; $i < count($toutesleslangues) ; $i++) 
    { echo '<a href="'.substr($_SERVER["REQUEST_URI"],1).'?lang='.$i.'" title="'.$toutesleslangues[$i].'"><img src="bilder/'.$toutesleslangues[$i].'.gif" alt="$toutesleslangues[$i]" width="18" height="13" border="0"</a>&nbsp;&nbsp;&nbsp;' ; }
    Si je suis sur la page index.php, cela fait donc trois petits gif en drapeaux qui donnent les liens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    index.php?lang=0
    index.php?lang=1
    index.php?lang=2
    Si mon navigateur est en francais, que je clique sur le drapeau allemand, ca me met bien le texte en allemand.
    Le problème est que ca ne garde pas en mémoire cette variable, ca veut dire que la page index.php contiendra des liens du type sitemap.php et non sitemap.php?lang=1 et me remettra la page dans la langue initiale.

    Une "solution" serait la suivante : si l'adresse précédente contient lang=x alors $LienLangue = "?lang=x", sinon $LienLangue = "", et réécrire chaque lien -lelien.php<? echo $LienLangue ?>

    Mais ce n'est pas envisageable de le faire en dur car il y a trop de liens et que beaucoup sont créés dynamiquement.

    Que me proposez-vous comme alternative ? Y'a-t-il un moyen de réécrire simplement tous les liens INTERNES avec "?lang=x" sans passer par les cookies ou les sessions ?

    Merci

  2. #2
    Membre du Club
    Inscrit en
    Août 2003
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 49
    Points : 55
    Points
    55
    Par défaut
    Hello,

    une méthode plus facile serai de sauvegarder la langue dans un cookie.

    Est-ce qu'il y a en get "lang=???" et qu'on la connait {
    Oui: On la stocke en cookie et dans notre variable "$lang"
    } si non {
    Est-ce qu'il y a un Cookie langue? {
    oui : $lang = langue du cookie
    } si non {
    non : $lang = langue de $HTTP_ACCEPT_LANGUAGE .
    cookie = $lang
    }
    }

    Voilà une théorie. Tu peux aussi utiliser les session au cas ou l'utilisateur n'accepte pas les cookie. Mais il devra de nouveau choisir la langue qd il reviendra sur ton site.

    ++

  3. #3
    Membre expert
    Avatar de trotters213
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 571
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 571
    Points : 3 145
    Points
    3 145
    Par défaut

    Utilise une session : tu démarres ta session dès le début puis dès que l'utilisateur change de langue tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $_SESSION['lang']='langue_selon_le_drapeau';
    et à chaque début de page tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $lang=$_SESSION['lang']
    ;

  4. #4
    Membre averti Avatar de mLk92
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    527
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 527
    Points : 305
    Points
    305
    Par défaut
    Ou sinon tu inclus où sont définis tes variables selon la langue.

    Toi en l'occurance tu as 3 langues, donc 3 fichier du style form-en, form-fr ou form-de.

    dans chacun d'eux tu fais un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    define("ACCUEIL", "Home");
    define("ACCUEIL", "Accueil");
    define("ACCUEIL", "Accueil en allemand ");
    Après tu ressort cela selon ton url, ex:

    Pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    http://www.tonurl.com/tapage.php?lang=en
    tu as :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if($_GET['lang'] == "en"){
    include('form-en.php');
    }
    Ainsi tu pourra définir énormément de mot que ce soit sur cette page ou d'autres.

  5. #5
    Membre du Club
    Inscrit en
    Août 2003
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 49
    Points : 55
    Points
    55
    Par défaut
    Il y avait des erreurs manqué dans l'algo que j'ai donné.
    On doit vérifier si l'utilisateur veux changer de langue via un lien malgré le cookie.

    Voilà le code que j'utilise. $_CONFIG['LANG'] est la variable ds laquelle je stocke la langue. chooseLang(), une fonction pour prendre la langue du navigateur.
    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
     
    if ( isset($_GET['lang']) ) {
        $_CONFIG['LANG'] = $_GET['lang'];
        if ( isset($_COOKIE['lang']) && ( $_COOKIE['lang'] <> $_CONFIG['LANG'] ) ) {
            setcookie( 'lang' , $_CONFIG['LANG'] , time()+60*60*24*30, '/', 'www.monsite.com');
        }
    } else {
        if ( isset($_COOKIE['lang']) ) {
            $_CONFIG['LANG'] = $_COOKIE['lang'];
        } else {
          $_CONFIG['LANG'] = chooseLang( $LANG_SUPPORTED );
          setcookie( 'lang' , $_CONFIG['LANG'] , time()+60*60*24*30, '/', 'www.monsite.com');
        }
        header('Location: http://www.monsite.com/'.$_CONFIG['LANG'].$_SERVER['REQUEST_URI']);
    }
    ++

  6. #6
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Salut

    Juste pour rappeler une adresse utile : http://php.developpez.com/cours/sessions/

    Sinon, plutôt que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    if($variable == 'valeur_1')
    {
       actions...
    }
    else if($variable == 'valeur_2')
    {
        actions...
    }
    else if($variable == 'valeur_3')
    {
        actions...
    }
    Je te recommande :
    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
    switch($variable)
    {
       case 'valeur_1':
          actions...
       break;
     
       case 'valeur_2':
          actions...
       break;
     
       case 'valeur_3':
          actions...
       break;
     
       default:
          actions...
    }
    Par ailleurs, ton code utilise un comportement très ancien qui est désormais déconseillé : les autoglobales. Attention à "$HTTP_ACCEPT_LANGUAGE", mais je vois que tu connais l'autre méthode (celle à utiliser)

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Ok, merci à tou-te-s pour vos réponses.

    J'ai pris la méthode des cookies.

    Voici mon code

    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
    header.php
     
    <?
    // drapeaux de langue 
     
    $toutesleslangues = array('en','de','fr') ; // meme numerotation que dans translation.php
     
    $urlbarre = substr($_SERVER["REQUEST_URI"],1) ; // adresse dans la barre 
     
    if ( strpos($urlbarre, 'lang=') ) { $urlbarre = substr($urlbarre, 0, strlen($urlbarre)-8) ; }  // on enleve le parametre ?lang=de par ex s'il existe
     
    if ( strpos($urlbarre, '?') ) { $signe = '&' ; } else { $signe = '?' ; } // ? ou & en fonction de l'(in)existance d'autres variables
     
    for ($i=0 ; $i < count($toutesleslangues) ; $i++) 
    { echo '<a href="'.$urlbarre.$signe.'lang='.$toutesleslangues[$i].'" title="'.$toutesleslangues[$i].'"><img src="bilder/'.$toutesleslangues[$i].'.gif" alt="'.$toutesleslangues[$i].'" width="18" height="13" border="0"></a>&nbsp;&nbsp;&nbsp;'."\n" ; }
    ?>
    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
    translation.php
     
    /* **************
    detection langue
    *****************/
     
    $LLanguage = substr( $_SERVER["HTTP_ACCEPT_LANGUAGE"], 0, 2) ;
     
    if ( isset($_GET['lang']) ) {
    	$_CONFIG['LANG'] = $_GET['lang'] ;
    	if ( isset($_COOKIE['lang']) && ( $_COOKIE['lang'] <> $_CONFIG['LANG'] ) ) { 
    		setcookie( 'lang' , $_CONFIG['LANG'] , time()+60*60*24*30 ) ;
    	}
    } else {
    	if ( isset($_COOKIE['lang']) ) {
    		$_CONFIG['LANG'] = $_COOKIE['lang'] ;
    	} else {
    		$_CONFIG['LANG'] = $LLanguage ;
    		setcookie( 'lang' , $_CONFIG['LANG'] , time()+60*60*24*30 ) ;
    	}
    }
     
    switch($_CONFIG['LANG']) {  
    case 'en': $Ll = 0 ; break ;
    case 'de': $Ll = 1 ; break ;
    case 'fr': $Ll = 2 ; break ;
    default: $Ll = 0 ;
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. CMS pour gros site multilangue
    Par Kruggs dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 05/12/2011, 13h26
  2. Pour un site multilangues
    Par Whombat dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 30/03/2009, 15h40
  3. [Cookies] Erreur de code pour un site multilangue
    Par MaTTuX_ dans le forum Langage
    Réponses: 2
    Dernier message: 25/08/2007, 22h23
  4. [FLASH 8] Lien interne a un site flash
    Par mailly dans le forum Flash
    Réponses: 5
    Dernier message: 19/01/2007, 22h37

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