par
Hywan » 16 oct. 2008, 20:03
Hey

,
C'est moi ou tu n'écoutes (lis) pas ce que Victor te dit ?
Je t'explique dans les grandes lignes ce qu'il faut savoir. Pioche ce dont tu as besoin.
Il existe un format décrit par la norme ISO-3166 et qui représente la langue et la région (on ne parle pas de pays car ce serait faire des erreurs ; pour comprendre, on peut prendre l'exemple d'un pays où on parle plusieurs langues). Problème, il existe deux normes 3166, on trouve la vraie norme : ISO-3166-1_alpha_2, et la norme de Microsoft : ISO-3166-1_alpha_3.
L'alpha 2 a la forme
xx_XX où
xx représente la langue, et
XX représente la région. L'alpha 3 a la forme
xxx_XXX où
xxx et
XXX représente respectivement la langue et la région.
Voilà le problème. Si on est dans le cas d'un encodage alpha 3, il faut pouvoir le convertir en alpha 2. Et dans tous les cas, si on arrive à avoir un alpha 2, on peut travailler comme il faut.
Maintenant, comment en déduire les langages et les régions pleines ou complètes, c'est à dire un nom complet et pas un abrégé ? Soit on a plein de sous et on achète une norme complète, soit on cherche comme on peut des liens à droite à gauche. On peut nommer entre autre :
Il existe aussi un autre format que l'alpha 2 ou 3, je ne sais plus son nom, mais on peut avoir Paris/Europe je crois. On trouve les informations dans les liens précédents.
Ce format est encore plus fin car permet une meilleure localisation. Il simplifie un peu le processus aussi, on verra pourquoi.
Premièrement : une meilleur localisation, car pour un très grand pays (Canada, Russie …) on trouve plusieurs fuseaux horaires. Se baser sur la langue et la région est une erreur car dans le cas du Canada, on a des régions qui comportent plus d'un fuseau horaire.
Secondement : une simplification du processus (ou pas), car à partir de la ville, on peut en déduire le pays, et à partir du continent (partie après le
slash), on peut valider le pays trouvé. Et oui, on peut trouver des villes du même nom dans deux pays différents : Paris aux USA et en France par exemple. Le continent nous aide donc. On peut trouver plusieurs villes pour un même pays. Attention, les villes ne sont pas forcément les capitales car un pays peut avoir plusieurs capitales (si c'est un pays en guerre par exemple).
On voit clairement que le problème est plus complexe qu'il n'y paraît.
Maintenant : où trouver le code ISO 3166 ? On peut regarder la valeur du navigateur (qui par défaut est celle de l'OS de l'utilisateur, on ne peut pas mieux faire). Cette valeur se trouve dans $_SERVER['HTTP_ACCEPT_LANGUAGE'] sous PHP.
Heureusement pour nous, cette valeur est normée. On trouve sa spécification dans
la RFC 2616 : Hypertext Transfer Protocol — HTTP/1.1, et on trouve la spécification de la valeur
Accept-Language dans la section
14.4 Accept-Language. On apprend que la forme de cette valeur est la suivante :
Code : Tout sélectionner
Accept-Language = "Accept-Language" ":"
1#( language-range [ ";" "q" "=" qvalue ] )
language-range = ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) | "*" )
Ceci peut facilement se transformer en une expression régulière. Un premier jet serait :
On apprend qu'il y a un coefficient
q. En effet, on peut avoir plusieurs langues et le coefficient
q indique qu'elle est la langue favorite de (ou préférée par) l'utilisateur. On prendra donc le coefficient le plus grand pour être en accord avec lui.
Enfin, on travaille avec la localisation. C'est à dire qu'on utilise la fonction setlocale() de PHP qui — si le serveur est bien configuré — devrait nous permettre de modifier les taux de change pour les monnaies, les dates et heures, les langues etc.
Voilà, j'ai été vite, mais tu as
grosso modo toute la démarche (et oui, ce n'est pas simple)

. Il faut donc retenir qu'à partir du code ISO-3166-1_alpha_2, on peut tout déduire de la position de l'utilisateur (s'il dit la vérité), c'est beau non

?