htmlentities et code html, pb avec <br>

htmlentities et code html, pb avec <br> - PHP - Programmation

Marsh Posté le 23-03-2006 à 11:10:13    

Salut à tous,
Je gère plusieurs langues sur mes site.
Les expressions sont dans des fichiers .txt
Le pb c'est qu'avec certains serveur je doit mettre htmlentities car sinon les "é" deviennent "?".
Ceci fait, un autre pb apparaît: les "<br>" s'affichent "<br" soit en html: "&lt;br&gt;"
 
Un idée?
Merci

Reply

Marsh Posté le 23-03-2006 à 11:10:13   

Reply

Marsh Posté le 23-03-2006 à 11:24:16    

vérifi l'encodage de ton fichier (genre UTF8) sans passer par htmlentities sinon remplace tout les accents par du ascii html toi meme dans ton txt.


Message édité par chaced le 23-03-2006 à 11:24:32

---------------
CPU-Z | Timespy | Mes bd
Reply

Marsh Posté le 23-03-2006 à 11:40:14    

Je vérifie comment ?, avec XP, je créé un simple fichier .txt ou chaque expression est sur un ligne différente.

Reply

Marsh Posté le 23-03-2006 à 11:59:03    

ça depend le traitement de texte, mais on doit pouvoir spécifier le format de sortie, sinon remplace tout tes accents par du ascii genre é devient &eacute;


---------------
CPU-Z | Timespy | Mes bd
Reply

Marsh Posté le 23-03-2006 à 12:16:45    

polo7 a écrit :

Les expressions sont dans des fichiers .txt
Le pb c'est qu'avec certains serveur je doit mettre htmlentities car sinon les "é" deviennent "?".
Ceci fait, un autre pb apparaît: les "<br>" s'affichent "<br" soit en html: "&lt;br&gt;"


 
Je ne suis pas sûr de comprendre : tes fichiers texte contiennent du html ?
 
Si c'est le cas, c'est pas comme ça qu'il faut procéder :
* ou tu enregistres tes textes en format texte donc avec les accents encodés (en iso ou en utf à toi de voir) et des CR+LF pour les retours à la ligne
* ou tu enregistres tes textes en format html donc avec des <br> et des htmlentities &eacute; etc...
 
Sinon c'est pas cohérent/consistant.

Reply

Marsh Posté le 23-03-2006 à 12:31:56    

d'abord un htmlentities, et apres un nl2br()...
Le pluys imple reste d'utiliser un XML :o

Reply

Marsh Posté le 23-03-2006 à 12:45:22    

J'ai fait des fichiers .txt ou j'écris mes enregstrements à la suite, un par ligne.
J'écris: "Bonjour je m'appelle<br>Jacques"
Et j'utilise ensuite htmlentities pour qu'il n'y ai pas de pb avec les accents. J'ai bricolé qqchose en faisant des str_replace sortir avec <br>.

Reply

Marsh Posté le 23-03-2006 à 12:49:17    

polo7 a écrit :

J'ai fait des fichiers .txt ou j'écris mes enregstrements à la suite, un par ligne.
J'écris: "Bonjour je m'appelle<br>Jacques"
Et j'utilise ensuite htmlentities pour qu'il n'y ai pas de pb avec les accents. J'ai bricolé qqchose en faisant des str_replace sortir avec <br>.


 
Donc soit tu enregistre ton fichier au bon format, en fait le meme qu'utilise ton serveur, donc soit du UT8 soit du ISO
 
Soit tu remplace betement les accents dans ton txt par du ascii genre ton  
 
"fenètre<br>bonjour" devient "fen&eagrave;tre<br>bonjour"


---------------
CPU-Z | Timespy | Mes bd
Reply

Marsh Posté le 23-03-2006 à 13:30:08    

Alors comment peut on enregister un .txt en UT8 qui semble assez universel?

Reply

Marsh Posté le 23-03-2006 à 13:31:40    

tu peut essayer:
"Bonjour je m'appelle\nJacques"
 
str_replace("\\n","<br>",htmlentities($ligne));
 

Reply

Marsh Posté le 23-03-2006 à 13:31:40   

Reply

Marsh Posté le 23-03-2006 à 13:34:36    

nargy a écrit :

tu peut essayer:
"Bonjour je m'appelle\nJacques"
 
str_replace("\\n","<br>",htmlentities($ligne));


 
Merci les scripts poussifs  :whistle:


---------------
CPU-Z | Timespy | Mes bd
Reply

Marsh Posté le 23-03-2006 à 13:48:12    

J'ai déjà fait provisoirement: $l_valeur = str_replace("&lt;br&gt;","<br>",$l_valeur);
Mais il faut une solution qui est acceptée par le plupart des serveurs.

