Variables dynamiques + site multilingue

Variables dynamiques + site multilingue - PHP - Programmation

Marsh Posté le 08-01-2005 à 22:46:11    

Voilà mon problème : je veux créer un site en plusieurs langues. Ainsi je crée mon fichier contenant les textes que j'utiliserai :  
Fichier : dico/principal.php

Code :
  1. <?
  2. $ENREGISTREMENT_FR = 'S\'enregistrer';
  3. $ENREGISTREMENT_EN = 'Register';
  4. ?>


 
Ensuite, j'ai le fichier suivant qui défini une fonction permettant de renvoyer un mot du dictionnaire :  
Fichier : dicofonction.php

Code :
  1. <?
  2. function dico($mot) {
  3. if(${$mot.'_'.$lang}) {
  4.  return htmlentities(${$mot.'_'.$lang});
  5. } // le mot existe
  6. if(${$mot.'_FR'}) {
  7.  return htmlentities(${$mot.'_FR'});
  8. } // le mot n'existe pas, donc le mot en français existe-t'il ?
  9. return "BIG_BAD_ERROR";
  10. // ni en français ni en aucune autre langue...
  11. }
  12. ?>


 
Puis dans ma page index.php, je mets simplement le code suivant :  
Fichier : index.php

Code :
  1. <?
  2. include "dico/principal.php";
  3. include "dicofonction.php";
  4. $lang = "FR"; // c'est un exemple pour tester le code...
  5. echo dico("ENREGISTREMENT" );
  6. ?>


 
Le problème, c'est que ça m'affiche "BIG_BAD_ERROR", alors que ce n'est pas censé faire ça. C'est un exemple que j'ai trouvé sur un site, donc je ne suis pas l'auteur du script lui-même. Cependant, j'ai compris le script et je saurais pas trouver d'où vient l'erreur...  
 
Merci d'avance à quiconque qui pourrait m'éclairer !
 
Note : j'utilise PHP/4.3.7


---------------
Matt
Reply

Marsh Posté le 08-01-2005 à 22:46:11   

Reply

Marsh Posté le 08-01-2005 à 23:15:04    

La fonction dico ne connaît ni les variables $ENREGISTREMENT_* ni la variable $lang si elles ne sont pas passées en paramètres à la fonction (ou déclarées global dans celle-ci).


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 08-01-2005 à 23:23:22    

mais plutot que de jouer sur les noms de variables, je partirais plutot sur des tableaux/hash tables pour implémenter les langues...

Code :
  1. $tableau_variables["fr"]["ENREGISTREMENT"] = htmlentites('S\'enregistrer');
  2. $tableau_variables["en"]["ENREGISTREMENT"] = htmlentites('Register');


Je pense que c'est plus performant surtout en précalculant les htmlentites, et comme ça tu règles les problèmes des global (tu n'as qu'à faire global $tableau_variables)...

Reply

Marsh Posté le 08-01-2005 à 23:23:58    

Personnellement je te conseillerait d'utiliser un tableau plutot que des variables variable.
 

Code :
  1. $Translate['fr'][0] = 'S\'enregistrer';
  2. $Translate['eng'][0] = 'Register';


Ainsi tu fais passer qu'un variable en paramètre dans ta fonction plutot que de mettre 36000 variable en global.
Dans le cas que je te présente il suffit d'utiliser les fonction de tableau(array) pour faire les recherches, en php il y en tous ce qu'il te faut.  
array_in(); sera ton amie. :jap:

Reply

Marsh Posté le 08-01-2005 à 23:25:17    

dreameddeath a écrit :

mais plutot que de jouer sur les noms de variables, je partirais plutot sur des tableaux/hash tables pour implémenter les langues...

Code :
  1. $tableau_variables["fr"]["ENREGISTREMENT"] = htmlentites('S\'enregistrer');
  2. $tableau_variables["en"]["ENREGISTREMENT"] = htmlentites('Register');


Je pense que c'est plus performant surtout en précalculant les htmlentites, et comme ça tu règles les problèmes des global (tu n'as qu'à faire global $tableau_variables)...


 
T'as triché tu m'as fais un croche pate  :fou: c'est pour cela que tu l'as posté avant moi. Tricheur  :kaola:  
 
 
 
:D

Reply

Marsh Posté le 08-01-2005 à 23:27:54    

bon cette fois j'ai gagné ! :p
au prochain post php on remet ça ! :D

Reply

