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