Reply

Marsh Posté le 23-03-2006 à 13:51:05    

si les expressions sont dans un fichier TXT, d'abord tu les met toutes a la ligne les une des autres... ensuite , tu utilise file() qui te retourne un tableau don chaque élément est une ligne de ton fichier texte, et pis tu appliques un htmlentities()
 
Ca ne va pas ca ?

Reply

Marsh Posté le 23-03-2006 à 13:54:27    

> Merci les scripts poussifs  :whistle:
apparemment la bidouille c est ce qu il y de plus apprécié :lol:

Reply

Marsh Posté le 23-03-2006 à 13:57:03    

des bidouilles un peu plus efficaces:
 
- utiliser serialize()/unserialize() sur le fichier texte
- include(messages.inc);

Reply

Marsh Posté le 23-03-2006 à 14:23:28    

polo7 a écrit :

J'ai fait des fichiers .txt ou j'écris mes enregstrements à la suite, un par ligne.
J'écris: "Bonjour je m'appelle<br>Jacques"
Et j'utilise ensuite htmlentities pour qu'il n'y ai pas de pb avec les accents.


Dans ce cas, utilise utf8_encode() ou iconv().
 
 
Il reste que ton format de fichier txt est boiteux : c'est ni du texte ni du html [:spamafote]

Reply

Marsh Posté le 23-03-2006 à 14:27:00    

smaragdus a écrit :

Dans ce cas, utilise utf8_encode() ou iconv().
Il reste que ton format de fichier txt est boiteux : c'est ni du texte ni du html [:spamafote]


XML !!!  :fou:  :fou:

Reply

Marsh Posté le 23-03-2006 à 14:30:56    


 
arrête de nous casser les couilles avec ton xml  :sarcastic:  

Reply

Marsh Posté le 23-03-2006 à 14:34:03    

smaragdus a écrit :

arrête de nous casser les couilles avec ton xml  :sarcastic:


Quoi ! C'est le plus adapté ! Que proposes tu de mieux ?? Vas-y parle !

Reply

Marsh Posté le 23-03-2006 à 14:42:25    

the_bigboo a écrit :

Quoi ! C'est le plus adapté !


Clairement.
Mais c'est pas la question de polo7.

Reply

Marsh Posté le 23-03-2006 à 14:52:57    

et bien je pense que si , apporte une solution au probleme qu'il expose s'apparenterait plus a du bricolage, utiliser des technologies comme le XML, rends l'application finale claire et portable...
 
En plus c'est tres ludique car ca lui apprendrai a manier les flux RSS éventuellement... Cela dit j'avais déjà proposé quelque chose aussi, je ne faisait qu'une suggestion...

Reply

Marsh Posté le 23-03-2006 à 15:17:27    

Petite suggestion pour faire les choses proprement :
 
