Ich verwende das folgende PHP-Skript als Index für meine Website.
Dieses Skript sollte abhängig von der Sprache des Browsers eine bestimmte Seite enthalten (automatisch erkannt).
Dieses Skript funktioniert nicht mit allen Browsern und enthält daher immer index_en.php
alle erkannten Sprachen (die Ursache des Problems ist höchstwahrscheinlich ein Problem, bei dem einige Accept-Language-Header nicht berücksichtigt werden).
Könnten Sie mir bitte eine robustere Lösung vorschlagen?
<?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;
}
?>
php
cross-browser
browser-detection
GibboK
quelle
quelle
locale_accept_from_http()
wird die bevorzugte Sprache aus demAccept-Language
Header abgerufen . Sie sollten diese Methode immer einer selbstgeschriebenen Methode vorziehen. Überprüfen Sie das Ergebnis anhand einer Liste regulärer Ausdrücke, die Sie versuchen, die Seitensprache auf diese Weise zu bestimmen. Ein Beispiel finden Sie in PHP-I18N .locale_accept_from_http()
ist, dass Sie möglicherweise nicht das beste Ergebnis unterstützen, das zurückgegeben wird, sodass Sie den Header immer noch selbst analysieren müssen , um das nächstbeste zu finden .Antworten:
Warum hältst du es nicht einfach und sauber?
quelle
nl
), Griechisch (el
) und Slowenisch (sl
) scheinen alle zwei Buchstaben zu sein: msdn.microsoft.com/en-us/library/ms533052(v=vs.85).aspxpl
die erste Priorität undfr
die zweite in meiner Sprachliste steht? Ich würde Englisch statt Französisch bekommen.Accept-Language ist eine Liste gewichteter Werte (sieheParameter q ). Das heißt, nur die erste Sprache zu betrachten, bedeutet nicht, dass sie auch am meisten bevorzugt wird. Tatsächlich bedeutet ein q- Wert von 0 überhaupt nicht akzeptabel.
Anstatt nur die erste Sprache zu betrachten, analysieren Sie die Liste der akzeptierten Sprachen und verfügbaren Sprachen und finden Sie die beste Übereinstimmung:
Wenn
findMatches
ein leeres Array zurückgegeben wird, wurde keine Übereinstimmung gefunden und Sie können auf die Standardsprache zurückgreifen.quelle
q
entschieden ist? DankeDie vorhandenen Antworten sind etwas zu ausführlich, daher habe ich diese kleinere Version mit automatischer Anpassung erstellt.
Und die Beispielnutzung:
Vollständige Quelle hier
quelle
Der offizielle Weg, dies zu handhaben, ist die Verwendung der PECL-HTTP-Bibliothek . Im Gegensatz zu einigen Antworten hier werden hiermit die Sprachprioritäten (q-Werte) und Teilsprachenübereinstimmungen korrekt behandelt und die engste Übereinstimmung zurückgegeben. Wenn keine Übereinstimmungen vorhanden sind, wird auf die erste Sprache in Ihrem Array zurückgegriffen.
PECL HTTP:
http://pecl.php.net/package/pecl_http
Verwendung:
http://php.net/manual/fa/function.http-negotiate-language.php
quelle
Das Problem mit der oben ausgewählten Antwort besteht darin, dass der Benutzer möglicherweise seine erste Wahl als Sprache festgelegt hat, die nicht in der Fallstruktur enthalten ist, aber eine seiner anderen Sprachoptionen festgelegt ist. Sie sollten eine Schleife ausführen, bis Sie eine Übereinstimmung gefunden haben.
Dies ist eine super einfache Lösung, die besser funktioniert. Browser geben die Sprachen in der Reihenfolge ihrer Präferenz zurück, wodurch das Problem vereinfacht wird. Während der Sprachbezeichner mehr als zwei Zeichen enthalten kann (z. B. "EN-US"), sind normalerweise die ersten beiden ausreichend. Im folgenden Codebeispiel suche ich nach einer Übereinstimmung aus einer Liste bekannter Sprachen, die meinem Programm bekannt sind.
Ich hoffe, Sie finden dies eine schnelle und einfache Lösung, die Sie problemlos in Ihrem Code verwenden können. Ich benutze das schon eine ganze Weile in der Produktion.
quelle
q
Werte, um die Präferenz zu bestimmen. Laut Spezifikation sollten Sie dies tun.Probier diese:
quelle
[0-1]{0,1}.\d{0,4}
? Zuerst denke ich, du meinst\.
statt.
richtig? Und ist q nicht immer von der Form0.1324
oder so? Wäre es dann nicht ausreichend zu schreiben0\.?\d{0,4}
? Wenn Sie habenq=1.0
, können Sie in den anderen Teil gehen.var_dump( getDefaultLanguage());
Das folgende Skript ist eine modifizierte Version des Xeoncross-Codes (danke für diesen Xeoncross), die auf eine Standardspracheneinstellung zurückgreift, wenn keine Sprachen mit den unterstützten übereinstimmen oder wenn eine Übereinstimmung gefunden wird, ersetzt sie die Standardspracheneinstellung durch eine neue entsprechend der Sprachpriorität.
In diesem Szenario wird der Browser des Benutzers in der Reihenfolge seiner Priorität auf Spanisch, Niederländisch, US-Englisch und Englisch eingestellt. Die Anwendung unterstützt nur Englisch und Niederländisch ohne regionale Unterschiede, und Englisch ist die Standardsprache. Die Reihenfolge der Werte in der Zeichenfolge "HTTP_ACCEPT_LANGUAGE" ist nicht wichtig, wenn der Browser die Werte aus irgendeinem Grund nicht korrekt sortiert.
quelle
Ich denke, der sauberste Weg ist dies!
quelle
Alle oben genannten mit Fallback auf 'en':
... oder mit Standard-Sprach-Fallback und bekanntem Spracharray:
Eine Linie:
Beispiele:
quelle
Versuchen,
Dank an
quelle
Schnell und einfach:
HINWEIS: Der erste Sprachcode wird vom Browser verwendet, der Rest sind andere Sprachen, die der Benutzer im Browser eingerichtet hat.
Einige Sprachen haben einen Regionalcode, z. en-GB, andere haben nur den Sprachcode, z. sk.
Wenn Sie nur die Sprache und nicht die Region (z. B. en, fr, es usw.) möchten, können Sie Folgendes verwenden:
quelle
Ich habe diesen, der einen Cookie setzt. Und wie Sie sehen können, wird zunächst geprüft, ob die Sprache vom Benutzer veröffentlicht wurde. Weil die Browsersprache nicht immer über den Benutzer informiert.
quelle