SPIP

[ar] [ast] [bg] [br] [ca] [co] [cpf] [cs] [da] [de] [en] [eo] [es] [eu] [fa] [fon] [fr] [gl] [id] [it] [ja] [lb] [nl] [oc] [pl] [pt] [ro] [ru] [sk] [sv] [tr] [uk] [vi] [zh] Espace de traduction

Télécharger

Internationaliser les squelettes

Octobre 2003 — mis à jour le : Mai 2012

Toutes les versions de cet article :

L’internationalisation des squelettes, abordée dans cet article est disponible à partir de SPIP 1.7.


Pourquoi créer des squelettes multilingues ?

Dès la mise en ligne de documents, SPIP adapte certaines informations « automatiques » dans la langue désirée. Notamment les dates sont affichées dans la langue du site, ou d’un article, ou d’une rubrique, les formulaires sont affichés dans la langue correspondante (par exemple l’interface pour poster des messages de forums)... Tout cela est d’ores et déjà traduit par SPIP.

Ce n’est cependant pas suffisant : les webmestres insèrent dans leurs squelettes un certain nombre d’informations, décrivant notamment les principes de navigation dans le site. Il est nécessaire, par exemple, d’afficher des textes du style « Plan du site », « Répondre à cet article », « Articles du même auteur », « Dans la même rubrique »... Pour un site dans une seule langue, ces différents éléments sont faciles à insérer : on les insère tels quels dans le code HTML des squelettes. Le problème apparaît lorsque le site est multilingue : sous un article en français, on veut afficher « Répondre à cet article », mais sous un article en anglais, on a besoin d’afficher un autre texte (« Comment on this article »).

[SPIP 1.7.2] propose trois méthodes pour gérer ces éléments de texte différents selon les langues :