- Utiliser UTF-8 comme encodage (charset) pour les fichiers de definition des traductions
- lors de l'affichage d'une page HTML, bien indiquer le charset HTML
en utilisant le header qui va bien : header("Content-Type:  text/html; charset=UTF-8);
 
Pour ce qui est du format des fichiers de traduction, un fichier texte peut faire  
l'affaire mais c'est lourd a manipuler et pas tres elegant...
 
Je te conseillerais une methode analogue a celle utilisee dans SugarCRM :
 
- pour chaque langue tu as un fichier de traduction : lang_fr.php, lang_us.php, etc..
- chaque fichier contient un tableau principal et un sous-tableau associatif pour chaque page de ton
site qui doit contenir des traductions.
Ce tableau associatif contient des couples clef->traduction
 
ex :

Code :
  1. <?php
  2. $lang = array (
  3.   'login' =>
  4.   array (
  5.     'sign_in' => 'Connection compte',
  6.     'username' => 'Nom utilisateur',
  7.     'password' => 'Mot de passe',
  8.     'language' => 'Langue',
  9.     'select_lang' => 'Selectionez votre langue',
  10.     'submit' => 'Se connecter',
  11.     'lost_password' => 'Mot de passe perdu?'
  12.   )
  13. )
  14. ?>


 
 lors de l'affichage d'une page, tu inclus le bon fichier de langue et tu recuperes  
 le sous tableau qui correspond a ta page. Tu accedes ensuite a tes traduction via les clefs
 
 ex :  
 

Code :
  1. include_once $file_name;
  2. $language_array = $lang[$page_name];
  3. print $language_array['username'];


 
 voila, voila, bon courage.


Message édité par Woutcha le 23-03-2006 à 15:19:43
Reply

Marsh Posté le 23-03-2006 à 15:27:10    

> utiliser des technologies comme le XML, rends l'application finale claire et portable...
Ça revient à htmlentitizer ou à unicoder ses messages
 
Une solution efficace consiterai à:
- utiliser htmlentities pour éviter les calculs et se borner à un simple transfert disque->réseau->navigateur
- ne charger que les messages necessaires à l affichage de la page, donc gérer les messages à part dans le backoffice pour générer les fichiers contenant les messages qu il faut et pas plus, dans l ordre d affichage pour pouvoir lire le fichier des messages à la volée
 
convertisseur.php:

Code :
  1. $out=fopen("messages.htm","a" );
  2. $messages=file("messages.txt" );
  3. foreach($messages as $m)
  4.   fwrite($out, str_replace("&lt;br&gt;","<br>",htmlentities($m)))
  5. ;
  6. fclose($out);


 
libmessages.inc:

Code :
  1. function libmessages_init($nomfichiermessage, $taille_max_messages=1024)
  2. {
  3.   global $fichier_messages, $taille_max_message;
  4.   $fichier_messages=fopen($nomfichiermessage,"r" );
  5.   $taille_max_message=$taille_max_messages;
  6. }
  7. function libmessages_close()
  8. {
  9.   global $fichier_messages;
  10.   fclose($fichier_messages);
  11. }
  12. // afficher le prochain message
  13. function libmessages_print()
  14. {
  15.   global $fichier_messages, $taille_max_message;
  16.   echo fgets($fichier_messages, $taille_max_message);
  17. }
  18. // retourner le prochain message pour multiple utilisations
  19. function libmessages_get()
  20. {
  21.   global $fichier_messages, $taille_max_message;
  22.   return fgets($fichier_messages, $taille_max_message);
  23. }
  24. // ignorer le prochain message
  25. function libmessages_skip()
  26. {
  27.   global $fichier_messages, $taille_max_message;
  28.   fgets($fichier_messages, $taille_max_message);
  29. }

Reply

Marsh Posté le 23-03-2006 à 15:31:46    

> - pour chaque langue tu as un fichier de traduction : lang_fr.php, lang_us.php, etc..  
 
Ça c est la solution pratique, je l ai déjà utilisée, ça marche très bien et c est facile d ajouter une nouvelle traduction

Reply

Marsh Posté le 23-03-2006 à 15:36:42    

ou en objet tu peux avoir pour chaque langue un objet ; tous les objets de langue ont la même interface. Tu instancie le bon objet en fonction de la langue souhaitée, et ensuite, rien ne change, tous les appels de méthodes sont identiques.
(ça revient a peu près au même que la solution précédente)

Reply

Marsh Posté le 23-03-2006 à 15:38:56    

Plutôt que d'utiliser un tableau associatif, c'est pas mieux d'utiliser des constantes ? C'est bien plus léger.

Reply

Marsh Posté le 23-03-2006 à 15:40:41    

autant utiliser des méthodes statiques, un instanciation serait inutile !
Meme une simple fonction suffirait ;) :
 

Code :
  1. function GetWord_FR($Word)
  2. {
  3. $words = array('chien'=>'chien','chat'=>'chat') ;
  4. return $words[$Word] ;
  5. }


 
Et tu adaptes a la langue ;)

Reply

Marsh Posté le 23-03-2006 à 15:51:52    

On s'est mal compris the_bigboo, je ne parle pas de faire une classe qui ne fait rien d'autre que de balancer un tableau.
 
Là tu fais :

Code :
  1. interface Langue
  2. {
  3.     public function bonjour();
  4. }
  5. class Francais implements Langue
  6. {
  7.     public function bonjour()
  8.     {
  9.         echo 'bonjour';
  10.     }
  11. }
  12. class Anglais implements Langue
  13. {
  14.     public function bonjour()
  15.     {
  16.         echo 'Hello';
  17.     }
  18. }


et ensuite, là où tu en as besoin :

Code :
  1. //on instancie la classe souhaité :
  2. if ($_GET['langue'] == 'en') $langue = new Anglais;
  3. else $langue = new Francais;
  4. //on affiche le message
  5. $langue->bonjour();


 
M'enfin, ça change pas grand chose par rapport au principe d'inclure un fichier avec des variables en fonction de la langue demandée.


Message édité par Djebel1 le 23-03-2006 à 15:55:30
Reply

Marsh Posté le 23-03-2006 à 16:05:09    

smaragdus a écrit :

Plutôt que d'utiliser un tableau associatif, c'est pas mieux d'utiliser des constantes ? C'est bien plus léger.


 
Plus leger je ne sais pas mais en tout cas une structure de type tableau est beaucoup plus souple a utiliser:
 
