Używam następującego skryptu PHP jako indeksu dla mojej witryny.
Ten skrypt powinien zawierać określoną stronę w zależności od języka przeglądarki (wykrywana automatycznie).
Ten skrypt nie działa dobrze we wszystkich przeglądarkach, więc zawsze obejmuje index_en.php
każdy wykryty język (przyczyną problemu jest najprawdopodobniej problem z nieuwzględnianiem niektórych nagłówków Accept-Language).
Czy mógłbyś zaproponować mi bardziej solidne rozwiązanie?
<?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
źródło
źródło
locale_accept_from_http()
który pobiera preferowany język zAccept-Language
nagłówka. Zawsze powinieneś preferować tę metodę od metody napisanej samodzielnie. Porównaj wynik z listą wyrażeń regularnych, które próbujesz, i określ w ten sposób język strony. Zobacz przykład PHP-I18N .locale_accept_from_http()
polega na tym, że możesz nie obsługiwać najlepszego wyniku, który zwraca, więc nadal możesz samodzielnie przeanalizować nagłówek, aby znaleźć następny najlepszy .Odpowiedzi:
dlaczego nie utrzymujesz tego w prostocie i czystości
źródło
nl
), grecki (el
) i słoweński (sl
) wydają się mieć dwie litery: msdn.microsoft.com/en-us/library/ms533052(v=vs.85).aspxpl
jest priorytetem ifr
jest drugim na mojej liście języków? Zamiast francuskiego dostawałem angielski.Accept-Language to lista wartości ważonych (patrzparametr q ). Oznacza to, że samo spojrzenie na pierwszy język nie oznacza, że jest on również najbardziej preferowany; w rzeczywistościwartość q równa 0 oznacza w ogóle nie do przyjęcia.
Zamiast więc patrzeć na pierwszy język, przeanalizuj listę akceptowanych języków i dostępnych języków i znajdź najlepsze dopasowanie:
Jeśli
findMatches
zwraca pustą tablicę, nie znaleziono żadnego dopasowania i możesz wrócić do języka domyślnego.źródło
q
decyzji? DziękiIstniejące odpowiedzi są trochę zbyt szczegółowe, dlatego utworzyłem tę mniejszą, automatycznie dopasowującą się wersję.
I przykładowe użycie:
Pełne źródło treści tutaj
źródło
Oficjalnym sposobem rozwiązania tego problemu jest użycie biblioteki PECL HTTP . W przeciwieństwie do niektórych odpowiedzi tutaj, to poprawnie obsługuje priorytety języka (wartości q), częściowe dopasowania języka i zwróci najbliższe dopasowanie, lub jeśli nie ma żadnych dopasowań, wraca do pierwszego języka w twojej tablicy.
PECL HTTP:
http://pecl.php.net/package/pecl_http
Jak używać:
http://php.net/manual/fa/function.http-negotiate-language.php
źródło
Problem z wybraną powyżej odpowiedzią polega na tym, że użytkownik może mieć swój pierwszy wybór jako język, którego nie ma w strukturze przypadku, ale jeden z pozostałych wyborów językowych jest ustawiony. Powinieneś zapętlić, aż znajdziesz dopasowanie.
To super proste rozwiązanie, które działa lepiej. Przeglądarki zwracają języki w kolejności preferencji, co upraszcza problem. Chociaż oznaczenie języka może składać się z więcej niż dwóch znaków (np. - „EN-US”), zwykle wystarczają pierwsze dwa. W poniższym przykładzie kodu szukam dopasowania z listy znanych języków, o których wie mój program.
Mam nadzieję, że uznasz to za szybkie i proste rozwiązanie, którego możesz łatwo użyć w swoim kodzie. Używam tego w produkcji od dłuższego czasu.
źródło
q
wartości, aby określić preferencje, tak mówi specyfikacja.Spróbuj tego:
źródło
[0-1]{0,1}.\d{0,4}
? Po pierwsze, myślę, że masz na myśli\.
zamiast.
prawda? I czy nie q zawsze ma formę0.1324
czy coś? Czy nie wystarczyłoby wtedy pisać0\.?\d{0,4}
? Jeśli maszq=1.0
, możesz przejść do drugiej części.var_dump( getDefaultLanguage());
Poniższy skrypt to zmodyfikowana wersja kodu Xeoncross (dziękujemy za Xeoncross), która powraca do domyślnego ustawienia języka, jeśli żaden język nie pasuje do obsługiwanych lub jeśli zostanie znaleziony pasujący, zastępuje domyślne ustawienie języka nowym zgodnie z priorytetem językowym.
W tym scenariuszu przeglądarka użytkownika jest ustawiona według priorytetu na hiszpański, holenderski, angielski (USA) i angielski, a aplikacja obsługuje tylko język angielski i holenderski bez różnic regionalnych, a język angielski jest językiem domyślnym. Kolejność wartości w ciągu „HTTP_ACCEPT_LANGUAGE” nie jest ważna, jeśli z jakiegoś powodu przeglądarka nie porządkuje poprawnie wartości.
źródło
Myślę, że to najczystszy sposób!
źródło
Wszystkie powyższe z powrotem do „en”:
... lub z domyślnym językiem zastępczym i znaną tablicą języków:
Jedna linia:
Przykłady:
źródło
Próbować,
Dzięki
źródło
Szybko i prosto:
UWAGA: Pierwszy kod języka jest używany przez przeglądarkę, reszta to inne języki, które użytkownik ustawił w przeglądarce.
Niektóre języki mają kod regionu, np. en-GB, inne mają po prostu kod języka, np. sk.
Jeśli chcesz tylko język, a nie region (np. En, fr, es itp.), Możesz użyć:
źródło
Mam ten, który ustawia ciasteczko. Jak widać, najpierw sprawdza, czy język został opublikowany przez użytkownika. Ponieważ język przeglądarki nie zawsze mówi o użytkowniku.
źródło