RECHERCHE

Plan du site

BOURSE

 

RUBRIQUES

 
 TUTORIELS 
Gérer plusieurs langues dans une application PHP

Page 1 | 2

Trois méthodes permettant d'internationaliser ses programmes, et de permettre l'intégration facile de nouvelles traductions.
 (21 janvier 2003)
 

L'internationalisation est un processus consistant à définir une application de telle sorte qu'elle puisse être adaptée à divers langages et régions sans devoir y apporter des changements profonds. Le terme "internationalisation" est de plus en plus abrégé en "i18n", du fait que l'on trouve 18 lettres entre la première et la dernière lettre. A différencier de la "localisation" (ou l10n), qui consiste à ajouter de nouveaux langages à un programme déjà passé par le stage i18n...
Un script PHP destiné à être diffusé (surtout librement) se doit de passer par l'étape de l'internationalisation le plus tôt possible dans son cycle de création. Une fois le programme terminé, il est souvent trop tard ou trop compliqué de revenir en arrière pour faire en sorte que le programme puisse s'afficher dans plusieurs langues plutôt que celle de son concepteur. Néanmoins, avec un minimum de méthode et un code propre et bien organisé, elle ne saurait poser trop de problèmes.

En règle général, pour une internationalisation effective, il est largement préférable de mettre l'ensemble des traductions dans un fichier externe qui sera ensuite appellé (avec include() ou consorts) par les fichiers en ayant besoin.
Mettre les mots/phrases directement dans le code n'est pas une bonne solution, car cela oblige les traducteurs à venir chercher dans ces fichiers les éléments à traduire, et met de fait en péril votre programme pour peu que le traducteur ne sache pas vraiment où il est...
Il existe plusieurs manières d'aborder le problème, chacun ayant ses petits avantages. Nous en verrons trois dans cet article, allant du plus simple au plus compliqué. Nous ne parlerons cependant ici que de l'internationalisation de l'interface graphique, il ne sera pas fait mention de la gestion de données multi-lingues et autres variations dans ce vaste domaine.

Les tableaux associatifs
Le fichier externe contiendra ici un tableau associatif, c'est à dire un tableau contenant d'autres tableaux. Le premier tableau peut contenir les descriptions des messages à afficher (sous forme d'une constante) et chaque constante fait office de "clé" vers un second tableau identifié par un code langue/région, donnant le message lui-même correspondant à la langue donnée. On peut aussi inverser le classement, selon son organisation. Cela donne ceci:

identifiant
fr-fr
en-uk
'FIRST_NAME'
"prénom"
"first name"
'LAST_NAME'
"nom"
"last name"
'COUNTRY'
"pays"
"country"

Il est préférable d'avoir des identifiants en lettre capitales (pour indiquer que ce sont des constantes) et en anglais (on ne sait jamais qui décidera de traduire plus en avant le programme, et l'anglais étant la langue la plus utilisée dans le développement...).

En PHP, notre tableau prendre donc la forme suivante:
(fichier global_lang.inc)
<?php
$string_lang = array(
  'FIRST_NAME' => array(
    'fr-fr' => "prénom",
    'en-uk' => "first name"),
  'LAST_NAME' => array(
    'fr-fr' => "nom",
    'en-uk' => "last name"),
  'COUNTRY' => array(
    'fr-fr' => "pays",
    'en-uk' => "country")
  );
?>

Il ne vous reste plus, après avoir relié votre fichier à global_lang.inc, qu'à faire appel directement à la chaîne nécessaire. Pour cela, vous pouvez définir une variable $lang qui permettra à votre utilisateur de configurer la langage qu'il souhaite utiliser, et insérer les chaînes traduites directement dans le HTML grâce à la version courte de la structure de langage echo:

$lang = "fr-fr";

<?=$string_lang['FIRST_NAME'][$lang];?>

N.B.: ne pas oublier de déclarer $lang comme globale si les textes sont affichés par le biais d'une fonction...
Il n'est guère plus difficile d'afficher à la volée l'image qui correspond à la langue en cours, il suffit de remplir un nouveau tableau associatif dans le fichier externe. Par exemple:

...
$img_lang = array(
  'MENU_HOMEPAGE' => array(
    'fr-fr' => "fr-fr/menu/home",
    'en-uk' => "en-uk/menu/home"),
  );
...

puis dans le code HTML...

<img src="/img/<?=$img_lang['MENU_HOMEPAGE']['fr-fr'];?>.gif">

A vous d'agencer cette pratique à votre manière...


Page 1 | 2

 
[ Xavier Borderie,JDNet
 
Accueil | Haut de page
 
 

 

 
 
[an error occurred while processing this directive]