[PHP] Site multilangue : les methodes.

Site multilangue : les methodes. [PHP] - PHP - Programmation

Marsh Posté le 30-07-2002 à 18:03:35    

J'étais parti sur la methode BDD : une table langage avec une colone par langue, et une requete en début de page qui créé un tableau contenant les différents textes de la page...
 
Mais j'hésite avec une autre methode : un fichier (un par langage) contenant la description d'un tableau, chaque ligne correspondant à un texte, puis un include du fichier au debut de page.
 
Existe t'il d'autre methode ? Quelle est la mieux ?


Message édité par Snipe Foo le 30-07-2002 à 18:15:13
Reply

Marsh Posté le 30-07-2002 à 18:03:35   

Reply

Marsh Posté le 30-07-2002 à 18:11:56    

précise que tu parles de PHP :)
 
en java(jsp/servlets), on peut stocker des objets dans le servletContext, moi (enfin, moi...) j'y stocke (je ne rentre pas ds les details) les éléments "traduits", comme ça on ne le charge (à partir d'un fichier) qu'une fois par "application", et rien à inclure dans mes "pages".
Je ne pense pas qu'on puisse faire ce genre de choses avec php malheureusement.

Reply

Marsh Posté le 30-07-2002 à 18:14:37    

c'est vrai que je fais du PHP, donc une reponse orientée php m'arangerais ;) mais c'est aussi valable pour l'asp je pense.

Reply

Marsh Posté le 30-07-2002 à 18:16:29    

Y a bcp de méthodes.
 
1. La DB: C'est lentissime
2. Les templates: C'est pas mal mais ca ajoute pas mal de redondance  
3. Un tableau: Mouais, rapide, mais chiant a utiliser ($lang[][])
4. Des constantes: ca c'est pas trop mal encore, du genre:
  define("TEST",        "POLOM polom" );
 
tu inclus le bon fichier de langue et tu fais juste
echo(TEST); (sans $ sans rien)
 
Sinon y a aussi un truc avec l'extension gettext mais je m'en rapelle pas comme ca  ;)  
 


---------------
Informaticien.be - Lancez des défis à vos amis
Reply

Marsh Posté le 30-07-2002 à 18:19:44    

4 -> ?
 
là j'ai pas trop compris le coup des constantes, pkoi c'est mieux que le tableau ?

Reply

Marsh Posté le 30-07-2002 à 18:21:15    

Snipe Foo a écrit a écrit :

4 -> ?
 
là j'ai pas trop compris le coup des constantes, pkoi c'est mieux que le tableau ?



parce qu'il est plus facile de taper dans tes pages
 
$text_monbidule
 
que $text["monbidule"]
 
c tout:)
enfin je crois

Reply

Marsh Posté le 30-07-2002 à 18:23:09    

mais une requete sur une bdd c'est si lent que ça ? c'est juste un select where...

Reply

Marsh Posté le 30-07-2002 à 18:24:36    

Snipe Foo a écrit a écrit :

mais une requete sur une bdd c'est si lent que ça ? c'est juste un select where...



essaie, tu verras ;)
surtout qu'en general t'as plus d'un mot à afficher sur ta page:)

Reply

Marsh Posté le 30-07-2002 à 18:24:57    

moi je ferais du genre
 
-- texte.php --

<?
$intro[1]="c'est l'intro en francais";
$intro[2]="this is the intro in english";
$sommaire[1]="le sommaire";
$sommaire[2]="the menu";
?>


 
-- index.php --

<? include("texte.php" ); ?>
<html><table><ect...><?=$intro[$id_l]?></table><...>
<?=$sommaire[$id_l]?>...<.../html>


 
fichier index.php appelé avec index.php?id_l=1
1 pr francais
2 pour anglais dans l exemple

Reply

Marsh Posté le 30-07-2002 à 18:25:43    

--greg-- a écrit a écrit :

parce qu'il est plus facile de taper dans tes pages
 
$text_monbidule
 
que $text["monbidule"]
 
c tout:)
enfin je crois




 
C'est un peu plus rapide aussi, mais oui c'est clair que c plus facile à écrire surtout  ;)  
 
Pour ton select, compte que ca prends 10ms pour un mot, tu fous 50 elements sur une page, ca fait 0.5s rien que pour la traduction  :pt1cable:


---------------
Informaticien.be - Lancez des défis à vos amis
Reply

Marsh Posté le 30-07-2002 à 18:25:43   

Reply

Marsh Posté le 30-07-2002 à 18:26:19    

J-'-R a écrit a écrit :

moi je ferais du genre
 
-- texte.php --

