web-dev-qa-db-fra.com

Détecter automatiquement la langue et rediriger l'utilisateur

Je fais mon propre site Web et j'ai réussi à écrire du code qui dirige l'utilisateur vers la version linguistique en fonction de la langue du navigateur. Voici le script:

<?php
  if ($_SERVER["HTTP_ACCEPT_LANGUAGE"] == "sv")
    header("location: index.php");
  if ($_SERVER["HTTP_ACCEPT_LANGUAGE"] == "pt")
    header("location: pt/index.php");
  else 
    header("location: en/index.html");
?>

Je l'ai mis dans le fichier index.php avant le. Cela semble fonctionner car je ne suis pas dans un pays anglophone mais mon navigateur est en anglais et je suis redirigé vers la version anglaise.

Est-ce correct? Existe-t-il une meilleure façon/plus propre de procéder?

16
viriato

Eh bien, j'ai rencontré quelques problèmes avec mon code, ce qui n'est pas surprenant car je ne suis pas un expert en PHP. J'ai donc continué à chercher une solution possible et j'ai trouvé le code suivant sur un autre site Web :

<?php
    // Initialize the language code variable
$lc = ""; 
    // Check to see that the global language server variable isset()
    // If it is set, we cut the first two characters from that string
if(isset($_SERVER['HTTP_ACCEPT_LANGUAGE']))
    $lc = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);

    // Now we simply evaluate that variable to detect specific languages
if($lc == "fr"){
    header("location: index_french.php");
    exit();
} else if($lc == "de"){
    header("location: index_german.php");
    exit();
}
else{ // don't forget the default case if $lc is empty
    header("location: index_english.php");
    exit();
}
?>

Cela a parfaitement fonctionné! Il ne me restait qu'un problème. Il n'y avait aucun moyen de changer de langue, même avec des liens directs vers une autre langue car dès que la page se chargeait, le bloc php me redirigeait vers la langue du borwser. Cela peut être un problème si vous vivez dans un autre pays et que vous avez par exemple le suédois comme langue maternelle mais que votre navigateur est en anglais car vous avez acheté votre ordinateur au Royaume-Uni.

Donc, ma solution pour ce problème était de créer des dossiers avec une version en double pour chaque langue (même celle de la langue principale) sans ce code php sur index.html (et donc pas index.php). Alors maintenant, mon site Web détecte automatiquement la langue et l'utilisateur a également la possibilité de la changer manuellement s'il le souhaite!

J'espère que cela aidera quelqu'un d'autre avec le même problème!

15
viriato

PHP 5.3.0+ est livré avec locale_accept_from_http() qui obtient la langue préférée de l'en-tête Accept-Language.

Vous devriez toujours préférer cette méthode à une méthode auto-écrite car le champ d'en-tête est plus compliqué qu'on pourrait le penser. (C'est une liste de préférences pondérées.)

Vous devez récupérer la langue comme ceci:

$lang = locale_accept_from_http($_SERVER['HTTP_ACCEPT_LANGUAGE']);

Mais même dans ce cas, vous n'aurez pas seulement en pour chaque utilisateur anglais et es pour les utilisateurs espagnols. Cela peut devenir beaucoup plus difficile que cela, et des choses comme es-ES Et es-US Sont standard.

Cela signifie que vous devez parcourir une liste d'expressions régulières que vous essayez de déterminer la langue de la page de cette façon. Voir PHP-I18N pour un exemple.

15
caw

Je pense que votre idée est géniale. Peut être vous aider le code le plus court:

$lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
header("location: ".$lang."/index.php");
5
Bora

Cela devrait bien fonctionner. Vous pouvez également utiliser http_negotiate_language et discuter ici

2
samb90