La mécanique existante
Traitement de l'interface
Dotclear ne fait appel à aucune librairie externe pour exécuter les traductions translations de texte. Contrairement à d'autres CMS qui utilisent GETTEXT par exemple.
La traduction translation des termes est assurée par la librairie l10n (fichier /inc/libs/lib.l10n.php ) et une série de fichiers de données situés dans les répertoires /l10n/... Une mécanique similaire est implantée dans le logiciel PlumesCMS (Je ne sais qui à copié sur l'autre; Et d'ailleurs c'est pas important.). Il est à noter que la version PlumeCMS de cette librairie comporte deux particularités : l'emplacement du stockage des fichiers de translation est indépendant de l'encodage des caractères, et la fonction de translation inclue la possibilité de lister les termes inconnus.
Le principe dépend de trois éléments :
l'identification du langage souhaité
Codé sur deux lettre minuscules (codification selon ISO639 : 'fr' pour le français, 'en' pour l'anglais, 'de' pour l'allemand, ...), eventuellement completées par l'indication du jeux de caractère ('fr' pour l'utilisation du français en ISO-8859-1, 'fr-utf8' pour l'utilisation du français en UTF8).
Pour l'interface, cette information est déduite par combinaison de la constante dc_default_lang (modifiable par l'interface d'administration) et la constante dc_encoding définie lors de l'installation du script.
La définition de correspondance de translation dans des fichiers .lang
Ces fichiers sont classés dans une arborescence de répertoires sous /l10n/.. pour la translation des fonctions du core (partie principale), dans themes/(_nom_|default)/l10n/.. pour les translations des termes introduits par le thème (couche de présentation finale)
- /l10n/fr/message.lang
- /l10n/fr/date.lang
- /l10n/fr-utf8/message.lang
- /l10n/fr-utf8/date.lang
- /l10n/en-utf8/message.lang
- /l10n/en/date.lang
- /l10n/en-utf8/message.lang
- /l10n/en-utf8/date.lang
- /themes/default/l10n/fr/main.lang
- /themes/default/l10n/fr-utf8/main.lang
- /themes/default/l10n/en-utf8/main.lang
- /themes/default/l10n/en-utf8/main.lang
La lecture de ces fichiers est déclarée dans le fichier /layout/prepend.php . Seuls les fichiers correspondants à l'identification du langage, définie plus haut par la combinaison des constantes dc_default_lang et dc_encoding, sont lus.
D'autres fichiers .lang peuvent être lus par les plugin, ou par les scripts du thème.
Les fichiers .lang sont des fichiers au format texte et utilisent une langue pivot (l'anglais). Chaque translation est codée sur trois lignes :
- La première spécifie l'expression pivot à convertir. Cette expression est précédée d'un point-virgule.
- La deuxième contient l'expression translatée avec le codage adéquat.
- La dernière ligne sert de séparateur elle doit être vide.
Ce format simple de fichier peut être généré avec un simple éditeur de texte.
A noter : Pour augmenter les performances de la librairie, les fichiers .lang peuvent être convertis en scripts PHP. Un utilitaire permet d'effectuer cette conversion.
L'utilisation de la fonction __('string') pour executer la translation du texte.
Cette fonction doit être utilisée pour la génération de tous textes nécessitant une translation. Cela est déjà le cas pour les fonctions d'affichage intégrées aux core. Mais cela est rarement fait pour les thèmes récupérés sur le site de Dotclear. Les modifications à faire sont par exemple pour le menu d'accès rapide aux éléments, du type :
Avant (ligne 50 du fichier template.php):
[xml]
Après :
[php]
Le fichier /themes/default/l10n/fr/main.lang pouvant contenir :
;Go to content
Aller au contenu
;Go to menu
Aller au menu
;Go to search
Aller à la recherche
etc...C'est cette manipulation qui a été faite pour le thème multilingue diffusé sur le wiki de Dotclear.
Traitement des contenus
Dotclear ne propose pas d'écrire un contenu traduit en plusieurs langues mais permet d'écrire des contenus dans plusieurs langues. Pour être plus clair, il est possible (et même souhaitable) de mentionner lors de la rédaction d'un billet la langue utilisée. Mais il n'est pas possible d'avoir pour un même billet (identifié de façon identique) plusieurs rédactions et traductions.
Un visiteur peut, s'il le désire, obtenir la liste des billets rédigés dans une langue. Ce choix est transmis via l'url (variable $lang dans les scripts).
Nous sommes donc dans la situation d'un site rédigé en plusieurs langues, mais pas d'un site traduit en plusieurs langues.
Comment faire pour avoir un site traduit en plusieurs langues
Plusieurs modifications sont a faire dans les scripts pour modifier le fonctionnement d'origine affin de simuler un site traduit en plusieurs langues.
Déjà il faut d'une manière ou d'une autre, pouvoir sélectionner la langue souhaitée par le visiteur. Cela peut être fait par un menu, ou par l'analyse des paramètres de connexion de l'utilisateur (complété par un menu, on ne sait jamais).
Le paramètre listant les langages supportés par le navigateur peut être une bonne source d'identification du souhait du visiteur. Attention dans ce cas il faut doubler ce mécanisme par l'affichage d'un menu. Ce menu est utile soit quand l'analyse des paramètres transmis par le navigateurs client n'est pas possible ou n'est pas fiable, mais aussi pour les pauvres robots d'indexation qui ne verraient qu'une partie du site sans ce menu.
Le choix validé peut être transmis par la suite par l'URL ou dans une variable session. La variable $lang peut être utilisée.
Attention : il faut pouvoir indiquer une langue par défaut utilisée dans le cas ou la langue demandée n'est pas disponible.
Une fois le langage déterminé il faut traiter à la fois le contenu et l'interface dans la même langue. Nous avons vu plus haut que Dotclear charge les fichiers translation du core dans le fichier /layout/prepend.php , c'est donc celui-ci qu'il faut modifier. (Attention toucher le CORE c'est pas bien). Pour prendre en compte le paramètre $lang si il est défini, à la place de la constante dc_default_lang
Les billets doivent être multipliés (un par traduction) et placés dans des catégories elles aussi multipliées (Pour avoir la traduction des libellés et de la description).
Quelques arrangements des liens dans le thème permettent d'achever cette simulation en spécifiant la langue systématiquement lors de l'appel des pages d'archive, de catégories, etc....
Pour que la recherche s'effectue elle aussi dans la base d'articles traduite dans la bonne langue, il faut ajouter le paramètre 'l' au formulaire.
Dernier obstacle, la génération des flux RSS et ATOM, mais là je n'ai pas encore fini les modifications des fichier rss.php et atom.php
Commentaires
c'est par la!...
theme multilingue (Chez Lou Bébert dé la Garagaï...)Je suis très intéressé par l'idée de créer un blog qui soit "language-friendly", je veux dire par là un blog dont les rubriques, les dates, et autres éléments de mise en page s'affichent dans la langue choisie par le visiteur dans son browser.
ChrisDans l'article ci-dessus, je suis intrigué par la phrase suivante:
"La lecture de ces fichiers est déclarée dans le fichier /layout/prepend.php . Seuls les fichiers correspondants à l'identification du langage, définie plus haut par la combinaison des constantes dc_default_lang et dc_encoding, sont lus."
Est-ce que cela veut dire que l'identification du langage est toujours choisie par le propriétaire du blog ? N'y a-t-il pas moyen de faire en sorte que le lecteur choisisse son langage ? (et encore une fois, je ne parle pas là du contenu, mais des éléments de mise en page : dates, titres de rubriques, "comments" vs "commentaires", "trackback" vs "rétrolien", etc.
Note: le lien vers le thème multilingue dans le premier commentaire de cette entrée ne fonctionne pas.
En effet le fonctionnement par défaut de Dotclear est : l'interface est dans la langue choisie par l'administrateur. Pour moi aussi c'est une aberration, c'est comme un resto chinois on l'on serait obligé de manger avec couteau et fourchette.
Pour remédier à cela il faut modifier le fichier /layout/prepend.php (ligne 80, remplacer dc_default_lang par $lang si cette dernière est définie)
Jérôme LauriolMerci bien pour ton aide!
AdrianDonc commme decris plus haut faites pas la même erreur que moi;lorsque vous definissez la langue de votre post; definissez la en 2 lettres! Ca vous eviterras de vider une cafetière...Avant d'y arriver!!
Sous DotClear 2, quelqu'un a une idée pour la manip a réaliser pour que la langue du navigateur (ou du moins pour qu'on puisse passer une variable de langue) pour changer la langue de l'interface ?
Nic0lasMerci d'avance.
Angesichts Thuribulum verabzureichen ebendieser stimmen icke werden feilbieten listrisch dergleichen leeres Wort, aufzubauschen Oberriexingen ausdruecken abhalftern augenfaellig geld verdienen selber kennenzulernen gegen durchhalten Froms Gambit der werden hermeneutisch hessisch duschen panschen ungleich werden erschwert sieben, oder gelenkig wehen du die Ununquadium.
Geld verdienen