transformer les deux lettres de la langue [carte du monde]

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : transformer les deux lettres de la langue [carte du monde]

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_XXxx représente la langue, et XX représente la région. L'alpha 3 a la forme xxx_XXXxxx 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 :

Code : Tout sélectionner

(?:([\w-]+),)?([\w-]+);q=([0-9\.]+)
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 :) ?

par x@v » 16 oct. 2008, 13:30

pour voir le pays exacte je ne connais pas la technologie parfaite ?
Je fais en connaissance de cause, un affichage de la carte, suivis d'un tableau.

par Victor BRITO » 16 oct. 2008, 12:56

Le problème, c'est que la sous-chaîne que tu extrais correspond au code de la langue, qui ne correspond pas toujours à un pays. Prenons l'exemple du code ar : dans le domaine des codes de langue, il correspond à l'arabe ; en revanche, dans le domaine des pays, notamment des domaines Internet de premier niveau, il correspond plutôt à l'Argentine (dont la langue officielle est l'espagnol, pour mémoire).

Bref, si tu tiens à utiliser $_SERVER["HTTP_ACCEPT_LANGUAGE"], utilise toute la chaîne retournée, au lieu de te contenter des deux premiers caractères (soit dit en passant, certaines langues, plus rares il est vrai, ont un code à 3 lettres sans équivalent à 2 lettres).

Et puis, n'oublie pas qu'un utilisateur un minimum doué pour paramétrer son navigateur pourra toujours passer pour un hispanophone du Pérou alors qu'il habite en Chine et ne parle pas un mot d'espagnol. ;)

par x@v » 16 oct. 2008, 12:44

j'utlisie dans un back-office un plug in jquery, qui me donnent le pays que une carte du monde, ils utilisent le codage:
ISO 3166 country codes
http://code.google.com/apis/chart/#iso_codes

le plug in est ici:
http://keith-wood.name/gChart.html
allez sur l'onglet map.

La question des pays francophone est pertinente, je n'y réponds pas pour l'instant ?

La question me donne des éléments de réponses....

par Victor BRITO » 16 oct. 2008, 12:33

Le problème, c'est que ton bout de code ne récupérera que le code correspondant à une langue. Comment feras-tu ainsi pour distinguer un francophone de France (fr-FR) d'un francophone de Belgique (fr-BE) ou d'un Québéquois (fr-CA) ? ;) Même motif, même punition pour les anglophones ('en-US', 'en-UK', et j'en passe).

transformer les deux lettres de la langue [carte du monde]

par x@v » 16 oct. 2008, 12:21

Bonjour,
je mets en bdd les deux premières lettres de la lagngue du visiteur
$langue = substr($_SERVER["HTTP_ACCEPT_LANGUAGE"], 0, 2);
je la récupère sous cette forme.
FR: 32 visiteurs
Je voudrai avoir le nom du pays complet
ex:
france : 32 visiteurs
Merci