Marsh Posté le 08-01-2005 à 23:38:20    

dreameddeath a écrit :

bon cette fois j'ai gagné ! :p
au prochain post php on remet ça ! :D


Attention moi je suis de la team  [:negueu]  
http://mapage.noos.fr/berceker_united/phpman.jpg


Message édité par Berceker United le 08-01-2005 à 23:38:34
Reply

Marsh Posté le 09-01-2005 à 16:50:47    

C'est pas juste, moi j'etais meme pas la pour la competition :(

Reply

Marsh Posté le 09-01-2005 à 16:51:49    

esox_ch a écrit :

C'est pas juste, moi j'etais meme pas la pour la competition :(


Faut pas dormir man  [:negueu]
il faut être dans le coup [:x-oni]


Message édité par Berceker United le 09-01-2005 à 16:52:01
Reply

Marsh Posté le 09-01-2005 à 16:53:05    

J'etais aller conduire avec ma mere !

Reply

Marsh Posté le 09-01-2005 à 16:53:05   

Reply

Marsh Posté le 09-01-2005 à 17:24:18    

Pour la recommandation d'un tableau, j'ai fini par ne plus m'en servir (c'est ce dont je me servais avant) et j'utilise des fichiers de langues genre :
 
$voc_blabla = "blabla";
$voc_zobi = "zobi";
etc...
 
Le tout dans une page appelée par exemple : langue_fr.php que j'inclue bêtement. Si je veux l'allemand, ben j'aurais une page langue_de.php...
 
Je trouve ça très rapide et surtout très pratique à maintenir...

Reply

Marsh Posté le 09-01-2005 à 17:32:05    

personnellement j'utilise une page : dico.inc.php qui est contiens un switch avec 1 case par langue... le ficher etant généré par une base de donnée et une page dans l'administration c'est assez confortable a maintenir et ca me permet de laisser l'acces aux traductions a des personnes n'aillant aucune notion d'informatique

Reply

Marsh Posté le 09-01-2005 à 17:34:40    

esox_ch a écrit :

personnellement j'utilise une page : dico.inc.php qui est contiens un switch avec 1 case par langue... le ficher etant généré par une base de donnée et une page dans l'administration c'est assez confortable a maintenir et ca me permet de laisser l'acces aux traductions a des personnes n'aillant aucune notion d'informatique


 
Quel intérêt par rapport à mon système par exemple ?  

Reply

Marsh Posté le 09-01-2005 à 17:37:36    

Aucun a 1ere vue, c'etais juste une possibilité de plus.

Reply

Marsh Posté le 09-01-2005 à 17:41:23    

esox_ch a écrit :

Aucun a 1ere vue, c'etais juste une possibilité de plus.


 
 :D  
 
Mon système est plus simple, mais il nécessite de lister les fichiers dans mon répertoire "langue" pour pouvoir changer celle-ci dans mon interface d'admin. Ainsi, dans ma BDD, c'est carrément langue_fr.php que je stocke (le nom). ;)  
 
A partir de là, ma solution est la meilleure, car qqu qui veut faire une autre langue, a juste a écrire un fichier langue_sa_langue.php qui sera automatiquement pris en compte.  :D  

Reply

Marsh Posté le 09-01-2005 à 17:43:19    

Et pour modifier une valeur X mal traduite? Tu as une page php qui parse ta page langue_X.php pour resortir toutes les données ?

Reply

Marsh Posté le 09-01-2005 à 17:44:54    

Hermes le Messager: le faite de crééer plusieurs variable je le sens pas trop :/ en terme de gestion de memoire et autre de ce genre qui fait que les perfs peuvent ce sentir arrivé a un certain nombre, certe pas de façon significative.
Je pense que le faire sur de texte brute est plus performant plutot qu'elle soit parsé.
en utilisant pars_ini_file par exemple.

Reply

Marsh Posté le 09-01-2005 à 17:45:36    

Merci beaucoup les gars (et les miss ?) !! Mon problème est résolu et ça marche à merveille !
:-)

Reply

Marsh Posté le 09-01-2005 à 17:46:40    

Comment ca berceker? Tu peux expliquer un peu plus? parceque je vois pas trop ou tu veux en venir ...
 
P.S: Je te l'ai jms dit mais elle cartonne ta signature :D

Reply

Marsh Posté le 09-01-2005 à 17:52:26    

Vous utilisez tous des variables, mais la pluspart du temps que je regarde des systemes similaires ils utilisent des defines.
 
