Page 1 sur 1

connaitre les langages du navigateur d'un visiteur

Posté : 13 janv. 2008, 01:06
par netsupra
Bonsoir,
une petite fonction que j'ai codé sur un coin de table pour retourner par ordre de préférence les langages d'un visiteur :
function get_pref_language ($str_http_languages)
{
    $pattern_language = "`([a-z\-]{2,5})(;q=(.{3}))?`";
    preg_match_all($pattern_language, $str_http_languages, $accept_languages);
    arsort($accept_languages[3]);
    $stack_order_languages = array();
    foreach($accept_languages[3] as $key => $value)
    {
        if(!$value)
            array_unshift($stack_order_languages, $accept_languages[1][$key]);
        else
            array_push($stack_order_languages, $accept_languages[1][$key]);
    }
    return($stack_order_languages);
}
On peut certainement faire plus simple, mais c'est deja leger.

Netsupra

Posté : 13 janv. 2008, 03:14
par Hywan
Bonsoir,

l'expression régulière n'est pas assez correcte.
Il faut regarder la RFC 2616 pour avoir plus d'informations (après la documentation, les RFCs ;-)encore plus chiiiant —).
(page 103)

14.4 Accept-Language

The Accept-Language request-header field is similar to Accept, but
restricts the set of natural languages that are preferred as a
response to the request. Language tags are defined in section 3.10.

Code : Tout sélectionner

Accept-Language = "Accept-Language" ":" 1#( language-range [ ";" "q" "=" qvalue ] ) language-range = ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) | "*" )
L'expression régulière se déduit :

Code : Tout sélectionner

#(?:([\w-]+),)?([\w-]+);q=([0-9\.]+)#
J'ai fais quelque chose d'équivalent, en plus complet (environ 100 lignes de codes). Mais ça ne retourne que la langue qui a la plus forte préférence, ou la plus faible. Je traite toutes les préférences, mais le résultat c'est le max ou le min. Au passage, on pense à réécrire le résultat de façon standard (XX_xx, cf l'iso-3166-1_alpha-2). Je valide aussi le résultat, et s'il n'est pas cohérent, tente d'en trouver un.
C'est une méthode qui fait parti du package Hoa_Locale. Hoa sortira bientôt, j'espère ... Je ne perds pas espoir de sortir mon bébé ;-).

Bref, tu as des éléments à explorer :).