mardi, mars 19, 2024
Nom d'utilisateur : Mot de passe :
Home > Dossiers > Dossiers PHP > Réalisation d'un site localisé
[NEWS]
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
# 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."


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
                '- ...


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);
}


Puis dans index.php :

index.php
<?php
[...]
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.'

)
?>


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');
?>


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');


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


Et pour finir, un exemple qui montre plus ou moins tout ce qu'on pourrait être amené à faire en localisation PHP. happy.gif

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

Réalisation d'un site localisé
Vous pourriez commenter si vous aviez un compte !