Envoyé par unreal
Quand vous développez un site Web dynamique, il convient qu'il puisse s'afficher dans plusieurs langues, sans modification de code. Le but étant clairement de pouvoir livrer ensuite des "packs de langues" contenant entièrement les changements d'une langue à une autre. Cela peut paraître compliqué, mais ce n'est pas vraiment le cas, à condition toutefois de prévoir la localisation dès le début du projet.
La localisation d'un projet PHP s'organise à deux niveaux :
1.0 Localisation du texte
Remarque importante : quelle que soit la méthode de localisation choisie, aucun texte non-localisé ne doit figurer en dur dans le code PHP. L'idée est donc de stocker le texte "statique" dans des fichiers à part afin de l'insérer dans la page au moment de l'affichage.
Pour cela, il existe plusieurs méthodes, dont le deux suivantes :
1.1 Gettext
Gettext est un logiciel GNU utilisé sous Unix pour afficher du texte localisé. Gettext a plusieurs avantages et inconvénients, mais on retient surtout qu'il est rapide, standardisé et qu'il supporte les pluriels. Côté inconvénients, il est nécessaire que gettext soit installé sur le serveur, que PHP ait été compilé avec support Gettext, et que les locales à utiliser (en_US, fr_FR...) soient aussi présents sur le serveur. Donc le bon fonctionnement de Gettext est très dépendant de la configuration du serveur, ce qui n'est pas vraiment idéal. De plus, le support Gettext sous Windows n'est pas vraiment très au point, et pour finir, il faut utiliser un logiciel fourni avec Gettext pour compiler les fichiers de localisation.
Si vous avez besoin d'utiliser Gettext, voici comment faire.
1.1.1 Les fichiers Gettext
Les traductions sont contenues dans des fichiers .po (je vous invite à appeler vos fichiers messages.po). Par exemple :
messages.po
msgid contient la phrase à traduire et msgstr la traduction. On peut alors compiler les fichiers messages.mo grâce à la commande msgfmt :
L'arborescence de vos fichiers doit être semblable à ceci :
Passons maintenant à la partie PHP.
1.1.2 Utilisation dans PHP
Je vous invite à créer une fonction pour simplifier l'utilisation de Gettext :
inc/inc_functions.php
Puis dans index.php :
index.php
Enfin, pour traduire un texte, il suffit d'appeler la fonction gettext() avec un msgid en paramètre :
Comme vous pouvez le voir, l'implémentation d'une localisation Gettext n'est pas si complexe ; l'inconvénient majeur reste que le serveur Web doit être configuré pour supporter Gettext, ce qui n'est pas obligatoirement le cas.
Quand gettext ne convient pas, je vous conseille la méthode qui suit.
1.2 Array de langue
Le principe est très simple : on crée un fichier qui définit un array (table) contenant les mots à traduire. Après, il suffit d'inclure ce fichier dans chaque page et d'accéder à l'array pour traduire. L'inconvénient de cette méthode est qu'elle réclame plus de mémoire et temps CPU que la méthode précédente, sachant que plus l'array est grand et plus ce sera lent. Son avantage est bien sur que c'est vraiment très simple à mettre en place, indépendamment de la configuration du serveur.
1.2.1 Le fichier
locale/fr_FR/lang.php
Note : je vous conseille d'utiliser les noms de locales standards, en_US, fr_FR, de_DE...
1.2.2 Utilisation dans PHP
Il est préférable d'utiliser require_once() au lieu d'include().
index.php
On peut alors accéder aux phrases grâce aux index :
2.0 Localisation du reste
Le PHP est capable d'afficher certaines informations nativement en version localisée ; le passage en version localisée se faisant en appelant la fonction setlocale() :
Ensuite, certaines informations seront automatiquement affichées en version localisée (les fractions, par exemple), pour le reste il vous faudra utiliser des fonctions PHP supportant la localisation.
2.1 Les fonctions
Je vous invite à consulter la documentation des fonctions suivantes (liste clairement pas exhaustive) avant de regarder les exemples :
2.1 Exemples
Les fractions seront automatiquement affichées en version localisée :
Et pour finir, un exemple qui montre plus ou moins tout ce qu'on pourrait être amené à faire en localisation PHP.
Historique
1.0 - 08/08/2005
1.01 - 09/08/2005
1.02 - 12/01/2006
Sous FreeBSD, il faut préciser l'encodage quand on utilise setlocale() (par exemple setlocale(LC_ALL, 'en_US.ISO8859-1')).
Conclusion
Le PHP n'est pas vraiment le langage le plus puissant en matière de localisation, mais il offre néanmoins des options intéressantes à condition d'y penser dès le début du projet.
La localisation d'un projet PHP s'organise à deux niveaux :
- 1.0 La localisation du texte
- Gettext
- Array de langue
- 2.0 La localisation du reste (nombres, dates, monnaie...)
- Les fonctions
- Exemples
1.0 Localisation du texte
Remarque importante : quelle que soit la méthode de localisation choisie, aucun texte non-localisé ne doit figurer en dur dans le code PHP. L'idée est donc de stocker le texte "statique" dans des fichiers à part afin de l'insérer dans la page au moment de l'affichage.
Pour cela, il existe plusieurs méthodes, dont le deux suivantes :
1.1 Gettext
Gettext est un logiciel GNU utilisé sous Unix pour afficher du texte localisé. Gettext a plusieurs avantages et inconvénients, mais on retient surtout qu'il est rapide, standardisé et qu'il supporte les pluriels. Côté inconvénients, il est nécessaire que gettext soit installé sur le serveur, que PHP ait été compilé avec support Gettext, et que les locales à utiliser (en_US, fr_FR...) soient aussi présents sur le serveur. Donc le bon fonctionnement de Gettext est très dépendant de la configuration du serveur, ce qui n'est pas vraiment idéal. De plus, le support Gettext sous Windows n'est pas vraiment très au point, et pour finir, il faut utiliser un logiciel fourni avec Gettext pour compiler les fichiers de localisation.
Si vous avez besoin d'utiliser Gettext, voici comment faire.
1.1.1 Les fichiers Gettext
Les traductions sont contenues dans des fichiers .po (je vous invite à appeler vos fichiers messages.po). Par exemple :
messages.po
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2004-12-24 16:33+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
msgid "Access denied."
msgstr "Accès refusé."
msgid "Wrong password."
msgstr "Mot de passe incorrect."
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2004-12-24 16:33+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
msgid "Access denied."
msgstr "Accès refusé."
msgid "Wrong password."
msgstr "Mot de passe incorrect."
msgid contient la phrase à traduire et msgstr la traduction. On peut alors compiler les fichiers messages.mo grâce à la commande msgfmt :
$ msgfmt messages.po -o messages.mo
L'arborescence de vos fichiers doit être semblable à ceci :
www_root
'- locale
'- fr
' '- LC_MESSAGES
' '- messages.mo
' '- messages.po
'- en
'- LC_MESSAGES
'- ...
'- locale
'- fr
' '- LC_MESSAGES
' '- messages.mo
' '- messages.po
'- en
'- LC_MESSAGES
'- ...
Passons maintenant à la partie PHP.
1.1.2 Utilisation dans PHP
Je vous invite à créer une fonction pour simplifier l'utilisation de Gettext :
inc/inc_functions.php
function SetupLang($lang) {
setlocale(LC_ALL, $lang);
$domain = 'messages';
$localedir = dirname($_SERVER['SCRIPT_FILENAME']) . '/locale';
bindtextdomain($domain, $localedir);
textdomain($domain);
}
setlocale(LC_ALL, $lang);
$domain = 'messages';
$localedir = dirname($_SERVER['SCRIPT_FILENAME']) . '/locale';
bindtextdomain($domain, $localedir);
textdomain($domain);
}
Puis dans index.php :
index.php
<?php
[...]
require_once ('inc/inc_functions.php');
[...]
SetupLang('fr_FR'); // On active la version française.
[...]
?>
[...]
require_once ('inc/inc_functions.php');
[...]
SetupLang('fr_FR'); // On active la version française.
[...]
?>
Enfin, pour traduire un texte, il suffit d'appeler la fonction gettext() avec un msgid en paramètre :
echo (gettext('Access denied.'));
Comme vous pouvez le voir, l'implémentation d'une localisation Gettext n'est pas si complexe ; l'inconvénient majeur reste que le serveur Web doit être configuré pour supporter Gettext, ce qui n'est pas obligatoirement le cas.
Quand gettext ne convient pas, je vous conseille la méthode qui suit.
1.2 Array de langue
Le principe est très simple : on crée un fichier qui définit un array (table) contenant les mots à traduire. Après, il suffit d'inclure ce fichier dans chaque page et d'accéder à l'array pour traduire. L'inconvénient de cette méthode est qu'elle réclame plus de mémoire et temps CPU que la méthode précédente, sachant que plus l'array est grand et plus ce sera lent. Son avantage est bien sur que c'est vraiment très simple à mettre en place, indépendamment de la configuration du serveur.
1.2.1 Le fichier
locale/fr_FR/lang.php
<?php
$lang = array (
'access_denied' => 'Accès refusé.',
'wrong_passwd' => 'Mot de passe incorrect.'
)
?>
$lang = array (
'access_denied' => 'Accès refusé.',
'wrong_passwd' => 'Mot de passe incorrect.'
)
?>
Note : je vous conseille d'utiliser les noms de locales standards, en_US, fr_FR, de_DE...
1.2.2 Utilisation dans PHP
Il est préférable d'utiliser require_once() au lieu d'include().
index.php
$SetDisplayLang = 'fr_FR';
require_once ('locale/' . $SetDisplayLang . '/lang.php');
?>
require_once ('locale/' . $SetDisplayLang . '/lang.php');
?>
On peut alors accéder aux phrases grâce aux index :
echo ($lang['wrong_passwd');
2.0 Localisation du reste
Le PHP est capable d'afficher certaines informations nativement en version localisée ; le passage en version localisée se faisant en appelant la fonction setlocale() :
$SetDisplayLang = 'fr_FR';
setlocale(LC_ALL, $SetDisplayLang.'.ISO8859-1');
setlocale(LC_ALL, $SetDisplayLang.'.ISO8859-1');
Ensuite, certaines informations seront automatiquement affichées en version localisée (les fractions, par exemple), pour le reste il vous faudra utiliser des fonctions PHP supportant la localisation.
2.1 Les fonctions
Je vous invite à consulter la documentation des fonctions suivantes (liste clairement pas exhaustive) avant de regarder les exemples :
2.1 Exemples
Les fractions seront automatiquement affichées en version localisée :
setlocale(LC_ALL, 'fr_FR.ISO8859-1');
echo (1/2); // Affiche 0,5
setlocale(LC_ALL, 'en_US.ISO8859-1');
echo (1/2); // Affiche 0.5
echo (1/2); // Affiche 0,5
setlocale(LC_ALL, 'en_US.ISO8859-1');
echo (1/2); // Affiche 0.5
Et pour finir, un exemple qui montre plus ou moins tout ce qu'on pourrait être amené à faire en localisation PHP.
Historique
1.0 - 08/08/2005
1.01 - 09/08/2005
1.02 - 12/01/2006
Sous FreeBSD, il faut préciser l'encodage quand on utilise setlocale() (par exemple setlocale(LC_ALL, 'en_US.ISO8859-1')).
Conclusion
Le PHP n'est pas vraiment le langage le plus puissant en matière de localisation, mais il offre néanmoins des options intéressantes à condition d'y penser dès le début du projet.
Posté le 08/08/05 à 19:35