dimanche 13 février 2011

Site multilingue en PHP





Site multilingue en PHP

parfois il y a des webmestres qui aiment avoir un site web multilingue pour des raisons stratégiques,Voici une méthode que j'ai utilisé pour faire un site multilingue. Sans prétention, ce n'est sûrement pas la meilleure méthode à adopter si on veut un traducteur qui ne connait rien à la progroammation... J'ai appliqué cette solution en cette partie de formation web site et elle peut être tout à fait utilisée en site personnelle.
L'important est de savoir la langue du surfeur. Du genre :

* Sur ta page d'accueil, un drapeau pour chaque pays qui envoient sur page.php?langue=XXX ;
* Un cookie déposé contenant la langue, on récupère ça par $lang=$HTTP_COOKIES_VARS["cookielangue"];
* L'utilisateur se loggue et la langue est stockée dans ta base de données...

Le code de la langue sera par exemple FRA pour français, ENU pour anglais, ESP pour espagnol.
dico.php 
C'est le fichier qui contient le vocabulaire. Il se présente sous la forme suivante :
<?
$MOT_FRA='Le mot en français';
$MOT_ENU='Le mot en anglais';

$BIENVENUE_FRA='Bienvenue';
$BIENVENUE_ENU='Welcome';

$NON_TROUVE_FRA='Non trouvé(e)';
$NON_TROUVE_ENU='Not found';

$UTILISATEUR_FRA='Utilisateur : ';
$UTILISATEUR_ENU='User: ';
?>
Son fonctionnement est très simple : on met $ suivi du terme à définir (BIENVENUE par exemple), suivi d'un underscore '_', suivie du code de la langue. Ensuite, on met la traduction.
Il te sera très facile de rajouter une autre langue en écrivant $BIENVENUE_ESP='Bienvenida';
Fais attention aux apostrophes ! Il faut mettre des backslashes '\' devant, ou alors écrire la chaîne entourée de doubles quotes '"'.... les règles habituelles des langages C et dérivés...
Question d'esthétique pure, en français, on met un espace entre les ponctuations et signes doubles (deux-points, point-virgule, guillements « et », point d'interrogation et d'exclamation), mais pas pour les double quotes. On ne met pas d'espaces entre les mots et les symboles simples (point, virgule, parenthèses...).
En anglais, on ne met pas d'espaces entre les mots et les signes doubles. C'est pour ça que j'ai mis "Utilisateur : " et "User: ".
Je ne connais pas les règles espagnoles ou allemandes...

Il te faut 2 fichiers pour réaliser un petit lexique qui assure la traduction de ton site...
dicofonction.php
Le fichier dicofonction.php doit être inclus au début de chaque page du site.
<?
// RECUPERATION DE LA LANGUE// cela dépend du fonctionnement du site// - requête 

SQL dans la base de données// - cookie : $l = $HTTP_COOKIES_VARS["cookielangue"];// 
- paramètre : $l = $HTTP_GET_VARS["langue"];// Bien faire gaffe aux majuscules, FRA, ENU... 
et pas fra, enudefine('LANG',$l);

function dico($mot)
{
  // Charge le dictionnaire  require("includes/dico.php");

  // Si la variable a été définie, la retourner...  if (${$mot."_".LANG})
  return htmlentities(${$mot."_".LANG});

// Si on ajoute la langue ESP mais qu'un mot n'est pas traduit,// on met la 

langue par défaut, ici "ENU"...  if (${$mot."_ENU"})
  return htmlentities(${$mot."_ENU"});

  return "BIG_BAD_ERROR";
// si ça arrive, ça veut dire que le mot n'a pas bien été écrit// soit dans le 

script qui appelle, soit dans le dico.php :(}
?>
Ainsi, au lieu de coder "en dur" dans tes pages :
if lang=='FRA' echo 'le mot en français';
if lang=='ENU' echo 'le mot en anglais';
il est plus simple d'appeler echo dico("MOT"); et la mise à jour de la traduction est fastoche, non ?
Un exemple concret
Avec les fichiers ci-dessus... :
<?
include("dicofonction.php");
// Message de bienvenueecho dico("BIENVENUE")." !";
// Si c'est en français, ça affiche "Bienvenue !"// Si c'est en anglais, ça affiche "Welcome !" 

// Si c'est en créole, ça affiche "Welcome !" parce que la langue par défaut// est l'anglais 
et le créole n'a pas été traduit.
// Message erreur en cours de développement (à corriger!!)echo dico("BIENENUE")." !";  

// J'ai volontairement enlevé le V, faute de frappe...// Quelque soit la langue, 
ça affiche "BIG_BAD_ERROR !"?>
Compris ? C'est simple non ?



Aucun commentaire:

Enregistrer un commentaire