Eu uso o seguinte script PHP como índice para o meu site.
Este script deve incluir uma página específica, dependendo do idioma do navegador (detectado automaticamente).
Esse script não funciona bem com todos os navegadores; portanto, sempre inclui index_en.php
qualquer idioma detectado (a causa do problema provavelmente é um problema com o cabeçalho Accept-Language não sendo considerado).
Você poderia me sugerir uma solução mais robusta?
<?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
fonte
fonte
locale_accept_from_http()
qual obtém o idioma preferido doAccept-Language
cabeçalho. Você sempre deve preferir esse método a um método auto-escrito. Verifique o resultado em uma lista de expressões regulares que você tenta e determine o idioma da página dessa maneira. Veja PHP-I18N para um exemplo.locale_accept_from_http()
é que você pode não suportar o melhor resultado retornado, portanto você ainda tem que analisar o cabeçalho para encontrar o próximo melhor .Respostas:
por que você não o mantém simples e limpo
fonte
nl
), grego (el
) e eslovena (sl
), todos parecem ser duas letras: msdn.microsoft.com/en-us/library/ms533052(v=vs.85).aspxpl
for a primeira prioridade e afr
segunda na minha lista de idiomas? Eu compraria inglês em vez de francês.Accept-Language é uma lista de valores ponderados (consulte q parâmetro). Isso significa que apenas olhar para o primeiro idioma não significa que também é o mais preferido; de fato, um q valor de 0 significa que não é aceitável.
Portanto, em vez de apenas olhar para o primeiro idioma, analise a lista de idiomas aceitos e os idiomas disponíveis e encontre a melhor correspondência:
Se
findMatches
retornar uma matriz vazia, nenhuma correspondência foi encontrada e você poderá voltar ao idioma padrão.fonte
q
decidido o valor ? GraçasAs respostas existentes são muito detalhadas, por isso criei esta versão menor e de correspondência automática.
E o uso da amostra:
Fonte de essência completa aqui
fonte
A maneira oficial de lidar com isso é usando a biblioteca HTTP PECL . Diferentemente de algumas respostas aqui, isso lida corretamente com as prioridades de idioma (valores q), correspondências parciais de idioma e retornará a correspondência mais próxima ou, quando não houver correspondências, ele retornará ao primeiro idioma de sua matriz.
HTTP PECL:
http://pecl.php.net/package/pecl_http
Como usar:
http://php.net/manual/fa/function.http-negotiate-language.php
fonte
O problema com a resposta selecionada acima é que o usuário pode ter sua primeira opção definida como um idioma que não faz parte da estrutura do caso, mas uma das outras opções de idioma está definida. Você deve fazer um loop até encontrar uma correspondência.
Esta é uma solução super simples que funciona melhor. Os navegadores retornam os idiomas em ordem de preferência, simplificando o problema. Embora o designador de idioma possa ter mais de dois caracteres (por exemplo, "EN-US"), normalmente os dois primeiros são suficientes. No exemplo de código a seguir, estou procurando uma correspondência em uma lista de idiomas conhecidos que meu programa conhece.
Espero que você encontre uma solução rápida e simples que possa ser usada facilmente em seu código. Eu tenho usado isso na produção por um bom tempo.
fonte
q
valores para determinar a preferência, é o que a especificação diz que você deve fazer.Tente este:
fonte
[0-1]{0,1}.\d{0,4}
? Primeiro eu acho que você quer dizer, em\.
vez de.
certo? E não é q sempre da forma0.1324
ou algo assim? Não seria suficiente escrever0\.?\d{0,4}
? Se você tiverq=1.0
, pode ir na outra parte.var_dump( getDefaultLanguage());
O script a seguir é uma versão modificada do código do Xeoncross (obrigado por esse Xeoncross) que retorna a uma configuração de idioma padrão se nenhum idioma corresponder aos suportados, ou se uma correspondência for encontrada, ela substitui a configuração de idioma padrão por uma nova. de acordo com a prioridade do idioma.
Nesse cenário, o navegador do usuário é definido em ordem de prioridade para espanhol, holandês, inglês dos EUA e inglês e o aplicativo suporta inglês e holandês apenas sem variações regionais e o inglês é o idioma padrão. A ordem dos valores na cadeia "HTTP_ACCEPT_LANGUAGE" não é importante se, por algum motivo, o navegador não solicitar os valores corretamente.
fonte
Eu acho que a maneira mais limpa é essa!
fonte
Todos os itens acima com fallback para 'en':
... ou com fallback de idioma padrão e matriz de idioma conhecido:
Uma linha:
Exemplos:
fonte
Experimentar,
Graças a
fonte
Rápido e simples:
NOTA: O código do primeiro idioma é o que está sendo usado pelo navegador, o restante são outros idiomas que o usuário configurou no navegador.
Alguns idiomas têm um código de região, por exemplo. en-GB, outros apenas têm o código do idioma, por exemplo. sk.
Se você deseja apenas o idioma e não a região (por exemplo, en, fr, es, etc.), pode usar:
fonte
Eu tenho esse, que define um cookie. E como você pode ver, ele primeiro verifica se o idioma foi publicado pelo usuário. Porque o idioma do navegador nem sempre fala sobre o usuário.
fonte