Administrateur PHPfrance |
3131 Messages
26 mars 2007, 11:45
Exemple, j'ai un client (spécifique ciblé uniquement labo pharma) qui à un site de 6 pages simples de présentation avec guère plus de 5 ou 6 lignes de texte par page, le tout en 5 langues.
Une $var en cookie et de simples fichiers txt ont suffit pour gérer les langues.
L'evolution du site est inexistante car les explications sont tellement ciblées que seuls les gens concernés par cette technologie ont un pouvoir de compréhension.
L'exemple est bon et évidemment que dans ce cas utiliser gettext() donne l'impression d'utiliser un marteau pour écraser une mouche. Mais ici on n'est pas dans le cadre de la traduction d'une application, mais dans le cadre de l'écriture d'un document. Ce n'est pas pareil
gettext (et toutes les méthodes d'internationalisation, même basée sur des include) est plus dans son domaine dans les petits textes. C'est idéal pour la traduction de l'interface utilisateur : messages d'erreur, courts textes, textes des boutons, etc...
Pour le contenu en lui-même il ne doit pas être stocké dans un fichier PO. Déjà je me vois mal inclure du HTML dans un fichier PO, ça ressemblerait à n'importe quoi !
Par contre rien n'empêche de gérer la source de données dans le fichier PO (je fais ça sur un site, je trouve ça très beau comme méthode) :
include gettext('/contenu/aide/index.html');
Une fois le contenu traduit en allemand je le mets dans /contenu/aide/index.de.html (par exemple) et je traduis simplement "/contenu/aide/index.html" en "/contenu/aide/index.de.html" dans de.po
Pourquoi ne pas alors utiliser include "/contenu/aide/index.$lang.html" ?
- Parce que le fichier n'existe pas forcément pour la langue, du coup mon include est systématiquement encadre d'un if().
- Parce qu'utiliser une variable nécessite de vérifier son contenu avant (si jamais j'ai une faille de sécurité et que $lang est corrompue, je cours un risque) et ça alourdit encore le code.
- Parce que je peux très bien vouloir par exemple aller chercher certaines traductions de page vers un autre document (par exemple une page générique d'avertissement "da allemande version of your dokument pas là"

)
Pourquoi ne pas mettre le texte dans le fichier PO ?
- Parce qu'il faudra certainement inclure du HTML dans la traduction, ou pire hacher tout le texte et traduire chaque morceau.
- Parce qu'un fichier de traduction est par définition statique, alors que le contenu est dynamique.
J'ai tranché la question avec ce couplage des deux méthodes, que je trouve élégant.
Je dirais qu'il faut bien situer les différents problèmes dans la localisation d'une application, et je le découperais comme ça :
- La définition de la langue : ça c'est très classique, et je n'en ai même pas parlé. On vérifie si un cookie ou un $_GET['lang'] est défini. Si oui on utilise ça, sinon on extrait le code langue de l'entête envoyé par le navigateur pour trouver la langue par défaut, et on met en place le cookie. Classique, éprouvé, on ne reviendra pas dessus.
- La traduction de l'interface (partie statique) : là on a 2 grandes méthodes. La méthode base de données me paraît complètement absurde, faire une requête pour aller chercher l'intitulé du bouton "Envoyer" me semble démesuré, mais bon il faut y refléchir pourquoi pas. La méthode par fichier se découpe en deux "sous-méthodes" : gettext et include. On ne reviendra pas sur les avantages/inconvénients des deux méthodes on en a à peu près fait le tour je pense.
- La traduction du contenu (partie dynamique) : là pareil on a la méthode base de données ou fichiers. Mais la méthode par fichier PO me paraît inadaptée, vu le caractère fortement dynamique du contenu d'un site. Utiliser des fichiers PO pour le contenu rendrait impossible la mise en place d'un CMS. On pourra cependant utiliser de la traduction de contenu statique pour définir la source de données (nom de la table ou chemin du fichier contenu le texte localisé).
Je sens poindre la rédaction d'une FAQ ou d'un tuto au vu de ce topic
