Estoy tratando de construir multilangual sitio.

Yo uso este trozo de código para detectar a los usuarios del lenguaje. Si usted ha elegido un idioma, incluirá su archivo de idioma basado en HTTP_ACCEPT_LANGUAGE.

Yo no sé de dónde lo saca, aunque:

session_start();

if (!isset($_SESSION['lang'])) {
   $_SESSION['lang'] = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
}

elseif (isset($_GET['setLang']) && $_GET['setLang'] == 'en') $_SESSION['lang'] = "en";
elseif (isset($_GET['setLang']) && $_GET['setLang'] == 'sv') $_SESSION['lang'] = "sv";
elseif (isset($_GET['setLang']) && $_GET['setLang'] == 'pl') $_SESSION['lang'] = "pl";
elseif (isset($_GET['setLang']) && $_GET['setLang'] == 'fr') $_SESSION['lang'] = "fr";

include('languages/'.$_SESSION['lang'].'.php');

Funciona para mí, y que incluye el polaco lang archivo. Pero es este código correcto? O hay otra manera?

  • ¿Qué pasa si el encabezado es Accept-Language: fr;q=0,en o algo parecido?
InformationsquelleAutor | 2009-08-29

9 Comentarios

  1. 35

    El navegador generalmente envía un encabezado HTTP, nombre Accept-Language, que indica que los idiomas que el usuario está dispuesto a llegar.

    Por ejemplo, esta cabecera puede ser :

    Accept-Language: en-us,en;q=0.5

    Hay noción de prioridad en el que, por cierto 😉

    En PHP, usted puede conseguir esto en el $_SERVER super global :

    var_dump($_SERVER['HTTP_ACCEPT_LANGUAGE']);

    me :

    string 'en-us,en;q=0.5' (length=14)

    Ahora, usted tiene que analizar eso 😉


    Si puedo editar mis preferencias en el navegador la opción de decir «quiero que el francés, y si no se puede no me sirven francés, me recibe el inglés de los EEUU ; y si usted no puede llegar a mí que tampoco, simplemente me en inglés), el encabezado será :

    Accept-Language: fr-fr,en-us;q=0.7,en;q=0.3

    Y, a partir de PHP :

    string 'fr-fr,en-us;q=0.7,en;q=0.3' (length=26)


    Para más información, puede echar un vistazo a la sección 14.4 de la solicitud HTTP.

    Y usted probablemente puede encontrar un montón de código de ejemplo en PHP para analizar que la cabecera ; por ejemplo : Analizar Accept-Language para detectar el idioma del usuario

    Divertirse !

    • es el más idioma preferido siempre el primer parámetro en la cabecera?
  2. 8

    Aquí está el script que he usado para un bi-lingual sitio. Es para ser utilizado como index.php de mysite.com. Basado en el navegador del usuario de la preferencia de idioma, se canalizaran a la deseada versión de idioma del sitio o el idioma predeterminado del sitio si el sitio en el idioma preferido del usuario no estaba disponible.

    <?php
    //List of available localized versions as 'lang code' => 'url' map
    $sites = array(
        "en" => "http://en.mysite.com/",
        "bn" => "http://bn.mysite.com/",
    );
    
    //Get 2 char lang code
    $lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
    
    //Set default language if a `$lang` version of site is not available
    if (!in_array($lang, array_keys($sites)))
        $lang = 'en';
    
    //Finally redirect to desired location
    header('Location: ' . $sites[$lang]);
    ?>
  3. 4

    Puede utilizar: Locale::acceptFromHttp().

    Intenta encontrar la configuración regional que puede satisfacer la lista de idiomas que se solicita por el HTTP «Accept-Language» encabezado.

    • ser consciente de que esta función devuelve sólo los idiomas que se considera válido. Yo tenía el problema de que en Egipto que devuelve es_es para las personas que prefieren ar-AR (que no es un idioma oficial de la variante de curso, pero parece ser utilizado)
    • Usted también necesita obviamente la configuración Regional de las clases, que no son parte de la predeterminada de la instalación de PHP. Usted puede obtener con sudo apt-get install php-intl -y en ubuntu. O quitando extension=intl en php.ini en xamp.
    • Personalmente creo que para la mayoría de básica de casos de uso, substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2); tiene más sentido.
    • substr($_SERVER[‘HTTP_ACCEPT_LANGUAGE’], 0, 2); no corectly analizar: da, en-gb;q=0.7, en;q=0.8
  4. 4

    Sé que hay ya muchas buenas soluciones, pero no he encontrado mi propio camino para resolver este problema.

    <?php
      $prefLocales = array_reduce(
        explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']), 
          function ($res, $el) { 
            list($l, $q) = array_merge(explode(';q=', $el), [1]); 
            $res[$l] = (float) $q; 
            return $res; 
          }, []);
        arsort($prefLocales);
        /*
        This get you from headers like this
          string 'en-US,en;q=0.8,uk;q=0.6,ru;q=0.4' (length=32)
        array like this
        array (size=4)
          'en-US' => float 1
          'en' => float 0.8
          'uk' => float 0.6
          'ru' => float 0.4
        */

    Código de convertir HTTP_ACCEPT_LANGUAGE cadena a un array con lugares como claves y peso como valores, ordenados de alto valor a la baja. Así que usted puede conseguir uno por uno con array_shift para obtener el mejor coincida con su sitio configuraciones regionales.

    • Aunque esta es una solución digna, he votada abajo, ya que el código sólo respuestas no son frescos. Usted ha dado ninguna indicación de por qué su respuesta es la mejor y, a menos que el lector ya sabe por qué su respuesta es buena, esto los deja con más preguntas que respuestas.
    • fijo, compruebe por favor
  5. 1

    El código se ve bien. Es posible que desee añadir un final else opción predeterminada si el visitante pide un idioma que no están brindando.
    También, si el visitante él mismo selecciona un idioma que usted debe guardar la elección en una cookie persistente y comprobar su valor, dándole prioridad sobre HTTP_ACCEPT_LANGUAGE.

    Tan lejos como puedo decirle a Youtube hace uso de HTTP_ACCEPT_LANGUAGE, pero al mismo tiempo utiliza la geolocalización por IP para sugerir un cambio en el lenguaje si el idioma del país del visitante no coincide. Definitivamente molesto.

    Sólo una molestia: si vas a agregar idiomas a la lista un switch() declaración podría ser más legible.

  6. 0

    Probar Este

    function getUserLanguage() {
        $langs = array();
    
        if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
            //break up string into pieces (languages and q factors)
            preg_match_all(
                '/([a-z]{1,8}(-[a-z]{1,8})?)\s*(;\s*q\s*=\s*(1|0\.[0-9]+))?/i',
                $_SERVER['HTTP_ACCEPT_LANGUAGE'],
                $lang_parse
            );
    
            if (count($lang_parse[1])) {
                //create a list like 'en' => 0.8
                $langs = array_combine($lang_parse[1], $lang_parse[4]);
    
                //set default to 1 for any without q factor
                foreach ($langs as $lang => $val) {
                    if ($val === '') {
                        $langs[$lang] = 1;
                    }
                }
                //sort list based on value
                arsort($langs, SORT_NUMERIC);
            }
        }
        //extract most important (first)
        reset($langs);
        $lang = key($langs);
    
        //if complex language simplify it
        if (stristr($lang, '-')) {
            list($lang) = explode('-', $lang);
        }
    
        return $lang;
    }
    • Este parece tener un tipo de error de sintaxis en algún lugar. Supongamos que las citas están rotos.
    • Me he fijado esta 😉
    • la expresión no coincide con langs como sr-latn-rs o es-419. también * el lenguaje no es respetado. lo he cambiado a /([a-z*\-0-9]+)\s*(;\s*q\s*=\s*(1/0\.[0-9]+))?/yo y el 2º argumento de array_combine de $lang_parse[4] a $lang_parse[3]
    • Esto no es un vertedero para inexplicable código.
  7. 0

    Esto también es posible. Va a utilizar el inglés como predeterminado si .php no está disponible.

    $lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
    (@include_once 'languages/'.$lang.'.php') or (@include_once 'languages/en.php'); 
  8. 0

    Aquí una función para seleccionar la mejor de un grupo de idiomas soportados. Se extrae de las lenguas de Accept-Language, a continuación, ordena el array de idiomas de acuerdo a su prioridad.

    function select_best_language($languages) {
        if (!$_SERVER['HTTP_ACCEPT_LANGUAGE']) return $languages[0];
        $default_q=100;
        foreach (explode(",",$_SERVER['HTTP_ACCEPT_LANGUAGE']) as $lqpair) {
            $lq=explode(";q=",$lqpair);
            if ($lq[1]) $lq[1]=floatval($lq[1]); else $lq[1]=$default_q--;
            $larr[$lq[0]]=$lq[1];
        }
        usort($languages,function($a,$b) use ($larr) { return $larr[$b]<=>$larr[$a]; });
        return $languages[0];
    }
    
    $lang = select_best_language(['en','fr','it']);
  9. -1
    if(isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])){
        $parts=explode(';',$_SERVER['HTTP_ACCEPT_LANGUAGE']);
        $langs=explode(',',$parts[0]);
        var_dump($langs);
    }
    • Podría usted explicar qué está pasando?
    • El uso de este código y obtendrá la matriz de aceptar idiomas
    • Yo quería señalar que una buena respuesta debe incluir una explicación en lugar de sólo dejar caer código.
    • Este código no funciona en absoluto. Primero se divide por punto y coma, mientras que las lenguas se separan mediante comas – y luego se divide el resultado de la primera por comas. Por lo tanto, se devolverá sólo los idiomas que no tienen prioridades establecidas. Para «en,fr,jp;p=0.9,es;q=0.8» va a volver [«en»,»fr»,»jp»].

Dejar respuesta

Please enter your comment!
Please enter your name here