Qu'en pensez-vous ? Variables ? Defines ? Grande difference ou la meme chose ?
 
Perso je prefere les defines, ca me permet de pas "confondre" avec des vars.

Reply

Marsh Posté le 09-01-2005 à 17:54:56    

esox_ch a écrit :

Comment ca berceker? Tu peux expliquer un peu plus? parceque je vois pas trop ou tu veux en venir ...
 
P.S: Je te l'ai jms dit mais elle cartonne ta signature :D


Plutt que de faire des variables qui prend de la place surtout pour des données statique il est préférable de le placer en dure sur un fichier de type texte. il est tout aussi gérable que si c'était une variable.
http://www.nexen.net/docs/php/anno [...] i-file.php
 
 
Merci pour la signature ;)


Message édité par Berceker United le 09-01-2005 à 17:55:02
Reply

Marsh Posté le 09-01-2005 à 18:11:50    

berceker united a écrit :

Plutt que de faire des variables qui prend de la place surtout pour des données statique il est préférable de le placer en dure sur un fichier de type texte. il est tout aussi gérable que si c'était une variable.
http://www.nexen.net/docs/php/anno [...] i-file.php
 
 
Merci pour la signature ;)


 
Oui pour un gros site, c'est en effet une bonne solution.
 
Pour un "petit" site, les variables marchent parfaitement et je n'ai constaté aucun occupation mémoire anormalement élevée sur mon proc (linux).

Reply

Marsh Posté le 09-01-2005 à 18:18:40    

Hermes le Messager a écrit :

Oui pour un gros site, c'est en effet une bonne solution.
 
Pour un "petit" site, les variables marchent parfaitement et je n'ai constaté aucun occupation mémoire anormalement élevée sur mon proc (linux).


Oui sur un petit site l'occupation mémoir est vraiment minime cela depend de plein de chose aussi. Par contre sur un gros site ou il y a beaucoup de visiteur là il faut que le systeme soit optimisé limite un db genre LDAP (je crois). Pire! a ne pas faire c'est de placer ces variables en session c'est une erreur. là par contre ça va bouffer.

Reply

Marsh Posté le 10-01-2005 à 16:34:39    

Salut
 
Pour les appli multilingues y a gettext aussi.

Reply

Marsh Posté le 10-01-2005 à 16:54:30    

exacte ! je l'avais complétement oublié  

Reply

Marsh Posté le 10-01-2005 à 17:00:22    

A mon avis c'est le plus rapide au niveau des performances (les fichiers de traductions sont compilés).
 
Ensuite il faut le support gettext dans PHP.

Reply

Marsh Posté le 10-01-2005 à 17:02:11    

berceker united a écrit :

Merci pour la signature ;)


ça serait pas du Clint Eastwood par hasard ??? ;)


---------------
- Xav - ...There are no crimes when there are no laws... -- Xav's World
Reply

Marsh Posté le 10-01-2005 à 17:04:38    

Xav_ a écrit :

ça serait pas du Clint Eastwood par hasard ??? ;)


Oui du film, le bon la brute et le tryant, il y a d'autre dans le meme genre que tuko repliquait

Reply

Marsh Posté le 12-01-2005 à 13:57:12    

Hermes le Messager a écrit :

Pour la recommandation d'un tableau, j'ai fini par ne plus m'en servir (c'est ce dont je me servais avant) et j'utilise des fichiers de langues genre :
 
$voc_blabla = "blabla";
$voc_zobi = "zobi";
etc...
 
Le tout dans une page appelée par exemple : langue_fr.php que j'inclue bêtement. Si je veux l'allemand, ben j'aurais une page langue_de.php...
 
Je trouve ça très rapide et surtout très pratique à maintenir...


 
Bonjour Hermès,
 
après quelques jours de recherche sur le net, je suis convaincu que la méthode des fichiers de langue que tu utilises est la meilleure : ils sont légers à charger et faciles à gérer (envoi par mail à un traducteur et chargement sur le site dès réception du fichier traduit).
 
Il y a une page qui explique cette méthode de manière générale, http://www.aidejavascript.com/article117.html , mais pourrais-tu publier tes fichiers php pour exemple.
 
Merci

Reply

Marsh Posté le 12-01-2005 à 14:49:13    

en voila deja un qui marche
 
[code]
<?php // config.inc.php
 
$default_lang = 'en';
$language_codes = array('en',  // English
                        'es',  // Spanish
                        'fr'); // French
 
