Je cherche un script fiable et SIMPLE pour détecter la langue préférée
de l'user agent.
Par exemple si je reçois par HTTP_ACCEPT_LANGUAGE :
fr;q=1.0,en;q=0.9
je sais que je dois envoyer du français et à défaut de l'anglais.
(Il faut savoir que tous les UA ne renvoient pas le même format.)
J'ai vu des scripts trop compliqués. Ce dont j'ai besoin c'est de savoir
quelle sont les langues acceptées par l'UA dans leur ordre de préférence.
Je me charge ensuite de transférer ces informations dans le xml:lang (si
les infos retournées peuvent être au format "fr" ou "fr-FR" c'est tout
bénéfice) et bien sûr d'adapter le contenu de la page.
Il suffit d'appeler negotiateLanguage(array('fr', 'en')); avec les langues que tu proposes (par ordre de préférence) et ça te retourne la langue à utiliser au final. Par contre "en" ne fonctionne pas avec "en-us" et trucs du style.
Sebastien a dit le 27/03/2005 à 11:50:
Je cherche un script fiable et SIMPLE pour détecter la langue préférée
de l'user agent.
Voici une fonction générique que j'utilisais dans une classe que je t'ai
un peu adaptée.
Il suffit d'appeler negotiateLanguage(array('fr', 'en')); avec les
langues que tu proposes (par ordre de préférence) et ça te retourne la
langue à utiliser au final.
Par contre "en" ne fonctionne pas avec "en-us" et trucs du style.
Il suffit d'appeler negotiateLanguage(array('fr', 'en')); avec les langues que tu proposes (par ordre de préférence) et ça te retourne la langue à utiliser au final. Par contre "en" ne fonctionne pas avec "en-us" et trucs du style.
Matt
loufoque wrote:
Sebastien a dit le 27/03/2005 à 11:50:
Je cherche un script fiable et SIMPLE pour détecter la langue préférée de l'user agent.
cette fonction te retournera par exemple: Array ( [0] => en [1] => fr [2] => fr-fr [3] => en-us )
-- Matthias Etienne http://www.php-help.net
loufoque
Matt a dit le 28/03/2005 à 02:09:
if(!ereg('q=', $p[0])) {
preg_match est plus rapide, et pourtant on trouve sur sa documentation Tip: Do not use preg_match() if you only want to check if one string is contained in another string. Use strpos() or strstr() instead as they will be faster.
En effet, ici, tu n'as besoin que de strpos().
Matt a dit le 28/03/2005 à 02:09:
if(!ereg('q=', $p[0])) {
preg_match est plus rapide, et pourtant on trouve sur sa documentation
Tip: Do not use preg_match() if you only want to check if one string is
contained in another string. Use strpos() or strstr() instead as they
will be faster.
preg_match est plus rapide, et pourtant on trouve sur sa documentation Tip: Do not use preg_match() if you only want to check if one string is contained in another string. Use strpos() or strstr() instead as they will be faster.
En effet, ici, tu n'as besoin que de strpos().
Sebastien
Par contre "en" ne fonctionne pas avec "en-us" et trucs du style.
Petite question complémentaire dans ce cas : est-ce que tous les user-agent retournent forcément une langue générique quand ils supportent différents sous-groupes. C'est ce que fait Mozilla, mais est-ce un standard, et surtout est-il respecté ?
Ce n'est pas critique pour moi puisqu'il n'y aura qu'une seule version française (les Belges, Suisses et Québequois se paieront un traducteur ;-)) et une seule version anglaise (les Canadiens, Australiens et le reste du monde parlent déjà l'anglais Américain). Bref...
En tout cas loufoque ton script est excellent ! Il réagit bien avec Opera 8 beta2, Opera 7.54, Firefox 1.0.1 (oui, oui, je le mets à jour tout de suite!), IE5.01, IE5.5, IE6, Lynx 2-8-5, qui retournent chacun une chaîne différente pour HTTP_ACCEPT_LANGUAGE.
Matt, ton script fonctionne également, et permet même d'accéder aux régionalisations des langues. Je le garde donc en réserve (avec ta permission) mais étant dans le top 100 des développeurs les plus parésseux, je vais utiliser celui de loufoque qui correspond à mon besoin très simple.
Le fait de pouvoir comparer les langues acceptées (par l'UA) avec les langues supportées (par le site) est vraiment génial !
Merci à vous deux.
Sébastien
Par contre "en" ne fonctionne pas avec "en-us" et trucs du style.
Petite question complémentaire dans ce cas : est-ce que tous les
user-agent retournent forcément une langue générique quand ils
supportent différents sous-groupes. C'est ce que fait Mozilla, mais
est-ce un standard, et surtout est-il respecté ?
Ce n'est pas critique pour moi puisqu'il n'y aura qu'une seule version
française (les Belges, Suisses et Québequois se paieront un traducteur
;-)) et une seule version anglaise (les Canadiens, Australiens et le
reste du monde parlent déjà l'anglais Américain). Bref...
En tout cas loufoque ton script est excellent ! Il réagit bien avec
Opera 8 beta2, Opera 7.54, Firefox 1.0.1 (oui, oui, je le mets à jour
tout de suite!), IE5.01, IE5.5, IE6, Lynx 2-8-5, qui retournent chacun
une chaîne différente pour HTTP_ACCEPT_LANGUAGE.
Matt, ton script fonctionne également, et permet même d'accéder aux
régionalisations des langues. Je le garde donc en réserve (avec ta
permission) mais étant dans le top 100 des développeurs les plus
parésseux, je vais utiliser celui de loufoque qui correspond à mon
besoin très simple.
Le fait de pouvoir comparer les langues acceptées (par l'UA) avec les
langues supportées (par le site) est vraiment génial !
Par contre "en" ne fonctionne pas avec "en-us" et trucs du style.
Petite question complémentaire dans ce cas : est-ce que tous les user-agent retournent forcément une langue générique quand ils supportent différents sous-groupes. C'est ce que fait Mozilla, mais est-ce un standard, et surtout est-il respecté ?
Ce n'est pas critique pour moi puisqu'il n'y aura qu'une seule version française (les Belges, Suisses et Québequois se paieront un traducteur ;-)) et une seule version anglaise (les Canadiens, Australiens et le reste du monde parlent déjà l'anglais Américain). Bref...
En tout cas loufoque ton script est excellent ! Il réagit bien avec Opera 8 beta2, Opera 7.54, Firefox 1.0.1 (oui, oui, je le mets à jour tout de suite!), IE5.01, IE5.5, IE6, Lynx 2-8-5, qui retournent chacun une chaîne différente pour HTTP_ACCEPT_LANGUAGE.
Matt, ton script fonctionne également, et permet même d'accéder aux régionalisations des langues. Je le garde donc en réserve (avec ta permission) mais étant dans le top 100 des développeurs les plus parésseux, je vais utiliser celui de loufoque qui correspond à mon besoin très simple.
Le fait de pouvoir comparer les langues acceptées (par l'UA) avec les langues supportées (par le site) est vraiment génial !
Merci à vous deux.
Sébastien
loufoque
Sebastien a dit le 29/03/2005 à 09:08:
Petite question complémentaire dans ce cas : est-ce que tous les user-agent retournent forcément une langue générique quand ils supportent différents sous-groupes. C'est ce que fait Mozilla, mais est-ce un standard, et surtout est-il respecté ?
Aucune idée.
Sinon, il suffit sûrement de faire (non testé) $item_tmp = strtolower(substr($matches[1][$i], 0, 2)); au lieu de $item_tmp = strtolower($matches[1][$i]); pour que ça fonctionne
Ainsi si l'utilisateur renvoit "fr-fr,en;q=0.9" par exemple, on retourne "fr" et pas "en".
Sebastien a dit le 29/03/2005 à 09:08:
Petite question complémentaire dans ce cas : est-ce que tous les
user-agent retournent forcément une langue générique quand ils
supportent différents sous-groupes. C'est ce que fait Mozilla, mais
est-ce un standard, et surtout est-il respecté ?
Aucune idée.
Sinon, il suffit sûrement de faire (non testé)
$item_tmp = strtolower(substr($matches[1][$i], 0, 2));
au lieu de
$item_tmp = strtolower($matches[1][$i]);
pour que ça fonctionne
Ainsi si l'utilisateur renvoit "fr-fr,en;q=0.9" par exemple, on retourne
"fr" et pas "en".
Petite question complémentaire dans ce cas : est-ce que tous les user-agent retournent forcément une langue générique quand ils supportent différents sous-groupes. C'est ce que fait Mozilla, mais est-ce un standard, et surtout est-il respecté ?
Aucune idée.
Sinon, il suffit sûrement de faire (non testé) $item_tmp = strtolower(substr($matches[1][$i], 0, 2)); au lieu de $item_tmp = strtolower($matches[1][$i]); pour que ça fonctionne
Ainsi si l'utilisateur renvoit "fr-fr,en;q=0.9" par exemple, on retourne "fr" et pas "en".