Bonjour, Je suis en train de créer un site internet pour un ami qui a un restaurant et ce site doit être en plusieurs langues (ES, FR, EN, voire DE). Le site a 4 pages: - index.php - menu.php - galery.php - contact.php Débutant en php, j'ai cherché sur notre ami google et j'ai trouvé pas mal de réponse, me permettant d'arriver à cette solution qui fonctionne: 1. je détecte la langue du navigateur: [code]<?php if (!isset($Langue)) {
if(isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])){
$Langue = explode(",",$_SERVER['HTTP_ACCEPT_LANGUAGE']);
$Langue = strtolower(substr(chop($Langue[0]),0,2));
}
else {
$Langue = "fr";
}
} else {
$Langue="fr";
}
?>[/code] 2. ensuite j'incorpore les fichiers de langues selon la langue détectée avec la fonction include(); [code]<?php include("text.$Langue.php"); ?>[/code] 3. Pour éviter d'avoir des tous petits fichiers pour les titres, j'ai fait comme suit: [code]<?php switch($Langue) {
Case "en":
echo $Title = "welcome";
break;
Case "es":
echo $Title = "initio";
break;
Case "fr":
echo $Title = "accueil";
break;
default:
echo "initio";
}
?>[/code] Je sais pas si c'est la bonne méthode ou la méthode conventionnelle, mais cela fonctionne. J'ai fait de même avec les messages d'erreur dans le formulaire de contact. bref, tout cela marche. Cependant, il y a un cas de figure qui me pose problème. Ce cas est le suivant: Si un visiteur dont la langue parlée est l'anglais, mais dont la langue de navigation est l'espagnol et que ce même visiteur est incapable de changer la langue du navigateur (cybercafé par exemple), le site s'affichera en espagnol. J'ai mis à disposition des liens à cliquer qui redirigent vers l'index.php mais à nouveau le paramètre de la langue du navigateur s'applique. Comme mes connaissances sont vraiment limitées, existe-t-il une solution intelligible? j'avais pensé comme on le ferait seulement en html/css, c'est-à-dire des copies du site pour le FR/EN/DE/ES,c'est-à-dire qu'en cliquant sur le lien "en" on serait redirigé comme suit : href="en/index.html". Cette méthode implique de faire des copies. Donc si on applique mon cas, index.php -> bouton "en" -> et le lien serait par exemple href="en/index.en.php" et le paramètre de langage serait $Langue = "en"; mais à ce moment, je serait obligé de faire des copies... Je suis désolé pour la longueur de mon post. J'ai essayé d'être le plus clair possible et j'espère que vous pourrez m'aider à trouver une réponse à ma question. Félicitations à Grafikart pour ce merveilleux site, qui est à l'image de son thème, d'une clarté exemplaire. Bravo! Pingubuntu.

5 réponses


pingubuntu
Auteur
Réponse acceptée

Bonjour,

Après plusieurs tentatives, je n'ai pas réussi à lier le paramètre de la langue dans l'url et la détection automatique, car cette dernière forçait la détection et appliquait le résultat. Donc, je laisse tomber la détection automatique et je garde la langue en fonction de l'url et les include(). J'ai essayé poedit et la librairie Gettext, comme on me l'avait conseillé mais ça a pas marché (je suis sous os x).

J'ai créé un fichier lang_detection.php que j'appelle dans mes pages:

<?php
$lang = $_GET"lang"];
if (($lang == "fr"))
{
session_destroy();
     session_start(); 
$_SESSION'lang'] = "fr";

}
if (($lang == "en"))
{
session_destroy();
     session_start(); 
$_SESSION'lang'] = "en";

}
if (($lang == "de"))
{
session_destroy();
     session_start(); 
$_SESSION'lang'] = "de";

}
 if (isset($_SESSION'lang']))
 {

$lang = $_SESSION'lang'];

}
 else {
$lang = "es";            
}
?>

Bon c'est pas très malin d'appeler le fichier à chaque page... puisqu'il redéfinit à chaque fois la langue de la session.

Sinon j'ai encore une question. j'ai un formulaire de contact. Comment faire pour que les messages d'erreur s'affichent en fonction de la langue?
voici mon formulaire:

<?php
    if (!empty($_POST)) {
    extract($_POST);
    $valid = true;
    if($address != ""){

    }
    else {
    if(empty($name)){
        $valid = false;
        $errorname = "Vous n'avez pas rempli votre nom.";
    }
    if(!preg_match("/^[a-z0-9\-_.]+@[a-z0-9\-_.]+\.[a-z]{2,3}$/i", $email)){
        $valid = false;
        $erroremail = "Votre email n'est pas valide";
    }
    if(empty($forname)){
        $valid = false;
        $errorforname = "vous n'avez pas rempli votre prénom.";
    }
    if(empty($email)){
        $valid = false;
        $erroremail = "vous n'avez pas rempli votre email.";
    }
    if(empty($phone)){
        $valid = false;
        $errorphone = "vous n'avez pas rempli votre numéro de téléphone.";
    }
    if(empty($message)){
        $valid = false;
        $errormessage = "vous n'avez pas rempli de message.";
    }
    if($valid) {
        $to = "@gmail.com";
        $subject = $name. "a contacté le site!";
        $headers = "From: $name <$email>" . \n .
                    "Reply-To: $email";
        $message = stripslashes($message);
        $name = stripslashes($name);
        if(mail($to,$subject,$message,$headers)) {
            $error = "votre message nous ait bien parvenu";
            unset($name);
            unset($forname);
            unset($email);
            unset($phone);
            unset($message);

        }
        else {
            $error = "une erreur est survenue et votre email n'est pas parti!";
        }
    }
    }
}
?>

bonne journée
Jérémie

merci... je vais essayer de faire un mix... mais c'est bête je pense que je suis pas loin...
Et si je faisais...

Si l'utilisateur n'a pas sélectionné un langue <a href="index.php?lang=es"> par exemple
et bien alors on lance la reconnaissance de la langue du navigateur:
<?php
           if (!isset($Langue)) {
            if(isset($_SERVER'HTTP_ACCEPT_LANGUAGE'])){
              $Langue = explode(",",$_SERVER'HTTP_ACCEPT_LANGUAGE']);
              $Langue = strtolower(substr(chop($Langue[0]),0,2));
            } 
            else {
              $Langue = "fr";
            }
            } else {
            $Langue="fr";
            }
        ?>

ça vous inspire?
sinon joyeux noël :-)

Pingubuntu

Je pense que ce que tu as mis n'est pas bête du tout, j'aurais fait pareil ;)

Bon amusement pour le codage ;)

Bonjour,
en fait en réfléchissant, j'ai trouvé une combine pour mes messages d'erreur des formulaires en faisant des includes en fonction de la langue:
(Si ça intéresse quelqu'un? :-) )

<?php
    if($lang=='es'){
        include("content/form/form.$lang.php");
    } elseif($lang=='fr'){
        include("content/form/form.$lang.php");
    } elseif($lang=='en'){
        include("content/form/form.$lang.php");
    } elseif($lang=='de'){
        include("content/form/form.$lang.php");
    }
?>

voili, voilà.
bonne journée
P.