— (1) une méthode consistant à stocker les éléments de texte des squelettes dans des fichiers de langue (un fichier différent par langue utilisée sur le site), séparés des squelettes ; un squelette unique (par exemple article.html appelant, selon des codes définis par le webmestre, ces éléments de texte en fonction de la langue utilisée ; de cette façon, un même squelette article.html affichera automatiquement le texte « Répondre à cet article » ou « Comment on this document » en fonction de la langue de l’article. Cette méthode est vivement conseillée, elle offre le plus de souplesse, elle facilite les mises à jour du site (on travaille avec un squelette unique qui gère automatiquement plusieurs langues), et à terme des outils seront ajoutés à SPIP facilitant le travail collectif de traduction de l’interface de votre site (plusieurs administrateurs, parlant chacun une langue différente, pourront traduire l’interface d’un même site depuis l’espace privé, sans avoir besoin d’intervenir sur les fichiers des squelettes) ;

— (2) une méthode plus rapidement accessible, techniquement très simple, reposant sur la création de fichiers de squelettes différents pour chaque langue. Dans cette méthode, on fabrique un fichier article.html pour gérer les articles en français, et un fichier article.en.html pour les articles en anglais (note : article.html gère en réalité toutes les langues sauf l’anglais). Cette méthode est déconseillée si le site utilise de nombreuses langues et/ou si on utilise des squelettes distincts selon les rubriques. Par ailleurs, elle est dans tous les cas avantageusement remplacée par la méthode 3 décrite ci-dessous :

— (3) la méthode des « blocs multilingues », introduite par [SPIP 1.7.2], fonctionne aussi bien dans les contenus que dans les squelettes. Il suffit de mettre dans le squelette la construction suivante :

<multi>
[fr] Répondre à cet article
[en] Comment on this article
</multi>

et la phrase s’affichera dans la langue voulue [1]. Si ce système est très souple, il atteint toutefois ses limites dès que le nombre de langues est important, et que l’on souhaite que différents traducteurs interviennent dans le site (il faut en effet qu’ils puissent modifier le squelette, ce que la méthode des fichiers de langue permet d’éviter). Il est donc préférable d’utiliser la méthode décrite ci-dessous.

1. Méthode des fichiers de langue

Le principe des fichiers de langue consiste à insérer dans un squelette unique un code, lequel correspondra dans chaque langue à un élément de texte (une « chaîne ») ; entre les différentes langues le code ne varie pas, mais le texte est traduit.

Par exemple, nous pouvons décider que le code telechargement correspond :
— en français, à la chaîne « télécharger ce fichier »,
— en anglais, à la chaîne « download this file »,
— en espagnol, à la chaîne « descargar este archivo »,
— etc.

Dans le fichier de squelette des articles (un seul fichier gérera toutes les langues), article.html, il suffit d’insérer le code (notez la syntaxe) : <:telechargement:>

Lors de l’affichage d’un article, ce code sera remplacé par sa traduction dans la langue de l’article.

Par exemple, dans le squelette article.html, nous insérons dans la boucle affichant les documents associés à l’article, le code suivant :  <a href="#URL_DOCUMENT"><:telechargement:></a>

Si l’article en question est en français, cela produira :  <a href="/IMG/jpg/mondocument.jpg">télécharger ce fichier</a>

si l’article est en anglais :  <a href="/IMG/jpg/mondocument.jpg">download this file</a>

et ainsi de suite. Un unique squelette, contenant un unique code, affiche un texte traduit dans toutes les langues utilisées sur le site.

Utiliser des textes déjà traduits

Pour faciliter le travail des webmestres, SPIP fournit un ensemble de chaînes déjà traduites (par les traducteurs de SPIP). En utilisant ces chaînes, correspondant à des éléments de texte fréquemment utilisés sur des sites Web, le webmestre peut rapidement réaliser une interface fonctionnant dans différentes langues, mêmes celles qu’il ne parle pas lui-même.

Vous pouvez lister les chaînes disponibles depuis l’espace privé : allez dans la section « Gestion des langues » de la partie « Administration du site », puis cliquez sur l’onglet « Fichiers de langues ». Vous n’avez plus qu’à y piocher les codes de votre choix pour la réalisation de vos squelettes.

PNG - 14.4 ko
Les fichiers de langue dans l’espace privé

Exemple : un webmestre veut réaliser l’interface pour un site en français, en espagnol et en arabe, mais il ne parle pas lui-même l’espagnol et l’arabe. En insérant dans ses squelettes les codes livrés avec SPIP, il n’a pas à se soucier d’obtenir des traductions en espagnol et en arabe, car le travail de traduction a déjà été effectué en amont par les traducteurs de SPIP ; ainsi, en mettant au point l’interface en français avec les codes fournis par SPIP, il sait que ses pages s’afficheront immédiatement en espagnol et en arabe.

Si par la suite on ajoute des articles en polonais, ils seront immédiatement affichés avec les éléments de texte traduits en polonais, sans que le webmestre ait à intervenir à nouveau.

Autre avantage de cette méthode : elle facilite la création de squelettes « à distribuer » immédiatement multilingues. Des squelettes réalisés selon cette méthode seront immédiatement utilisables dans toutes les langues dans lesquelles sera traduit SPIP.

D’un point de vue technique, les éléments de texte fournis en standard avec SPIP sont stockés dans les fichiers de langue du répertoire « ecrire/lang/ » :
— /ecrire/lang/public_fr.php, /ecrire/lang/ecrire_fr.php, /ecrire/lang/spip_fr.php, contiennent les chaînes en français,
— /ecrire/lang/public_en.php, /ecrire/lang/ecrire_en.php, /ecrire/lang/spip_en.php en anglais
— etc.


-  Créer ses propres codes

Il est de plus possible de créer ses propres codes, correspondant à des chaînes que l’on désire ajouter soi-même.

Il s’agit alors de créer des fichiers de langue personnels, sur le modèle des fichiers public_xx.php. Pour créer ses propres fichiers, on installera, dans un répertoire squelettes/lang (à créer le cas échéant)
— local_fr.php pour définir les chaînes en français,
— local_en.php en anglais,
— ...

historique : Dans les versions antérieures à [SPIP 1.8], les fichiers de langue personnels se plaçaient seulement dans le répertoire /ecrire/lang.

Par exemple, on pourra créer les chaînes suivantes :
— telechargement pour afficher « Télécharger la dernière version »,
— quoideneuf pour afficher « Modifications récentes ».

Selon cette méthode, on insère dans les squelettes les codes <:telechargement:> et <:quoideneuf:>, ils seront ensuite affichés avec les traductions correspondantes, telles qu’elles sont définies dans les fichiers local_xx.php. Pour une utilisation avancée, il est possible d’y inclure des variables <:quoideneuf:{fichier=tetedelinote.txt}:>(voir la documentation sur programmer)

Notons que les codes sont arbitraires : c’est vous qui les choisissez. Nous recommandons bien évidemment de choisir des codes qui vous permettent de les retenir facilement (plutôt que des numéros par exemple).

Attention : seules les lettres « minuscules » et « non accentuées » (« a » à « z ») , les chiffres (« 0 » à « 9 ») et le tiret bas (underscore « _ ») sont autorisés dans l’intitulé des clefs. Ainsi 'telechargement' => 'Téléchargez votre fichier.' fonctionnera alors que ni 'Telechargement' => 'Téléchargez votre fichier.', ni 'téléchargement' => 'Téléchargez votre fichier.' ne seront fonctionnels.

Évolutions

Depuis la version 3.0 de SPIP, cette fonctionnalité est largement revue et améliorée.

  • la surcharge par local_xx.php est maintenue ;
  • la surcharge d’un module de langue peut désormais contenir uniquement les codes de langue à modifier.

Ainsi, un squelette ou un plugin peut cibler un ou plusieurs codes de langue à surcharger sans pour autant contenir l’ensemble des codes de langues du module qu’il surcharge.

Ordre des surcharges : Les surcharges se font successivement dans l’ordre inverse du « path » :

  1. ecrire/lang/ [peut être surchargé par…]
  2. prive/lang/ [peut être surchargé par…]
  3. squelettes-dist/lang/ [peut être surchargé par…]
  4. plugin_A/lang/ [peut être surchargé par…]
  5. plugin_B/lang/ dépendant du plugin A [peut être surchargé par…]
  6. squelettes/lang/

Un plugin_B peut donc surcharger un ou plusieurs codes de langue d’un plugin_A, si B est dépendant de A. Les fichiers de langues dans « squelettes/lang/ » surchargent le tout.

Important : Il est indispensable dans l’écriture de vos squelettes que l’item de langue soit précédé par le préfixe du plugin dont il dépend : par exemple, une chaîne de langue traduite dans un fichier de langue du plugin « mon_plugin » devra être appelée dans les squelettes par : <:mon_plugin:ma_traduction:>.

Exemple concret : « plugins-dist/forum/lang/forum_fr.php » contient l’élément :  'form_pet_message_commentaire' => 'Un message, un commentaire ?', « plugins-dist/petitions/lang/petitions_fr.php » contient l’élément :  'form_pet_message_commentaire' => 'Un message, un commentaire ?',

Pour surcharger les deux chaînes de langues par la même traduction, il suffit d’ajouter à « squelettes/lang/local_fr.php »  'form_pet_message_commentaire' => 'ma traduction personnalisée', Pour uniquement surcharger la seule traduction pour petitions, il suffit d’ajouter à « squelettes/lang/petitions_fr.php »  'form_pet_message_commentaire' => 'ma traduction personnalisée pour pétitions uniquement', Les autres codes de langues contenus dans le plugin petitions seront pris en compte et seule cette traduction sera modifiée.

Ce fonctionnement est valable pour tous les modules de langues, ceux des plugins comme ceux du core.

Technique

Les fichiers de langue contiennent les différentes traductions des codes que vous utiliserez ; ce sont des fichiers PHP contenant chacun un tableau associant aux codes les chaînes correspondantes dans chaque langue.

Attention : Le nom de ces fichiers de langue ne devra pas contenir le caractère « _ » (« underscore » ou « tiret-bas ») sauf pour marquer la séparation avec l’initiale de la langue (en, fr, it,...). Par exemple, on créera « monperso_fr.php » et non « mon_perso_fr.php ».

Ces fichiers contiendront par exemple :

Version française (lang/monperso_fr.php) :

  <?php
  $GLOBALS[$GLOBALS['idx_lang']] = array(
    'telechargement' => 'Télécharger la dernière version',
    'quoideneuf' => 'Modifications récentes'
  );
  ?>

Version catalane (lang/monperso_ca.php) :

  <?php
  $GLOBALS[$GLOBALS['idx_lang']] = array(
    'telechargement' => 'Descarregar la darrera versió',
    'quoideneuf' => 'Modificacions recents'
  );
  ?>

La construction est la suivante :

  • au début du fichier :
      <?php
      $GLOBALS[$GLOBALS['idx_lang']] = array(
  • à la fin du fichier :
      );
      ?>
  • la partie qu’il faut enrichir soit-même consiste en plusieurs lignes de définitions, sur le modèle :
        'code' => 'La chaîne à afficher',

N.B.
— Chaque ligne de définition se termine par une virgule, sauf la dernière ligne.
— Les apostrophes à l’intérieur de la chaîne doivent être échappées, c’est-à-dire précédées d’un antislash. Par exemple, la chaîne « sur l’internet » doit être écrite : sur l\'internet.

2. Des squelettes séparés pour chaque langue

La seconde méthode, plus accessible aux webmestres débutants, consiste à créer des squelettes différents pour chaque langue. Un peu sur le même principe qui consiste à créer des squelettes spécifiques pour différentes rubriques pour obtenir des interfaces graphiques différentes.

Nous voulons réaliser un site en français (langue par défaut), en anglais et en espagnol. Nous réalisons trois fichiers de squelette différents :
— article.html pour le français (en réalité, pour toutes les langues qui n’ont pas de fichier de langue spécifique ci-après),
— article.en.html pour l’anglais,
— article.es.html pour l’espagnol.

(Note : si on publie un article en allemand, alors qu’il n’existe pas de squelette article.de.html sur notre site, c’est le squelette article.html qui sera utilisé.)

Important : pour que les squelettes « par langue », définis par l’ajout d’un .lang à la fin du nom, soient pris en compte, il faut obligatoirement qu’il existe la version « par défaut » sur le site.

Ici, si article.html n’existe pas (on aurait préféré nommer directement un article.fr.html), les fichiers anglais et espagnol ne seront pas pris en compte.

On peut combiner cela avec le nommage « par rubriques », et l’ordre suivant sera pris en compte :
— article=8.es.html (le squelette pour les articles en espagnol de la rubrique 8, mais pas ses sous-rubriques),
— article=8.html (le squelette pour les articles de la rubrique 8, mais pas ses sous-rubriques),
— article-2.es.html (le squelette pour les articles en espagnol de la rubrique 2 et ses sous-rubriques),
— article-2.html (le squelette pour les articles de la rubrique 2 et ses sous-rubriques),
— article.es.html (le squelette pour les articles en espagnol),
— article.html (le squelette pour les articles),
— article-dist.html (le squelette pour les articles livré avec SPIP).

Note : sauf pour quelques exceptions, il faut utiliser ici les codes de langues à deux lettres normalisés par l’ISO, comme « es ». On en trouvera notamment la liste sur le site de la Bibliothèque du Congrès des Etats-Unis (eh oui !). Pour s’assurer d’un maximum de compatibilité, il faut utiliser en priorité les codes ISO à deux lettres (« iso 639-1 »), quand ils existent, et pour une désignation plus spécialisée d’une langue dans sa famille linguistique les codes ISO à trois lettres (« iso 639-2 T »). Par exemple, l’allemand sera désigné comme « de ». Mais l’ISO ne prend en compte que 182 langues sur les 5 000 à 7 000 langues parlées dans le monde ; pour les langues non encore répertoriées, on peut s’inspirer du répertoire proposé par le site ethnologue.com ; pour en savoir plus, rendez-vous sur la liste spip-trad.
Se simplifier la vie. Une des méthodes de structuration très simple qu’autorise SPIP pour gérer un site multilingue consiste à associer directement les langues aux rubriques (et non article par article). Ainsi, dans le cas où les articles d’une même langue sont regroupés dans une même rubrique (voire par secteurs), on peut se contenter de créer les squelettes spécifiques par rubrique, sans utiliser alors les noms de fichiers par langues.

De cette façon, si, tous les articles en espagnol sont regroupés dans la rubrique 8 (et ses sous-rubriques), on peut se contenter de nommer le fichier adapté à l’espagnol rubrique-8.html plutôt que rubrique.es.html.

On devine les problèmes qui peuvent se poser avec cette méthode :
— le fichier article-2.html doit exister si on veut que article-2.es.html puisse être sélectionné ;
— on ne peut pas décider, à l’inverse, que article.es.html doit être utilisé à la place d’article-2.html si article-2.es.html n’existe pas : la sélection par rubriques a toujours la priorité sur la sélection par langues ;
— une correction de mise en page dans un squelette implique de faire la même correction dans les autres versions,
— on doit pouvoir insérer soi-même des éléments de texte dans les fichiers des squelettes, alors qu’on ne comprend pas forcément la langue (imaginez-vous créer ainsi les squelettes en arabe alors que vous parlez un peu le français de l’ouest et assez mal l’occitan du nord...).

Cette méthode est donc destinée à travailler rapidement sur des sites peu complexes (peu ou pas de squelettes spécifiques aux rubriques) et/ou comportant peu de langues différentes. Dès que votre projet multilingue devient un peu plus ambitieux, il est vivement conseillé de travailler avec la méthode des fichiers de langue.

3. Les blocs multilingues

Les blocs multi définis dans l’article Réaliser un site multilingue fonctionnent aussi bien dans le texte des auteurs ou mots-clés que dans les squelettes. Attention, ces blocs ne gèrent que du texte, et pas des boucles SPIP !

Pour gérer rapidement un site multilingue, c’est sans doute, dans un premier temps, la meilleure méthode, à la fois accessible et efficace ; ensuite, une fois votre site stabilisé, si vous avez besoin d’affiner vos squelettes (par exemple, pour les ouvrir à plus de langues ; ou pour les distribuer sous forme de contrib ; ou encore pour les « professionnaliser »), il faudra transformer vos blocs multi en fichiers de langue.

Notes

[1attention :
si vous utilisez un bloc multilingue dans la partie optionnelle d’une balise, vous devrez utiliser des accolades {} en lieu et place des crochets [] pour indiquer les codes de langue.
exemple : [<multi>{fr}Répondre à cet article{en}Comment on this article</multi>(#BALISE)]


Voir le squelette de cette page Site réalisé avec SPIP | Espace de traduction | Espace privé