<?
$intro[1]="c'est l'intro en francais";
$intro[2]="this is the intro in english";
$sommaire[1]="le sommaire";
$sommaire[2]="the menu";
?>


 
-- index.php --

<? include("texte.php" ); ?>
<html><table><ect...><?=$intro[$id_l]?></table><...>
<?=$sommaire[$id_l]?>...<.../html>


 
fichier index.php appelé avec index.php?id_l=1
1 pr francais
2 pour anglais dans l exemple



ça me parait pas évident a maintenir ce genre de choses
je prefere la solution include $langue.php   avec $langue qui vaut english, francais et donc un fichier par langue.

Reply

Marsh Posté le 30-07-2002 à 18:26:32    

J-'-R a écrit a écrit :

moi je ferais du genre
 
[...]




 
Déjà cité  :p  
De plus, la solution avec les constantes est de loin plus simple à écrire.


---------------
Informaticien.be - Lancez des défis à vos amis
Reply

Marsh Posté le 30-07-2002 à 18:26:37    

j'ai plus d'un mot, mais je ne fais qu'une seule requete par page (je récupere tous les textes d'un coup).

Reply

Marsh Posté le 30-07-2002 à 18:28:09    

Snipe Foo a écrit a écrit :

j'ai plus d'un mot, mais je ne fais qu'une seule requete par page (je récupere tous les textes d'un coup).



ben, rend toi bien compte que tout ça transite sur une cnx reseau au lieu de transiter sur une nappe IDE :)

Reply

Marsh Posté le 30-07-2002 à 18:32:32    

--greg-- a écrit a écrit :

ben, rend toi bien compte que tout ça transite sur une cnx reseau au lieu de transiter sur une nappe IDE :)




 
je sais bien que l'echange de données est plus rapide entre le disque et l'appli qu'entre l'appli et une base.
 
mais le truc qui me gene c'est de charger autant de truc en memoire a chaque appel de la page, combien y'a t'il de caractere dans un site complet (plus les caractere servants à la déclaration)?

Reply

Marsh Posté le 30-07-2002 à 18:33:57    

Snipe Foo a écrit a écrit :

 
 
je sais bien que l'echange de données est plus rapide entre le disque et l'appli qu'entre l'appli et une base.
 
mais le truc qui me gene c'est de charger autant de truc en memoire a chaque appel de la page, combien y'a t'il de caractere dans un site complet (plus les caractere servants à la déclaration)?




 
 :heink:  
 
C'est vrai qu'il vaux mieux gaspiller les resources du serveur SQL plutot que de perde 2-3k en mémoire  :pt1cable:


---------------
Informaticien.be - Lancez des défis à vos amis
Reply

Marsh Posté le 30-07-2002 à 18:37:36    

Snipe Foo a écrit a écrit :

 
 
je sais bien que l'echange de données est plus rapide entre le disque et l'appli qu'entre l'appli et une base.
 
mais le truc qui me gene c'est de charger autant de truc en memoire a chaque appel de la page, combien y'a t'il de caractere dans un site complet (plus les caractere servants à la déclaration)?



ben tu les charges quand meme à chaque appel de page vec ta methode, nan!? :heink:

Reply

Marsh Posté le 30-07-2002 à 18:40:48    

"gaspiller les ressources d'un serveur sql", je veux bien, mais un serveur sql c'est fait pour ça, et puis un select, je pense pas que ça aille chercher bien loin niveau ressources.
 
de plus 3000 caracteres pour un site c'est un peu peu, pour peu que tu ais des news, une faq etc... moi je dirais plutot 50Ko fois le nombre de pages simultanées...

Reply

Marsh Posté le 30-07-2002 à 18:41:26    

je charge que les textes présents dans ma page.

Reply

Marsh Posté le 30-07-2002 à 19:20:17    

je suis parti dans l'optique stockage dans une bd, mais uniquement pour les messages d'erreurs (ce qui limite à une query en cas d'erreur).
 
J'utilise aussi les templates pour les graphismes.  Et là je dois dire que c'est assez embêtant... pour chaque langue d'un même thème je dois recopier toute les pages templates (dans /EN/ par ex) et modifier le texte contenu à la main :(
(ça donne pas envie ;) )
 
Si je passais à une version qui rendrait plus facile la création d'une nouvelle langue pour un thème, j'opterais pour les constantes ou les tableaux...


---------------
...oups kernel error...
Reply

Marsh Posté le 30-07-2002 à 19:34:24    

Snipe Foo a écrit a écrit :

"gaspiller les ressources d'un serveur sql", je veux bien, mais un serveur sql c'est fait pour ça, et puis un select, je pense pas que ça aille chercher bien loin niveau ressources.
 
