Utilizo el siguiente script PHP como índice para mi sitio web.
Este script debe incluir una página específica según el idioma del navegador (detectado automáticamente).
Este script no funciona bien con todos los navegadores, por lo que siempre incluye index_en.php
cualquier idioma detectado (la causa del problema es probablemente un problema con algún encabezado Accept-Language no considerado).
¿Podría sugerirme una solución más 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
fuente
fuente
locale_accept_from_http()
que obtiene el idioma preferido delAccept-Language
encabezado. Siempre debe preferir este método a un método auto-escrito. Comprueba el resultado con una lista de expresiones regulares que intentas y determina el idioma de la página de esa manera. Ver PHP-I18N para un ejemplo.locale_accept_from_http()
es que es posible que no admita el mejor resultado que devuelve, por lo que aún debe analizar el encabezado usted mismo para encontrar el siguiente mejor .Respuestas:
¿Por qué no lo mantienes simple y limpio?
fuente
nl
), griego (el
) y esloveno (sl
) parecen ser dos letras: msdn.microsoft.com/en-us/library/ms533052(v=vs.85).aspxpl
es la primera prioridad y lafr
segunda en mi lista de idiomas? Me gustaría aprender inglés en lugar de francés.Accept-Language es una lista de valores ponderados (verparámetro q ). Eso significa que solo mirar el primer idioma no significa que también sea el más preferido; de hecho, unvalor q de 0 significa que no es aceptable en absoluto.
Entonces, en lugar de solo mirar el primer idioma, analice la lista de idiomas aceptados e idiomas disponibles y encuentre la mejor combinación:
Si
findMatches
devuelve una matriz vacía, no se encontró ninguna coincidencia y puede recurrir al idioma predeterminado.fuente
q
decidir? GraciasLas respuestas existentes son demasiado detalladas, así que creé esta versión más pequeña y de coincidencia automática.
Y el uso de la muestra:
Fuente completa aquí
fuente
La forma oficial de manejar esto es usando la biblioteca PECL HTTP . A diferencia de algunas respuestas aquí, esto maneja correctamente las prioridades del idioma (valores q), coincidencias parciales del idioma y devolverá la coincidencia más cercana, o cuando no hay coincidencias, vuelve al primer idioma de su matriz.
PECL HTTP:
http://pecl.php.net/package/pecl_http
Cómo usar:
http://php.net/manual/fa/function.http-negotiate-language.php
fuente
El problema con la respuesta seleccionada anteriormente es que el usuario puede tener su primera opción configurada como un idioma que no está en la estructura del caso, pero se establece una de sus otras opciones de idioma. Debes recorrer hasta encontrar una coincidencia.
Esta es una solución súper simple que funciona mejor. Los navegadores devuelven los idiomas en orden de preferencia, lo que simplifica el problema. Si bien el designador de lenguaje puede tener más de dos caracteres (por ejemplo, "EN-US"), normalmente los dos primeros son suficientes. En el siguiente ejemplo de código, estoy buscando una coincidencia de una lista de idiomas conocidos que mi programa conoce.
Espero que encuentre esta solución rápida y simple que pueda usar fácilmente en su código. He estado usando esto en producción durante bastante tiempo.
fuente
q
valores para determinar la preferencia, eso es lo que la especificación dice que debe hacer.Prueba este:
fuente
[0-1]{0,1}.\d{0,4}
? Primero, supongo que quieres decir en\.
lugar de.
¿verdad? ¿Y no es q siempre de la forma0.1324
o algo así? ¿No sería entonces suficiente escribir0\.?\d{0,4}
? Si esq=1.0
así, puedes ir a la otra parte.var_dump( getDefaultLanguage());
El siguiente script es una versión modificada del código de Xeoncross (gracias por ese Xeoncross) que recurre a una configuración de idioma predeterminada si no hay idiomas que coincidan con los admitidos, o si se encuentra una coincidencia, reemplaza la configuración de idioma predeterminada por una nueva. según la prioridad del idioma
En este escenario, el navegador del usuario está configurado en orden de prioridad para español, holandés, inglés de EE. UU. E inglés, y la aplicación solo admite inglés y holandés sin variaciones regionales, y el inglés es el idioma predeterminado. El orden de los valores en la cadena "HTTP_ACCEPT_LANGUAGE" no es importante si por alguna razón el navegador no ordena los valores correctamente.
fuente
¡Creo que la forma más limpia es esta!
fuente
Todo lo anterior con respaldo a 'en':
... o con una reserva de idioma predeterminada y una matriz de idiomas conocida:
Una línea:
Ejemplos:
fuente
Tratar,
Gracias a
fuente
Rápido y simple:
NOTA: El código del primer idioma es el que usa el navegador, el resto son otros idiomas que el usuario ha configurado en el navegador.
Algunos idiomas tienen un código de región, por ejemplo. en-GB, otros solo tienen el código de idioma, por ejemplo. sk.
Si solo desea el idioma y no la región (por ejemplo, en, fr, es, etc.), puede usar:
fuente
Tengo este, que establece una cookie. Y como puede ver, primero verifica si el usuario publica el idioma. Porque el lenguaje del navegador no siempre informa sobre el usuario.
fuente