- tu peux par exemple mettre en place un system qui, si une traduction a ete oubliee dans un fichier
de langue, va aller chercher une traduction par defaut (ce qui evite d'avoir un label vide ou une erreur)
- ou encore mieux, ecrire en quelques dizaine de lignes un petit script qui va prendre ton fichier de langue de  
reference et verifier que tous les autres fichiers de langue son complets
- etc...
 
La structure de tableau en php est tres souple et presente beaucoup de fonctionnalites.
Avec des constantes... c'est moins facile.

Message cité 1 fois
Message édité par Woutcha le 23-03-2006 à 16:06:41
Reply

Marsh Posté le 23-03-2006 à 16:12:41    

ou des classes avec la meme interface, pour etre sur de ne rien oublié (oui je l'aime cette méthode par classe  :o )

Reply

Marsh Posté le 23-03-2006 à 16:18:23    

Woutcha a écrit :

La structure de tableau en php est tres souple et presente beaucoup de fonctionnalites.
Avec des constantes... c'est moins facile.


 
en effet :jap:

Reply

Marsh Posté le 23-03-2006 à 16:57:42    

smaragdus a écrit :

arrête de nous casser les couilles avec ton xml  :sarcastic:


 
+1 ça fait 3 jours que je fais une moulinette tout en xml, c'est vraiement galere, en bonus, les perfs sont a chier :(
 
a l'arrache, pour un fichier langue, bonne vieille methode, un fichier lang.fr.php qui contient :
LANG['SALUT']='Salut ça boom ?';...
 
et hop un include :D


---------------
CPU-Z | Timespy | Mes bd
Reply

Marsh Posté le 23-03-2006 à 17:01:07    

chaced a écrit :

+1 ça fait 3 jours que je fais une moulinette tout en xml, c'est vraiement galere, en bonus, les perfs sont a chier :(
 
a l'arrache, pour un fichier langue, bonne vieille methode, un fichier lang.fr.php qui contient :
LANG['SALUT']='Salut ça boom ?';...
 
et hop un include :D


je serais curieux de savoir comment tu as architecturé ton truc...

Reply

Marsh Posté le 23-03-2006 à 17:03:21    

Je n'architecture pas une langue, je fais une moulilnette d'import export en XML :D Et pour la langue, c'est anglais point barre :D
 
mais bon le coup du fichier langue qui s'appelle suivant une parametre, c'est ultra connue, meme si c'est loin de valoir un i18n


---------------
CPU-Z | Timespy | Mes bd
Reply

Marsh Posté le 23-03-2006 à 18:04:02    

chaced a écrit :


mais bon le coup du fichier langue qui s'appelle suivant une parametre, c'est ultra connue, meme si c'est loin de valoir un i18n


 
Heu, c'est bien d'utiliser des notions (i18n) mais encore faut-il en connaitre la signification exacte...
i18n est l'abreviation pour internationalization. Ce model permet pour une application le support de 2 langues en meme temps :
anglais + une autre.
 
Donc le "coup du fichier langue qui s'appelle suivant une parametre" peut parfaitement etre une partie de l'implementation
du model i18n pour une application.
 
 

Reply

Marsh Posté le 23-03-2006 à 18:11:42    

quand je parles du i18n je parles du mod gettext si tu preferes ;)


---------------
CPU-Z | Timespy | Mes bd
Reply

Marsh Posté le 23-03-2006 à 18:30:54    

chaced a écrit :

quand je parles du i18n je parles du mod gettext si tu preferes ;)


 
Ok, je comprend mieux :jap:
C'est vrai que gettext peut tres bien etre aussi applique a du dev web. Peut etre un poil plus complique
au premiere abord, mais en effet c'est un solution complete et coherente.
 

Reply

Marsh Posté le 23-03-2006 à 18:32:22    

Tu as une superbe représentation de gettext web avec avec le celebre Horde/Imp


---------------
CPU-Z | Timespy | Mes bd
Reply

Marsh Posté le 25-04-2006 à 00:19:56    

Merci bien pour vos infos, je vois qu'il a pas mal de possibilités.
Je préfère refaire mes fichiers de langues et avoir un système qui fonctionne bien sur plusieurs sites plutot que de bidouiller.
Il faudrait que je puisse ajouter dans les langues de l'html comme "Bonjour,<br>Nom:...".
La proposition de nargy semble très utilisée par pas mal de scripts.
Je souhaite écrire sans devoir écrire en html avec les &a... et que les " et les ' soient aussi accepté.
Un script simple et facilement utilisable?

Reply

Marsh Posté le 25-04-2006 à 00:37:20    

Avec un BDD MySQL, un champ une langue et un champ pour le nom de variable ?

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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