Я использую следующий скрипт PHP в качестве индекса для моего сайта.
Этот скрипт должен включать определенную страницу в зависимости от языка браузера (определяется автоматически).
Этот сценарий не работает хорошо во всех браузерах, поэтому он всегда включает index_en.php
любой обнаруженный язык (причина проблемы, скорее всего, связана с тем, что какой-то заголовок Accept-Language не рассматривается).
Не могли бы вы предложить мне более надежное решение?
<?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()
который получает предпочтительный язык изAccept-Language
заголовка. Вы должны всегда предпочитать этот метод самописному методу. Сравните результат со списком регулярных выражений, которые вы пытаетесь определить, таким образом язык страницы. Смотрите PHP-I18N для примера.locale_accept_from_http()
том, что вы, возможно, не поддерживаете лучший результат, который он возвращает, поэтому у вас все равно есть возможность самостоятельно проанализировать заголовок, чтобы найти следующий лучший .Ответы:
почему ты не делаешь это простым и чистым
источник
nl
), греческий (el
) и словенский (sl
) - две буквы: msdn.microsoft.com/en-us/library/ms533052(v=vs.85).aspxpl
это первый приоритет иfr
второй в моем списке языков? Я бы получил английский вместо французского.Accept-Language - это список взвешенных значений (см.Параметр q ). Это означает, что простой взгляд на первый язык не означает, что он также является наиболее предпочтительным; на самом деле,значение q 0 означает совсем неприемлемо.
Поэтому вместо того, чтобы просто смотреть на первый язык, проанализируйте список принятых и доступных языков и найдите лучшее соответствие:
Если
findMatches
возвращает пустой массив, совпадение не найдено, и вы можете использовать язык по умолчанию.источник
q
? СпасибоСуществующие ответы слишком многословны, поэтому я создал эту уменьшенную версию с автоматическим соответствием.
И пример использования:
Полный источник здесь
источник
Официальный способ справиться с этим - использовать HTTP-библиотеку PECL . В отличие от некоторых ответов здесь, он корректно обрабатывает языковые приоритеты (значения q), частичные совпадения языков и возвращает наиболее близкое совпадение, или, если совпадений нет, возвращается к первому языку в вашем массиве.
HTTP PECL:
http://pecl.php.net/package/pecl_http
Как использовать:
http://php.net/manual/fa/function.http-negotiate-language.php
источник
Проблема с выбранным ответом выше заключается в том, что пользователь может выбрать свой первый выбор в качестве языка, которого нет в структуре дела, но установлен один из его других вариантов выбора языка. Вы должны зацикливаться, пока не найдете совпадение.
Это супер простое решение, которое работает лучше. Браузеры возвращают языки в порядке предпочтения, что упрощает проблему. Хотя указатель языка может содержать более двух символов (например, «EN-US»), обычно достаточно первых двух символов. В следующем примере кода я ищу совпадение из списка известных языков, о которых знает моя программа.
Я надеюсь, что вы найдете это быстрое и простое решение, которое вы можете легко использовать в своем коде. Я уже давно использую это в производстве.
источник
q
значения, чтобы определить предпочтения, это то, что спецификация говорит, что вы должны делать.Попробуй это:
источник
[0-1]{0,1}.\d{0,4}
? Сначала я предполагаю, что вы имеете в виду,\.
а не.
правильно? И не всегда ли q имеет форму0.1324
или что-то в этом роде? Разве этого не было бы достаточно, чтобы написать0\.?\d{0,4}
? Если у вас есть,q=1.0
то вы можете перейти в другой части.var_dump( getDefaultLanguage());
Следующий скрипт представляет собой модифицированную версию кода Xeoncross (спасибо за этот Xeoncross), который возвращается к настройке языка по умолчанию, если ни один из языков не соответствует поддерживаемым, или если найдено совпадение, он заменяет настройку языка по умолчанию новой. в соответствии с языковым приоритетом.
В этом сценарии браузер пользователя устанавливается в порядке приоритета на испанский, голландский, американский английский и английский, и приложение поддерживает только английский и голландский языки без региональных изменений, а английский является языком по умолчанию. Порядок значений в строке «HTTP_ACCEPT_LANGUAGE» не важен, если по какой-то причине браузер неправильно упорядочивает значения.
источник
Я думаю, что самый чистый способ это!
источник
Все вышеперечисленное с отступлением до 'en':
... или с запасным языком по умолчанию и массивом известных языков:
Одна линия:
Примеры:
источник
Пытаться,
Благодаря
источник
Быстро и просто:
ПРИМЕЧАНИЕ. Первый код языка - это то, что используется браузером, остальные - другие языки, которые пользователь установил в браузере.
Некоторые языки имеют код региона, например. en-GB, у других просто есть код языка, например. пестрый
Если вам нужен только язык, а не регион (например, en, fr, es и т. Д.), Вы можете использовать:
источник
У меня есть этот, который устанавливает печенье. И, как вы можете видеть, он сначала проверяет, опубликован ли язык пользователем. Потому что язык браузера не всегда говорит о пользователе.
источник