J'utilise le script PHP suivant comme index pour mon site Web.
Ce script doit inclure une page spécifique en fonction de la langue du navigateur (détectée automatiquement).
Ce script ne fonctionne pas bien avec tous les navigateurs, il inclut donc toujours index_en.php
pour toute langue détectée (la cause du problème est très probablement un problème avec un en-tête Accept-Language non pris en compte).
Pouvez-vous me suggérer une solution plus robuste?
<?php
// Open session var
session_start();
// views: 1 = first visit; >1 = second visit
// Detect language from user agent browser
function lixlpixel_get_env_var($Var)
{
if(empty($GLOBALS[$Var]))
{
$GLOBALS[$Var]=(!empty($GLOBALS['_SERVER'][$Var]))?
$GLOBALS['_SERVER'][$Var] : (!empty($GLOBALS['HTTP_SERVER_VARS'][$Var])) ? $GLOBALS['HTTP_SERVER_VARS'][$Var]:'';
}
}
function lixlpixel_detect_lang()
{
// Detect HTTP_ACCEPT_LANGUAGE & HTTP_USER_AGENT.
lixlpixel_get_env_var('HTTP_ACCEPT_LANGUAGE');
lixlpixel_get_env_var('HTTP_USER_AGENT');
$_AL=strtolower($GLOBALS['HTTP_ACCEPT_LANGUAGE']);
$_UA=strtolower($GLOBALS['HTTP_USER_AGENT']);
// Try to detect Primary language if several languages are accepted.
foreach($GLOBALS['_LANG'] as $K)
{
if(strpos($_AL, $K)===0)
return $K;
}
// Try to detect any language if not yet detected.
foreach($GLOBALS['_LANG'] as $K)
{
if(strpos($_AL, $K)!==false)
return $K;
}
foreach($GLOBALS['_LANG'] as $K)
{
//if(preg_match("/[[( ]{$K}[;,_-)]/",$_UA)) // matching other letters (create an error for seo spyder)
return $K;
}
// Return default language if language is not yet detected.
return $GLOBALS['_DLANG'];
}
// Define default language.
$GLOBALS['_DLANG']='en';
// Define all available languages.
// WARNING: uncomment all available languages
$GLOBALS['_LANG'] = array(
'af', // afrikaans.
'ar', // arabic.
'bg', // bulgarian.
'ca', // catalan.
'cs', // czech.
'da', // danish.
'de', // german.
'el', // greek.
'en', // english.
'es', // spanish.
'et', // estonian.
'fi', // finnish.
'fr', // french.
'gl', // galician.
'he', // hebrew.
'hi', // hindi.
'hr', // croatian.
'hu', // hungarian.
'id', // indonesian.
'it', // italian.
'ja', // japanese.
'ko', // korean.
'ka', // georgian.
'lt', // lithuanian.
'lv', // latvian.
'ms', // malay.
'nl', // dutch.
'no', // norwegian.
'pl', // polish.
'pt', // portuguese.
'ro', // romanian.
'ru', // russian.
'sk', // slovak.
'sl', // slovenian.
'sq', // albanian.
'sr', // serbian.
'sv', // swedish.
'th', // thai.
'tr', // turkish.
'uk', // ukrainian.
'zh' // chinese.
);
// Redirect to the correct location.
// Example Implementation aff var lang to name file
/*
echo 'The Language detected is: '.lixlpixel_detect_lang(); // For Demonstration
echo "<br />";
*/
$lang_var = lixlpixel_detect_lang(); //insert lang var system in a new var for conditional statement
/*
echo "<br />";
echo $lang_var; // print var for trace
echo "<br />";
*/
// Insert the right page iacoording with the language in the browser
switch ($lang_var){
case "fr":
//echo "PAGE DE";
include("index_fr.php");//include check session DE
break;
case "it":
//echo "PAGE IT";
include("index_it.php");
break;
case "en":
//echo "PAGE EN";
include("index_en.php");
break;
default:
//echo "PAGE EN - Setting Default";
include("index_en.php");//include EN in all other cases of different lang detection
break;
}
?>
locale_accept_from_http()
qui obtient la langue préférée de l'en-Accept-Language
tête. Vous devriez toujours préférer cette méthode à une méthode auto-écrite. Comparez le résultat à une liste d'expressions régulières que vous essayez et déterminez la langue de la page de cette façon. Voir PHP-I18N pour un exemple.locale_accept_from_http()
est que vous pouvez ne pas prendre en charge le meilleur résultat qu'il renvoie, vous avez donc toujours l' analyse de l'en-tête vous-même pour trouver le meilleur résultat suivant .Réponses:
pourquoi ne pas garder les choses simples et propres
la source
nl
), le grec (el
) et le slovène (sl
) semblent tous être composés depl
c'est la première priorité et lafr
deuxième dans ma liste de langues? J'obtiendrais l'anglais au lieu du français.Accept-Language est une liste de valeurs pondérées (voirparamètre q ). Cela signifie que le simple fait de regarder la première langue ne signifie pas que c'est aussi la plus préférée; en fait, unevaleur q de 0 signifie pas du tout acceptable.
Donc, au lieu de simplement regarder la première langue, analysez la liste des langues acceptées et des langues disponibles et trouvez la meilleure correspondance:
Si
findMatches
retourne un tableau vide, aucune correspondance n'a été trouvée et vous pouvez revenir sur la langue par défaut.la source
q
décidé? MerciLes réponses existantes sont un peu trop détaillées, j'ai donc créé cette version plus petite et à correspondance automatique.
Et l'utilisation de l'échantillon:
Source complète ici
la source
La façon officielle de gérer cela consiste à utiliser la bibliothèque HTTP PECL . Contrairement à certaines réponses ici, cela gère correctement les priorités de langue (valeurs q), les correspondances partielles de langue et renverra la correspondance la plus proche, ou lorsqu'il n'y a pas de correspondance, il revient à la première langue de votre tableau.
HTTP PECL:
http://pecl.php.net/package/pecl_http
Comment utiliser:
http://php.net/manual/fa/function.http-negotiate-language.php
la source
Le problème avec la réponse sélectionnée ci-dessus est que l'utilisateur peut avoir son premier choix défini comme une langue qui n'est pas dans la structure de cas, mais l'un de ses autres choix de langue est défini. Vous devriez boucler jusqu'à ce que vous trouviez une correspondance.
C'est une solution super simple qui fonctionne mieux. Les navigateurs renvoient les langues par ordre de préférence, ce qui simplifie le problème. Bien que l'indicateur de langue puisse comporter plus de deux caractères (par exemple, «EN-US»), les deux premiers sont généralement suffisants. Dans l'exemple de code suivant, je recherche une correspondance dans une liste de langues connues dont mon programme est conscient.
J'espère que vous trouverez une solution simple et rapide que vous pourrez facilement utiliser dans votre code. J'utilise ceci en production depuis un bon moment.
la source
q
valeurs pour déterminer la préférence, c'est ce que la spécification dit que vous devriez faire.Essaye celui-là:
la source
[0-1]{0,1}.\d{0,4}
? D'abord, je suppose que vous voulez dire\.
au lieu de.
droite? Et q n'est-il pas toujours de la forme0.1324
ou quelque chose? Ne serait-il pas alors suffisant d'écrire0\.?\d{0,4}
? Si c'est le cas, vousq=1.0
pouvez aller dans la partie autre.var_dump( getDefaultLanguage());
Le script suivant est une version modifiée du code de Xeoncross (merci pour ce Xeoncross) qui revient à un paramètre de langue par défaut si aucune langue ne correspond à celles prises en charge, ou si une correspondance est trouvée, il remplace le paramètre de langue par défaut par un nouveau selon la priorité de la langue.
Dans ce scénario, le navigateur de l'utilisateur est défini par ordre de priorité sur l'espagnol, le néerlandais, l'anglais américain et l'anglais et l'application prend en charge l'anglais et le néerlandais uniquement sans variations régionales et l'anglais est la langue par défaut. L'ordre des valeurs dans la chaîne "HTTP_ACCEPT_LANGUAGE" n'est pas important si, pour une raison quelconque, le navigateur ne classe pas correctement les valeurs.
la source
Je pense que le moyen le plus propre est celui-ci!
la source
Tout ce qui précède avec un retour à «en»:
... ou avec une langue de secours par défaut et un tableau de langues connu:
Une ligne:
Exemples:
la source
Essayer,
Grâce à
la source
Rapide et simple:
REMARQUE: Le premier code de langue est ce qui est utilisé par le navigateur, les autres sont d'autres langues que l'utilisateur a configurées dans le navigateur.
Certaines langues ont un code de région, par exemple. en-GB, d'autres ont juste le code de langue, par exemple. sk.
Si vous voulez juste la langue et non la région (par exemple. En, fr, es, etc.), vous pouvez utiliser:
la source
J'ai celui-ci, qui crée un cookie. Et comme vous pouvez le voir, il vérifie d'abord si la langue est publiée par l'utilisateur. Parce que la langue du navigateur ne parle pas toujours de l'utilisateur.
la source