Gérer plusieurs langues dans une application PHP

Transcription

Gérer plusieurs langues dans une application PHP
JDNet | Solutions | Emploi | Votre high-tech
Linternaute | Copainsdavant
Séminaires & Evénements | Etudes
Rechercher
Sociétés
Prestataires
Carnet
Formations
Progiciels
Encyclo
Fonds
VOTRE HIGH TECH
Guide d'achat
Comparateur
Téléchargement
Livres
Gratuit - Les
nouveautés de
JDNet Développeurs
email
Actualités
2004
2003
Toutes nos
newsletters
Gérer plusieurs langues dans une application PHP
flux RSS
(explication)
2002
2001
Page 1 | 2
Livres
Rubriques
Java/J2EE
PHP
XML
Client Web
Technos .NET
Flash
Algo/M éthodes
Outils
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.
Rechercher par mot clé
L'entreprise à l'affiche
Dossiers
Tous les dossiers
PHP, Flash, SVG
Perl / CGI - SSI
Langages Web
Services Web
Sécurité
Ressources
Interviews
Téléchargement
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:
Composants
Documentation
Contacts
identifiant
fr-fr
en -uk
'FIRST_NAME'
"prénom"
"first name"
'LAST_NAME'
"nom"
"last name"
'COUNTRY'
"pays"
"country"
Rédaction
Webmaster
© Benchmark Group
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)
Séminaires
<?php
$string_lang = array(
Optimisez vous vos
URL dynamiques pour
le référencement ?
j
k
l
m
n
j
k
l
m
n
j
k
l
m
n
je l'ai toujours fait et
je continuerai de le
faire
je le faisais mais
maintenant ce n'est
plus vraiment
nécessaire
non, ce n'est
vraiment pas le
plus important
j
k
l
m
n
oui, depuis peu
j
k
l
m
n
non, mon
hébergement ne
me le permet pas
Voter
Tous nos sondages
Les outils de
développement dans le
Guide des Solutions
e-business
L'encyclopédie JDNet
Toutes les
notions
pratiques,
techniques
et
économiques relatives
à l'e-business.
>> Accès à la rubrique
"D éveloppement"
Comparez les prix
Matériel,
PDA,
modems...
Les bonnes
affaires de
la high-tech avec
Kelkoo.
>> Comparateur
Forums
Auto & Internet
Banque
Externalisation
Immobilier
Marques
Etudes
Commerce
Services Mobiles
Internet Payant
RH
Lettres
Management IT
Strat. Internet
Boutique
Analyse de sites
Presse
Publicité
'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";
Tous droits réservés.
L'accès aux
informations
contenues dans
notre site implique
l'acceptation
inconditionnelle de
nos conditions
générales.
<?=$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, 21 janvier 2003 , JDNet]
Société | Contacts | Publicit é | Presse | Recrutement | Tous nos sites | Données personelles
Pour tout problème de consultations, écrivez au Webmaster.
© Benchmark Group, 4 rue diderot 92156 Suresnes Cedex
JDNet | Solutions | Emploi | Votre high-tech
Linternaute | Copainsdavant
Séminaires & Evénements | Etudes
Rechercher
Sociétés
Prestataires
Carnet
Formations
Progiciels
Encyclo
Fonds
VOTRE HIGH TECH
Guide d'achat
Comparateur
Téléchargement
Livres
Gratuit - Les
nouveautés de
JDNet Développeurs
email
Actualités
Toutes nos
newsletters
2004
2003
2002
flux RSS
(explication)
Gérer plusieurs langues dans une application PHP
2001
Livres
Page 1 | 2
Rubriques
Java/J2EE
PHP
XML
Client Web
Technos .NET
Flash
Algo/M éthodes
Outils
MySQL
Plutôt que de stocker vos traductions dans un fichier externe, il est possible de tout
mettre dans votre base de données (si tant est que vous en utilisiez une). L'interêt
principal de cette méthode est de pouvoir ajouter un champ contenant la dernière date
d'entrée, ce qui vous permet d'être toujours à même de retrouver les dernières
modifications dans la traduction en classant les champs par date et par langue. Un autre
interêt est de travailler directement avec le numéros d' id de vos chaînes, au besoin...
En revanche, la mise à jour est rendue plus compliquée, et l'accés direct à la base pour
les "simples traducteurs" n'en est que plus ardue.
Prenons par exemple une table créée avec le code SQL suivant:
Rechercher par mot clé
CREATE TABLE string_lang(id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, page
VARCHAR(10), lang CHAR(5) NOT NULL, string CHAR(254) NOT NULL, date
DATETIME() );
Une fois la connexion à la base effectuée, on pourrait accéder aux traductions de la
manière suivante:
Optimisez vous vos
URL dynamiques pour
le référencement ?
j
k
l
m
n
j
k
l
m
n
j
k
l
m
n
je l'ai toujours fait et
je continuerai de le
faire
je le faisais mais
maintenant ce n'est
plus vraiment
nécessaire
non, ce n'est
vraiment pas le
plus important
j
k
l
m
n
oui, depuis peu
j
k
l
m
n
non, mon
hébergement ne
me le permet pas
Voter
Tous nos sondages
L'entreprise à l'affiche
Dossiers
Tous les dossiers
PHP, Flash, SVG
Perl / CGI - SSI
Langages Web
<?
$sql = "SELECT id,string FROM string_lang WHERE page=$page AND
lang=$lang;";
$rsql = mysql_query($sql);
while ($row = mysql_fetch_object($rsql))
{
$id = $row->id;
$string = $row ->string;
$strings[$id] = $string;
}
Services Web
Sécurité
Ressources
Interviews
...et dans le code HTML:
<?=$strings['prenom'];?>
Le plus gros du travail consistera donc, comme pour toute internationalisation, à
remplacer les chaînes "brutes" du code par ces appels de tableaux...
Téléchargement
Composants
L'API gettext
Documentation
gettext est un projet GNU d'API permettant d'implémenter un support natif des langues
(Native Language Support) dans une application. Tous les fournisseurs ne la proposent
pas, donc il ne faut s'y fier que si l'on est certain de maîtriser cet aspect du serveur. Un
phpinfo() bien placé permettra de savoir si l'on peut se permettre cette API... Pour les
utilisateurs de EasyPHP et consorts WAMP, il suffit de se glisser dans le fichier php.ini
pour retirer le " ;" devant la ligne "extension=php_gettext.dll ".
Contacts
Rédaction
Webmaster
© Benchmark Group
Séminaires
L'extension gettext permet de traduire dynamiquement des chaînes dans le code PHP.
Par rapport aux deux autres méthodes est que, si la traduction n'existe pas, PHP écrira
la version originale à la place... Un autre point important à noter est que gettext est déjà
largement utilis é dans des projet libres, et qu'il existe donc une foule d'outils facilitant le
travail du traducteur et donc l'intégration finale. Ces outils sont cependant plus courant
sous systèmes Linux et autres, bien qu'il existe des équivalent Windows, comme
GNUGettext for Win32 ou poEdit.
Les outils de
développement dans le
Guide des Solutions
e-business
L'encyclopédie JDNet
Toutes les
notions
pratiques,
techniques
et
économiques relatives
à l'e-business.
>> Accès à la rubrique
"D éveloppement"
Comparez les prix
Matériel,
PDA,
modems...
Les bonnes
affaires de
la high-tech avec
Kelkoo.
>> Comparateur
Forums
Auto & Internet
Banque
Externalisation
Immobilier
Marques
Etudes
Commerce
Services Mobiles
Internet Payant
RH
Lettres
Management IT
Strat. Internet
Boutique
Analyse de sites
Presse
Publicité
gettext fait appel à une série de fichiers externes où une phrase définie est traduite
selon les langages. Pour simplifier (nous aurons l'occasion de revenir sur le sujet,
gettext et l'internationalisation étant une étude à part entière), le fichier contenant les
phrases traduites se présente sous la forme suivante:
(fichier lang_string.po )
(divers ent ête)
...
msgid "Mon tailleur est riche"
msgstr "My taylor is rich"
msgid "Tire -bouchtroumpf et schtroumpf -bouchon"
msgstr "(translation missing)"
ensuite, une fois compilé, la chaîne s'affiche à l'aide des fonctions idoines:
(fichier index.php)
Tous droits réservés.
L'accès aux
informations
contenues dans
notre site implique
l'acceptation
inconditionnelle de
nos conditions
générales.
// définition de la langue
$lang = 'en'; // à définir selon ce document , par exemple
putenv ("LANG=$lang");
setlocale(LC_ALL, $lang);
// emplacement des fichiers gettext sur le serveur
$domain = 'lang_string';
bindtextdomain($domain, "/www/htdocs/site.com/locale");
textdomain ($domain);
<?=gettext("Mon tailleur est riche");?>
Ce qui, pour peu que les deux id correspondent, affichera "My taylor is rich" en lieu et
place de l'original français.
Chaque langue ayant son propre repertoire dans la hierarchie gettext, inclure une
nouvelle langue ne met pas en danger les autres traductions, mais ne nécessite que la
création de ce nouveau repertoire avec un fichier .po vierge de toute traduction.
Nous aurons l'occasion de revenir sur le sujet dans un prochain article plus ciblé...
Page 1 | 2
[Xavier Borderie, 20 janvier 2003 , JDNet]
Société | Contacts | Publicit é | Presse | Recrutement | Tous nos sites | Données personelles
Pour tout problème de consultations, écrivez au Webmaster.
© Benchmark Group, 4 rue diderot 92156 Suresnes Cedex

Documents pareils