function set_lang()
{
   if(isset($_GET['lang']) &&
      in_array($_GET['lang'], $GLOBALS['language_codes']))
   {
       $GLOBALS['lang'] = $_GET['lang'];
   }
   else
   {
       $GLOBALS['lang'] = $GLOBALS['default_lang'];
   }
}
 
set_lang();
require_once("lang.{$lang}.inc.php" ); // include proper resource file
?>
 
<?php // lang.en.inc.php
$hello_str = "Hello, world!";
$submit_str = "Submit";
$language_names = array("en" => "English",
                        "es" => "Spanish",
                        "fr" => "French" );
?>
 
<?php // lang.es.inc.php
$hello_str = "¡Hola, el mundo!";
$submit_str = "Sométase";
$language_names = array("en" => "Inglés",
                        "es" => "Español",
                        "fr" => "Francés" );
?>
 
<?php // lang.fr.inc.php
$hello_str = "Bonjour, le monde!";
$submit_str = "Soumettre";
$language_names = array("en" => "Anglais",
                        "es" => "Espagnol",
                        "fr" => "Français" );
?>
 
 
<?php // main.php
 
require_once('config.inc.php');
  // this require_once() call sets the appropriate language
  // and includes the proper resource file.
  // The main application never outputs anything to the user,
  // it only outputs string variables defined in the resource files.
 
echo $hello_str;
 
 
echo "<hr>\n"; // HTML can be output by the application,
               // since it's not language-dependent.
 
// we'll include a short form to let the user change languages.
echo "<form action=\"{$_SERVER['PHP_SELF']}\" method=\"get\">\n";
echo "  <select name=\"lang\">\n";
foreach($language_codes as $lang_key)
{
   // our form will preselect the current language
   $selected = ($lang == $lang_key)? " selected=\"\"" : "";
   echo "    <option value=\"{$lang_key}\"{$selected}>"
      . $language_names[$lang_key]
      . "</option>\n";
}
echo "  </select>\n";
echo "  <input type=\"submit\" value=\"{$submit_str}\" />\n";
echo "</form>\n";
 
?>

Reply

Marsh Posté le 12-01-2005 à 14:51:22    

helain a écrit :

Bonjour Hermès,
 
après quelques jours de recherche sur le net, je suis convaincu que la méthode des fichiers de langue que tu utilises est la meilleure : ils sont légers à charger et faciles à gérer (envoi par mail à un traducteur et chargement sur le site dès réception du fichier traduit).
 
Il y a une page qui explique cette méthode de manière générale, http://www.aidejavascript.com/article117.html , mais pourrais-tu publier tes fichiers php pour exemple.
 
Merci


 
Ya rien à publier de spécial hein...  
 
Dans ta page index.php, tu fais une recherche de la langue utilisée que tu stockes soit dans un fichier soit dans ta BDD :
 
Exemple avec une BDD :

Code :
  1. $resultat = mysql_query('SELECT password,langue,etc... FROM preferences') or die('Erreur SQL !');
  2. $langue = mysql_result($resultat,0,'langue');
  3. // Inclusion de la langue
  4. include("../langues/".$langue);


 
$langue contient le NOM de ton fichier de langue, par exemple : francais.php ou encore : langue-fr.php
 
Ensuite ton fichier de langue : langue-fr.php ressemble bêtement à ça :
 

Code :
  1. <?php
  2. // ********************************
  3. // * Fichier de langue : Français *
  4. // ********************************
  5. $dialogue_truc = "Truc !";
  6. $dialogue_machin = "Machin !";
  7. etc...
  8. ?>


 
Ensuite, quand tu as besoin d'un mot traduisible dans tes pages, (sachant qu'un site bien conçu est un site comportant UNE seule page (hormis les pages de traitements des infos), tu fais :
 
... <?php echo $dialogue_truc; ?>  ... par exemple...

Reply

Marsh Posté le 12-01-2005 à 22:04:23    

Ensuite, quand tu as besoin d'un mot traduisible dans tes pages, (sachant qu'un site bien conçu est un site comportant UNE seule page (hormis les pages de traitements des infos), tu fais :
 
 
Salut Hermès,
 
En effet j'ai compris justement hier qu'un site bien conçu ne comporte qu'une seule page : il faut rajouter des paramètres à index.php et ensuite faire du url rewriting mots-clés pour repasser en html et optimiser le référencement.  
 
A suivre.  

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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