de plus 3000 caracteres pour un site c'est un peu peu, pour peu que tu ais des news, une faq etc... moi je dirais plutot 50Ko fois le nombre de pages simultanées...




 
Eh benh fait un include que de ce que tu as besoin tiens, sépares tes fichiers de traduction.
 
Enfin, je vois pas pourquoi je me casse le cul, tu demandes les méthodes, on te dit de prendre un truc parce que ta BD va ramer, et tu veux rien savoir.
 
Allez, bon amusement qd même, j'abandonne  
 :hello:


---------------
Informaticien.be - Lancez des défis à vos amis
Reply

Marsh Posté le 30-07-2002 à 19:37:35    

Perso ce que je fais (mais je ne dis pas que c'est une bonne méthode, c'est juste qu'on en a pas parlé) :
 

Code :
  1. switch($language) {
  2.     case "fr":
  3.       ici je definis toutes des variables contenant les chaines FR
  4.       break;
  5.     case "uk":
  6.       ici je definis des variables ayant les mêmes noms mais contenant les chaines UK
  7.       break;
  8.   }


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 30-07-2002 à 19:39:41    

zion : ok, j'ai pas pris ta methode en disant "wouha merci c'est la meilleure alors" mais c'est pas une raison pour te vexer, je veux connaitre les différences entre les différente methode et je ne comprend pas les arguments que tu avance, j'éssaie de discuter pour faire avancer les choses, j'ai jamais dis que la methode de la bdd était la mieux...


Message édité par Snipe Foo le 30-07-2002 à 19:40:17
Reply

Marsh Posté le 30-07-2002 à 19:49:26    

Snipe Foo a écrit a écrit :

 j'ai jamais dis que la methode de la bdd était la mieux...




 
 :non:  
 

Citation :

"gaspiller les ressources d'un serveur sql", je veux bien, mais un serveur sql c'est fait pour ça, et puis un select, je pense pas que ça aille chercher bien loin niveau ressources.


 
Sur ce, je me casse pour la soirée de toute facon  :na:


---------------
Informaticien.be - Lancez des défis à vos amis
Reply

Marsh Posté le 30-07-2002 à 19:57:51    

comme je te l'ai déjà dit sur un autre topic, j'utilise la méthode des tableaux dans des fichiers "francais.php","english.php" et bientôt "deutsch.php"...
Plusieurs raisons :
 - rapidité
 - simplicité
la simplicité et d'autant plus important que je veux que les utilisateurs de mon appli (PhpWebGallery, voir signature...) puissent éditer eux-même le fichier de langue, sans pour autant maîtriser SQL ou PHP...
Et je vois pas l'intérêt de stocker des données en base lorsqu'elles ne changent jamais...


---------------
Ma galerie photo créée avec Piwigo et hébergée sur Piwigo.com
Reply

Marsh Posté le 30-07-2002 à 23:10:28    

z0rglub a écrit a écrit :

Et je vois pas l'intérêt de stocker des données en base lorsqu'elles ne changent jamais...




 
 :jap:  
 
Voila l'argument que je cherchais  :D


---------------
Informaticien.be - Lancez des défis à vos amis
Reply

Marsh Posté le 31-07-2002 à 08:38:31    

Mo je fais
 
include ("pages/$Langue/mapage.php" );
 
et après des switch.
 
pour tout ce qui est requête SQL (recherche etc..), je nomme les champs nom_fr et nom_us et dans la requête je fais un  
 
SELECT  ... Nom_$Langue ..
 
histoire de pas charger inutilement les deux langues


---------------
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 31-07-2002 à 08:48:01    

Zion va etre content... Je pense etre convaincu...
Mais en ce qui concerne la maintenance du site, pour ceux qui utilisent la methode du include, avez vous fait une page php pour gerer les traduction? Ou alors simplement vous éditez vos fichiers à la main ?


---------------
Ma réflexion sur cette affaire vient de connaître une avancée déterminante.
Reply

Marsh Posté le 31-07-2002 à 08:53:06    

je place tout ce qui est commun au deux langues (requêtes, opérations math, param etc.. dans un répertoire à part)  
 
dès qu'il y a du texte, c'est dans le répertoire de la langue et les pages portent le même nom dans des rép séparés
 
pour la maintenance je trouve ça assez simple, quand tu veux ajouter une langue, tu ajoute une entrée dans un tableau, tu recopie le rep FR et tu traduis le texte rien de plus.


---------------
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 31-07-2002 à 08:57:32    

le mieux, je pense, c'est de découper chaque document en fichier xml, le xml étant structuré comme ça (je simplifie):

Code :
  1. <document>
  2.   <content lng="fr">Bonjour, comment ça va ?</content>
  3.   <content lng="uk">Hello, how are you ?</content>
  4.   <content lng="de">Gutten Tag, wie gets ?</content>
  5. </document>


 
du coup, c'est très souple et lisible... tu peux traduire ou ne pas traduire, mais quand tu traduis, tu peux t'appuyer sur ta DTD pour mettre cote à cote tes différents langages et traduire plus facilement l'ensemble de ton site.


Message édité par chocoboy le 31-07-2002 à 08:58:18
Reply

Marsh Posté le 31-07-2002 à 09:01:57    

après, tu fais un XSL en passant le paramètre langue au xsl : affiche.xsl?lng=fr, le xsl contenant une ligne du type :
 

Code :
  1. <xsl:apply-templates select="content">
  2.   <xsl:with-param name="lng" select="$lng">
  3. </xsl:apply-templates>


 
afin de transmettre le paramètre $lng au template s'occuppant de l'affichage du contenu...


Message édité par chocoboy le 31-07-2002 à 10:10:58
Reply

Marsh Posté le 31-07-2002 à 09:26:02    

:ouch: là je suis largué : xml je connais pas du tout :(


---------------
Ma réflexion sur cette affaire vient de connaître une avancée déterminante.
Reply

Marsh Posté le 31-07-2002 à 09:38:40    

là je te garantit que XML, pour ce qui est de ton problème, ça défonce tout le reste en terme de souplesse et de simplicité !
 
Par, exemple, si tu décides un jour de rajouter une nouvelle langue, y a plus qu'a la rajouter à ta DTD et tu auras :
 

Code :
  1. <content lng:nouvelleLangue>...</content>

Reply

Marsh Posté le 31-07-2002 à 09:51:10    

oui mais dtd c koi :??:


---------------
Ma réflexion sur cette affaire vient de connaître une avancée déterminante.
Reply

Marsh Posté le 31-07-2002 à 09:54:32    

Snipe Foo a écrit a écrit :

oui mais dtd c koi :??:  




 
dtd ou xsd, c'est le "modèle" sur lequel se crée ton xml... compares le à un schéma entité-association par exemple
 
pour en savoir plus :
 
http://forum.hardware.fr/forum2.ph [...] subcat=385
 
php possède des librairies permettant de traiter le XML...

Reply

Marsh Posté le 31-07-2002 à 10:05:26    

:jap: merci


---------------
Ma réflexion sur cette affaire vient de connaître une avancée déterminante.
Reply

Marsh Posté le 31-07-2002 à 15:12:26    

chocoboy a écrit a écrit :

là je te garantit que XML, pour ce qui est de ton problème, ça défonce tout le reste en terme de souplesse et de simplicité !




 
 :non:  
 
C'est pas plus souple que de faire un fichier avec un include de la langue, tu dois même rien changer en php pour supporter une nouvelle langue  :p  
 
Je suis aussi un gros mordu du XML, d'ailleurs je l'utilise pour bcp de mes traductions (même en php ... erhm), mais dans son cas, c'est peut être pas conseillé non plus hein, vive les performances et la non compatibilité avec un paquet de browsers... Ah ouai, j'oubliais, tu vas lui dire d'installer cocoon et qu'il va génerer de l'html... puis un BD XML...
 
Allez, soyons sérieux  :D


---------------
Informaticien.be - Lancez des défis à vos amis
Reply

Marsh Posté le 31-07-2002 à 15:20:08    

Zion a écrit a écrit :

 
 
 :non:  
 
C'est pas plus souple que de faire un fichier avec un include de la langue, tu dois même rien changer en php pour supporter une nouvelle langue  :p  
 
Je suis aussi un gros mordu du XML, d'ailleurs je l'utilise pour bcp de mes traductions (même en php ... erhm), mais dans son cas, c'est peut être pas conseillé non plus hein, vive les performances et la non compatibilité avec un paquet de browsers... Ah ouai, j'oubliais, tu vas lui dire d'installer cocoon et qu'il va génerer de l'html... puis un BD XML...
 
Allez, soyons sérieux  :D  




ben oui, comment t'as deviné ???  :D

Reply

Marsh Posté le 31-07-2002 à 15:23:13    

sinon, sérieusement, le coup des include, c'est vraiment pas top !

Reply

Marsh Posté le 31-07-2002 à 15:30:47    

chocoboy a écrit a écrit :

sinon, sérieusement, le coup des include, c'est vraiment pas top !




 
Tu rigoles ou quoi?
Un include("translations/$langue.php" );
C'est nickel.
 
Le monde n'est pas prèt pour le tout XML, trop lent encore  :p


---------------
Informaticien.be - Lancez des défis à vos amis
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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