Avis sur une gestion multilingue en PHP

Avis sur une gestion multilingue en PHP - PHP - Programmation

Marsh Posté le 02-03-2006 à 12:03:07    

Yop les moules :o
 
Ya un pote qui m'avait demandé comment gérer plusieurs langues en PHP. Donc je lui ai répondu qu'il fallait utiliser les sessions et l'inclusion d'un fichier de langue contenant les variables ou un tableau, enfin c'est  comme on veut.
 
de toute manière le but du jeu était de tout simplement inclure un fichier de langue.
le bordel se présente de la manière suivante :  

Code :
  1. |-lang
  2. |   |-lang.php  (contient le script de gestion de langue)
  3. |   |-fr.php (contient le francais)
  4. |   |-en.php (contient l'anglais)
  5. |-index.php (fichier pour l'exemple)
  6. |-page2.php (fichier d'exemple pour montrer le boulot en session)


 
Donc pour tout ce tralala je suis parti d'un algo tout con :  

Code :
  1. Si langueSession existe alors
  2.  varlang = languesession
  3. sinon
  4.  si get existe alors
  5.    varlang = get_langue
  6.    languesession=varlang
  7.  sinon
  8.    varlang = languenavigateurduvisiteur
  9.    languesession=varlang
  10.  finsi
  11. finsi
  12. si fichierlangue existe alors
  13.  inclus fichierlangue
  14. sinon
  15.  varlang=languepardefaut
  16.  languesession=varlang
  17.  inclus fichierlangue par defaut
  18. finsi


 
Donc pour faire fonctionner tout cela
pour chaque page du site il faut taper les 3 lignes suivantes

Code :
  1. session_name("nomdelapplicationenligne" );
  2. include("lang/lang.php" );


 
Voici ce que donne le code du fichier lang.php :  

Code :
  1. <?
  2. $default_language = "en";
  3. $langue="";
  4. if (isset($_GET["lang"])) {
  5.     /*Test en GET pour savoir si un user a choisi une langue*/
  6.     $langue = strtolower($_GET["lang"]);
  7.    $_SESSION["languesite"]=$langue;
  8. }
  9. else {
  10.     if (isset($_SESSION["languesite"])) {
  11.         /*Récupération de la langue par défaut*/
  12.         $langue=$_SESSION["languesite"];
  13.     }
  14.     else {
  15.         /*Récupération de la langue du navigateur, ceci est surtout valable lors d'une première visite sur le site*/
  16.         $langue=strtolower(substr($_SERVER["HTTP_ACCEPT_LANGUAGE"], 0,2));
  17.         $_SESSION["languesite"]=$langue;
  18.     }
  19. }
  20.  
  21. /*Inclusion du fichier de langue*/
  22. $filepath = getcwd()."/lang/".$langue.'.php';
  23. if (file_exists($filepath)) { /*On vérifie si le fichier de langue existe bien*/
  24.     include($langue.".php" ); /*S'il existe on l'inclu*/
  25. }
  26. else { /*Si le fichier de langue n'existe pas dans ce cas on inclu le fichier de langue par défaut et on attribut la langue par défaut comme langue de session*/
  27.     $langue= strtolower($default_language);
  28.     include($langue.".php" );
  29.     $_SESSION["languesite"]=$langue;
  30. }
  31. ?>


 
Un des fichiers de langue fr.php :

Code :
  1. <?
  2. $ACC_WELCOME = "Bienvenue sur mon site";
  3. $ACC_LANGUE = "Choisissez une langue";
  4. $ACC_LANGUE_FR = "Français";
  5. $ACC_LANGUE_EN = "Anglais";
  6. $ACC_LANGUE_ES = "Espagnol";
  7. $P2_1 = "Ceci est la page 2";
  8. $P2_2 = "Retour à la page 1";
  9. ?>


 
la page index.php pour tester :

Code :
  1. <?
  2. session_name("languestruc" );
  3. session_start();
  4. include("lang/lang.php" );
  5. ?>
  6. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  7. <html xmlns="http://www.w3.org/1999/xhtml">
  8. <head>
  9. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
  10. <title>Document sans titre</title>
  11. </head>
  12. <body>
  13. <p>
  14. <?=$ACC_WELCOME?>
  15. </p>
  16. <p>
  17. <?=$ACC_LANGUE?>
  18. <ul>
  19.  <li><a href="?lang=fr"><?=$ACC_LANGUE_FR?></a></li>
  20.  <li><a href="?lang=en"><?=$ACC_LANGUE_EN?></a></li>
  21.  <li><a href="?lang=es"><?=$ACC_LANGUE_ES?></a></li>
  22. </ul>
  23. </p>
  24. <a href="page2.php">page 2</a>
  25. </body>
  26. </html>


 
la page page2.php pour tester :

Code :
  1. <?
  2. session_name("languestruc" );
  3. session_start();
  4. include("lang/lang.php" );
  5. ?>
  6. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  7. <html xmlns="http://www.w3.org/1999/xhtml">
  8. <head>
  9. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
  10. <title>Document sans titre</title>
  11. </head>
  12. <body>
  13. <p>
  14. <?=$P2_1?>
  15. </p>
  16. <a href="index.php"><?=$P2_2?></a>
  17. </body>
  18. </html>


 
Pour vous donner une idée les pages se trouvent ici :
http://gatsu.ftp.free.fr/langues/index.php
 
choisissez une langue a la page 1
puis aller à la page 2, vous verrez la page 2 dans la langue que vous aurez choisie.
puis retourner a la page 1 et la page 1 est toujours dans la même langue.
 
 
Donc je vous demande votre avis sur ma façon de faire.
Après chacun est libre de faire ce qu'il veut, une fois la variable $langue récupérée.
Bien sur il faut tester en tout dernier si la langue convoitée existe parmis les langues du site, sinon dans le cas contraire on affiche la langue par défaut du site.
 
Toutes les méthodes sont bonnes, après cela dépend naturellement de la taille du site ou de votre facon de faire.
 
 
Enfin vous pouvez critiquer cracher sur moi je m'en fous :o je vous ecouterai et améliorerai le bestiau.
 
PS : n'importe quel malin pourra remplacer lang=fr par lang=tamere dans le get, il pourra aller se faire voir :o ca ne marchera pas :o
PS2 : suite à un constat simple fait sous FF et IE, je récupère que les 2 Premiers caractères de la chaine retournée par le navigateur, car il existe plusieurs types de langue.
ex : on a l'anglais (en), mais aussi l'anglais sud africain (en-za) l'anglais autralien (en-au)
idem pour lespagnol, le francais, donc pour moi l'anglais c'est de l'anglais.
On va pas s'amuser à faire un site dans n'importe quelle langue du monde.
PS3 : Même si la première langue du navigateur ne correspond à aucune des langues que nous avons, de toute manière le site sera affiché dans la langue par défaut.
 
 
Améliorations possibles :  
-Regarder si pour chaque langue fournie par le navigateur de l'utilisateur, si la premiere n'est pas dans nos langue alors la deuxième langue de l'utilisateur sera choisis et ainsi de suite
par exemple, si le user à les langues dans l'ordre suivant :  
cz, ru, en, fr
et que nous possédons que le FR, alors on ira checker chaque langue jusqu'à trouver celle adequat.
 
je reformulerai tout ça après :o

Message cité 1 fois
Message édité par gatsu35 le 02-03-2006 à 12:23:35
Reply

Marsh Posté le 02-03-2006 à 12:03:07   

Reply

Marsh Posté le 02-03-2006 à 12:06:14    

[:drapo]
 
 je me posait la question, ta solution me plait. [:dawa]


---------------
IVG en france
Reply

Marsh Posté le 02-03-2006 à 12:08:50    

on peut pas mettre la langue sur tamere? :o

Reply

Marsh Posté le 02-03-2006 à 12:11:05    

bha meme si tu t en fout des constantes etc perso je trouve plus pratique de faire des  

Code :
  1. DEFINE('MA_VAR_LANGUE_1','Mon blabla ddans la langue');
  2. DEFINE ...

dans tes fichiers de langues
Et alors éventuellement faire un fichier genre french.php qui reprend les mot ou phrases utilisées à plusieurs endroit sur le site et ensuite un fichier de langue par fichier. Enfin se n'est justifiable que si tu as bcp de pages!

Reply

Marsh Posté le 02-03-2006 à 12:14:00    

the big ben a écrit :

bha meme si tu t en fout des constantes etc perso je trouve plus pratique de faire des  

Code :
  1. DEFINE('MA_VAR_LANGUE_1','Mon blabla ddans la langue');
  2. DEFINE ...

dans tes fichiers de langues
Et alors éventuellement faire un fichier genre french.php qui reprend les mot ou phrases utilisées à plusieurs endroit sur le site et ensuite un fichier de langue par fichier. Enfin se n'est justifiable que si tu as bcp de pages!


Je trouve plus pratique de n'avoir qu'un fichier par langue mais ceci est bien pour un petit site
si c'est un gros site on pourrai tomber par 1 fichier par page et par langue (ca fait bocou)
ou bien un répertoire de langue et un fichier par page dans chaque rep de langue
 
Pour le moment c'est ma facon de tester la langue et les session qui est mise en avant.

Reply

Marsh Posté le 02-03-2006 à 12:22:41    

moi j'aurais intuitivement fait un truc du même genre (peut etre surement moins propre  :whistle: ), par contre je ne connaissait pas session_name("languestruc" );, je ne comprend pas bien a quoi ca sert, c'est dans le ca ou les sessions passe par l'url ?


---------------
D3
Reply

Marsh Posté le 02-03-2006 à 12:25:07    

mechkurt a écrit :

moi j'aurais intuitivement fait un truc du même genre (peut etre surement moins propre  :whistle: ), par contre je ne connaissait pas session_name("languestruc" );, je ne comprend pas bien a quoi ca sert, c'est dans le ca ou les sessions passe par l'url ?


 
une session ca na passe pas par l'url :o,  mais c'est un jeu avec les cookies et autres blabla.
 
J'ai fait un session_name dans le cas ou tu as plusieurs application sur un même serveur web, du coup ma variable de session pourrait écraser celle d'une autre application.
Voili-voilou :o

Reply

Marsh Posté le 02-03-2006 à 12:31:18    

gatsu35 a écrit :

une session ca na passe pas par l'url :o,  mais c'est un jeu avec les cookies et autres blabla.


je crois que si, si l'utilisateur refuse les cookies et que le serveur est configuré pour (cf. le post avec le PB de sessionID indexe par un moteur de recherche)

gatsu35 a écrit :

J'ai fait un session_name dans le cas ou tu as plusieurs application sur un même serveur web, du coup ma variable de session pourrait écraser celle d'une autre application.
Voili-voilou :o


 :jap: ah OK OK...

Message cité 1 fois
Message édité par mechkurt le 02-03-2006 à 12:32:40

---------------
D3
Reply

Marsh Posté le 02-03-2006 à 12:32:16    

mechkurt a écrit :

je crois que si, si l'utilisateur refuse les cookies et que le serveur est configuré pour (cf. le post avec le PB de sessionID indexe par un moteur de recherche)
 
 :jap: ah OK OK...


je plussois mais faire passer une session par URL c'est crade (cf sessionid)

Reply

Marsh Posté le 02-03-2006 à 12:34:34    

justement je pensais que c'etais peut etre fait pour proprifier le truc mais en reflechissant je vois pas bien comment...
j'ai été induit en erreur par ca:

Citation :

Le nom de session est utilisé comme nom de cookie ou nom de variable dans les URL


autant pour moi


---------------
D3
Reply

Marsh Posté le 02-03-2006 à 12:34:34   

Reply

Marsh Posté le 02-03-2006 à 12:37:16    

tu me feras 100 je vous salut Saint PHP et Sainte Session :o

Reply

Marsh Posté le 02-03-2006 à 18:40:39    

Bon vous avez le droit de donner vos avis. :o
Ben si c'est comme ça, je reviendrai que quand j'aurai amélioré le truc et fait une détection multilingue à partir du navigateur avec adaptation à la langue la plus importante du navigateur qui est disponible sur un site.
ça fera un systeme qui poutre sa maman :o. même si je trouve celui là déjà bien :o

Reply

Marsh Posté le 02-03-2006 à 19:59:43    

Au debut j'utilisais des variables dans des fichiers separes, mais le site devenant de plus en plus en gros, mon hebergeur m'a contacte : j'occupais trop de memoire, a stocker toutes ses variables ... J'ai donc opte pour un autre systeme :
 
 
J'utilise getText() et c'est bien pratique. Systeme GNU fait en python, tu crees autant de fichier que tu veux de langues.
Puis il suffit de faire :
 

Code :
  1. echo _('Bonjour'); // affiche hello;


 
 :hello:

Message cité 1 fois
Message édité par fabs2b le 02-03-2006 à 20:26:09
Reply

Marsh Posté le 02-03-2006 à 20:20:27    

Pour la gestion multilangue, j'avais pas mal hésité entre un truc comme toi, ou un command pattern : tu instancie la classe correspondant à la langue, ensuite tous les noms des méthodes sont les meme. (ça se rapproche de ce que propose fabs2b)

Reply

Marsh Posté le 02-03-2006 à 21:19:51    

moi je fais un include $_SESSION['lang']/mapage.php
 
avec chacune de mes pages traduites. Enfin j'ai un tableau de conversion
 
$lang = array('coucou' => 'hello')
 
et sur mapage.php (la vraie pas la traduction) ben je fais un echo $lang['coucou'];
 
C'est juste une idée supplémentaire


---------------
N'oubliez pas de mettre [RESOLU] dans le titre quand c'est fini - Pour poster vos sources : http://paste.clicksources.com/
Reply

Marsh Posté le 02-03-2006 à 21:23:08    

hummmm en fait les gars moi je parlais plutot du travail en amont, c'est à dire, la detection de la langue la plus appropriée pour le visiteur du site.
 
En gros :  
On verifie si le visiteur n'a pas déjà choisi une langue
On verifie si une langue n'existe pas en session
sinon on recupère la langue de preference du navigateur
puis on affiche, si la langue préférée par le user n'existe pas, on impose une langue par défaut (l'anglais de préférence)

Reply

Marsh Posté le 02-03-2006 à 21:26:38    

bah, c'est-à-dire que le travail en amont est assez naturel

Reply

Marsh Posté le 02-03-2006 à 21:27:10    

ben tu testes simplement ta session. Si il y en a une (cad choisie par l'utilisateur tu l'utilises) sinon par défaut tu pars sur l'anglais


---------------
N'oubliez pas de mettre [RESOLU] dans le titre quand c'est fini - Pour poster vos sources : http://paste.clicksources.com/
Reply

Marsh Posté le 02-03-2006 à 21:28:28    

ben je prefere aussi user de la langue de preference de l'utilisateur c'est un plus non negligeable, et je pense que le code que j'ai présenté et celui qui est le plus approprié, après pour l'utilisation de la langue c'est au choix de chacun, sans oublier qu'apres la detection de la langue il faut forcer la langue par defaut si la langue choisie n'existe pas

Reply

Marsh Posté le 03-03-2006 à 09:17:49    

Via un javascript je pense qu'on doit pouvoir détecter la langue du navigateur (enfin au moins pour IE et FireFox) et si c'est un autre navigateur pour lequel on ne connais pas la langue on attribue une langue par défaut!

Reply

Marsh Posté le 03-03-2006 à 09:22:47    

the big ben a écrit :

Via un javascript je pense qu'on doit pouvoir détecter la langue du navigateur (enfin au moins pour IE et FireFox) et si c'est un autre navigateur pour lequel on ne connais pas la langue on attribue une langue par défaut!


Toi tu ne dois pas avoir de notions web aussi avancées que les notres.
 
Via javascript, c'est vrai tu peux détecter la langue du navigateur, mais cela t'apporterai quoi ? Si le gars a désactivé le JS tu ne recupère rien du tout, rien ne se lance coté client.
Et puis c'est lors de la visite de l'utilisateur que l'on détecte la langue, donc via l'envoi d'informations venant du navigateur.
J'ai fait en sorte que le script detecte la premiere langue du navigateur, puis l'enregistre en session, après si l'utilisateur veut changer de langue, il le peut et cela n'affecte en rien la navigation dans le site.
 
dis toi bien qu'un site qui a besoin du JS pour être visité n'est pas un bon site

Reply

Marsh Posté le 15-11-2006 à 12:27:51    


Important : la détection du domaine...
 
www.SuperSiteInutile.com --> EN.US
www.SuperSiteInutile.fr --> FR.FR
www.SuperSiteInutile.de --> AL.DE
www.SuperSiteInutile.co.uk --> EN.UK
www.SuperSiteInutile.eu --> EN.EU avec menu déroulant pour sélection d'une langue européenne...
 
Remarque : ton système fonctionne, clairement, mais reste très limité.
Une page US peut être complètement différente d'une même page FR (choix des images, communication, contenus texte, etc.).
 
Vaut mieux une détection à l'arrivée sur le site ($_SERVER['SERVER_NAME'] & $_SERVER['HTTP_ACCEPT_LANGUAGE']), un template en index.php à la racine tout pareil, pi inclusions de fichiers "localisés" bien rangés dans les répertoires de type EN-US/, EN-UK/, FR-FR/, FR-BE/... etc.
 
Important, la maîtrise de chaque code HTML pour chaque localisation linguistique...
 
++

Reply

Marsh Posté le 15-11-2006 à 13:13:41    

pourquoi une session pour stocker une seule variable ? ça va créer un cookie avec le SID qui est déjà en lui même plus gros que le nom de la langue autant utiliser un cookie directement
 
pour ma part j'utilise du GET


---------------
La musique c'est comme la bouffe, tu te souviens du restaurant dans lequel t'as bien mangé 20 ans plus tôt, mais pas du sandwich d'il y a 5 minutes :o - Plugin pour winamp ©Harkonnen : http://harko.free.fr/soft
Reply

Marsh Posté le 15-11-2006 à 13:27:21    

tiens... drapal :D
 
Pour le moment je suis partis sur une gestion des langue par fichier XML (pour le contenu), et pour le choix de la langue, j'utilise ce que me retrouen le navigateur, avec par défaut le français, et directement une liste de choix contenant les autres langues.
 
EDIT : Et pis pour le passage des données, étant donné que je détecte déjà la résolution de l'écran, et que je passe déjà par session, et bien j'utilise les sessions pour le passage des langues.


Message édité par chani_t le 15-11-2006 à 13:28:47
Reply

Marsh Posté le 15-11-2006 à 17:44:22    

gatsu35 a écrit :

Donc je vous demande votre avis sur ma façon de faire.

fabs2b a écrit :

J'utilise getText() et c'est bien pratique.

Idem, cela m'étonne de ne voir qu'un seul message à ce propos...
gettext est conçu pour ça, ça serait dommage de ne pas l'utiliser :
- c'est plus performant (fichiers de langue compilés),
- il y a une fonction pour mettre au pluriel,
- le code est plus lisible...
 
http://fr.php.net/gettext
http://www.gnu.org/software/gettex [...] ttext.html
 

gatsu35 a écrit :

hummmm en fait les gars moi je parlais plutot du travail en amont, c'est à dire, la detection de la langue la plus appropriée pour le visiteur du site.

rien à redire ^^
 
 

Reply

Marsh Posté le 19-12-2007 à 20:58:47    

D'ailleurs, quelqu'un saurait comment faire pour que gettext fonctionne chez free ?
 
ça fonctionne chez moi (localhost) mais pas chez free. Je ne sais pas quoi modifier...
Aidez-moi.
merci
 
répertoire:
 
[racine]/lang/fr/messages.mo
[racine]/lang/fr/messages.po
 

Code :
  1. $domain = "messages";
  2. setlocale(LC_ALL, $lang);
  3. putenv('LANG='.$lang);
  4. putenv('LANGUAGE='.$lang);
  5. bindtextdomain($domain,'/lang');
  6. bind_textdomain_codeset($domain,"UTF-8" );
  7. textdomain($domain);


Message édité par manny42 le 19-12-2007 à 20:59:10
Reply

Marsh Posté le 19-12-2007 à 21:00:06    

Si free n'a pas l'extension gettext, point de salut :(

Reply

Marsh Posté le 20-12-2007 à 14:42:00    

moi j'utilise des define avec des fichiers de langue, tout bêtement. Vu qu'il y'a énormément de texte dans mon appli (forum :whistle: ), j'ai fragmenté l'ensemble en plusieurs fichiers, fichiers stockés dans un dossier spécifique et paramétrable.

Reply

Marsh Posté le 20-12-2007 à 15:39:53    

habituellement je passe par une bdd, ou un fichier xml.
 
de toute façon c'est collé en cache après le premier chargement, ça a l'avantage d'être aisément manageable depuis l'interface d'admin plutôt que de devoir trifouiller du code php à chaque modification d'un libellé/ajout d'une langue


Message édité par MagicBuzz le 20-12-2007 à 15:40:08
Reply

Marsh Posté le 20-12-2007 à 16:16:14    

FlorentG a écrit :

Si free n'a pas l'extension gettext, point de salut :(


 
Je viens de vérfiier avec phpinfo.
C'est bien activé chez Free. (GetText Support  enabled).
 
Qulequ'un a-t-il réussi à le faire fonctionner chez Free?

Reply

Marsh Posté le 28-12-2007 à 11:44:52    

Ca a été dit plus haut. Pour mon framework, j'ai un fichier de constantes.
Point barre. L'avantage c'est que c'est global, comme les traductions ne changent pas du jour au lendemain c'est donc bien constant. C'est un choix donc logique il me semble :) Pas besoin de fonction ou autre :o

Reply

Marsh Posté le 28-12-2007 à 12:15:51    

Il vaut mieux avoir un système où on peut appeller des fonctions, car pour certaines langues, une simple constante ne suffit pas pour traduire certains trucs, notamment pour ce qui est des pluriels

Reply

Marsh Posté le 28-12-2007 à 12:26:32    

Dans ce cas je fais plusieurs tags :) Après je suis sur qu'il y a des défauts et des avantages à chaque système.

Reply

Marsh Posté le 02-01-2008 à 00:03:34    

des défauts et des avantages certes mais aussi et surtout des contextes d'utilisation, getText c'est bien mais franchement pas pour un petit site où l'exemple plus haut me semble parfait (tout comme l'utilisation d'un tableau) donc après tout ça dépend des besoins de chacun :)
 
getText a le mérite d'être évolutive et bien adaptée pour de gros sites.

Reply

Marsh Posté le 13-05-2009 à 14:43:32    

super comme topic!! :)
 
je savais a peu près comment partir pour faire un site multilingue mais j'avais d'exemple concret ^^
je pense que je vais utiliser la méthode des DEFINE et du fichier de langue séparé.
 
 :hello:

Reply

Marsh Posté le 13-05-2009 à 14:52:06    

J'utilise un framework pour pas avoir à me faire une soluce maison à la main : http://framework.zend.com/manual/f [...] slate.html

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed