Carnet Wiki

MultilinguismeExemple4

Version 3 — March 2007 NicolasR

Voici encore un exemple d’utilisation du multilinguisme de SPIP.

les boucles utilisées sont aussi discutées dans cette contrib, celle ci et sur mon site.

[Error...3]

Contraintes

Comme dans l’exemple MultilinguismeExemple3, je ne voulais pas séparer les langues par secteurs mais toutes les mélanger dans la structure primaire du site. J’ai fait ce choix, parce que mon site respecte deux choses:

  1. tous les articles sont au moins en anglais (la langue par défaut du site),
  2. quelques traductions existent dans d’autres langues, mais elles ne sont pas faites à un rythme très soutenu.

Ce choix me permet:
-  d’afficher tous les articles à tous les visiteurs, quelle que soit la langue choisie, soit dans la langue par défaut, soit dans la langue du visiteur quand c’est possible,
-  localiser les chaînes statiques dans la langue du visiteur,
-  donner facilement accès aux traductions au cas où l’auteur veuille les lire.

Ainsi, les listes d’articles (sur le sommaire, les pages des rubriques, la page de recherche, ...) mélangent la langue du visiteur et la langue par défaut. Par exemple:

- Graphic projects
-  J’ai effacé IO.sys, windows 9X ne veut plus démarrer
-  Emacs and OS X
-  Renommer des fichiers en masse avec linux

[Error...6][Error...7][Error...8]pour un visiteur francophone, et:

- Graphic projects
-  I have removed IO.sys, windows 9X won’t restart
-  Emacs and OS X
-  Mass renaming with linux shell

[Error...10]pour un visiteur anglophone.

Solutions choisies

Langue du visiteur

La langue par défaut du site est l’anglais, mais le visiteur peut choisir sa langue. Pour que les localisations soient dans la langue du visiteur et non pas dans celle du contexte, la variable $forcer_lang est mise à true dans mes_options.php3. Ainsi, les localisations sont traduites par SPIP dans la langue choisie par #MENU_LANG.

[Error...14]Par choix esthétique, le menu a été abandonné pour afficher des drapeaux (je sais, ça plait pas à tout le monde). Voici donc le code pour faire cela:

<?php 
$langues_autorisees = explode(',', lire_meta('langues_multilingue'));
while (list(,$l) = each ($langues_autorisees)) {
  if ($l == $GLOBALS['spip_lang']) {
?>
<img id="langage" src="#URL_SITE_SPIP/NAVPICS/<?php echo $l;?>-desactive.png" height="16" width="16">
<?php } else { ?>
<a href="<?php
	$lien = $GLOBALS['clean_link'];
	$lien->delVar('var_lang');
	$lien->delVar('redir');
	$lien = $lien->getUrl();
       $post = 'spip_cookie.php';
	$postcomplet = new Link($post);
 	$postcomplet->addvar('url', $lien);
      $postcomplet->addvar('var_lang', $l);
      echo $postcomplet->geturl();?>" 
title="<?php echo ucfirst(traduire_nom_langue($l));?>" class="lien">
<img id="langage" src="#URL_SITE_SPIP/NAVPICS/<?php echo $l;?>.png" height="16" width="16">
</a>
<?php }} ?>

On affiche des drapeaux pris dans NAVPICS, celui choisie par l’utilisateur est grisé: pour chaque langue (xx), il y a un fichier xx.png (activé) et un xx_desactive.png (désactivé). Par exemple fr.png/fr-desactive.png, en.png/en-desactive.png.
Pensez également à modifier la ligne
$post = ’spip_cookie.php’;
en
$post = ’spip_cookie.php3’;
si les fichiers de votre distribution SPIP sont en php3.

[Error...17]Liste d’articles

Pour mélanger les deux langues, on ne peut pas utiliser les boucles SPIP seulement, il y a donc un peu de code php. On a au départ une boucle sur les articles dans la langue par défaut (tous les articles existent dans cette langue), puis une boucle sur chaque traduction. Si une traduction existe dans la langue choisie, alors on affiche plutôt celle là.

<BOUCLE_article_un(ARTICLES) {lang="en"} {lang_select=non} {par date} {inverse} {0,3}>
<?php $find_lg = 0;?>
<BOUCLE_traductions(ARTICLES) {traduction} {lang_select=non}>
<?php if($GLOBALS['spip_lang'] == "#LANG") {?>
	<h2 class="titre-extrait"><a href="#URL_ARTICLE">#TITRE</a></h2>
<?php
$find_lg = 1;
}
?>
</BOUCLE_traductions>
<?php if($find_lg == 0) {?>
     <h2 class="titre-extrait"><a href="#URL_ARTICLE">#TITRE</a></h2>
<?php } ?>
</BOUCLE_article_un>

[Error...19][Error...20] Avec la 1.8

Le nouveau compilo, c’est quand même bien, cette boucle devient:

<BOUCLE_article_un(ARTICLES) {lang="en"}{par date} {inverse} {0,3}>
<BOUCLE_traductions(ARTICLES) {traduction}{lang=#ENV{lang}}>
	<h2 class="titre-extrait"><a href="#URL_ARTICLE">#TITRE</a></h2>
</BOUCLE_traductions>
     <h2 class="titre-extrait"><a href="#URL_ARTICLE">#TITRE</a></h2>
<//B_traductions>
</BOUCLE_article_un>

[Error...22]La traduction de l’article

Parfois l’utilisateur peut arriver sur le site depuis un moteur de recherche ou un autre site, qui le pointe directement sur un article dans une autre langue que la sienne. Si il est déjà venu sur le site, alors un cookie définira sa langue préférée et les chaînes seront localisées directement. Pour mettre en avant qu’il existe une traduction dans sa langue, on affiche, sous le titre de l’article un petit texte:

<?php 
$find_direct = false;
if($GLOBALS['spip_lang'] != "#LANG") {?>
<BOUCLE_redir_langue(ARTICLES){traduction}>
<?php if ($GLOBALS['spip_lang'] == "#LANG") { ?>
   <:article_en:> <a href="#URL_ARTICLE">[(#LANG|traduire_nom_langue)]</a>
<?php 
$find_direct = true;
} ?>
</BOUCLE_redir_langue>
<?php 
	if(!$find_direct) {?>
	  <BOUCLE_redir_langue_def(ARTICLES){traduction}{lang=en}>
           <:article_en:>&nbsp<a href="#URL_ARTICLE">[(#LANG|traduire_nom_langue)]</a>
        </BOUCLE_redir_langue_def>
<?php	}
} ?>

[Error...24][Error...25]Les Forums

Il existe pour chaque traduction, un forum dans la langue de cette traduction. Dans un squelette de base, les visiteurs ne peuvent pas profiter des contributions faites aux traductions de l’articles sans changer d’article. Pourtant certaines contributions dans une autre langue peuvent être très intéressantes, et le visiteur peut très bien pouvoir les comprendre lui même.

[Error...27]On affiche donc, grâce à des onglets, les forums de chaque langue sous chaque traduction.

Cette boucle est discutée ici.

Défauts

- Cette configuration n’est cohérente que si l’on est sûr que tous les articles sont au moins tous traduits dans la même langue.
-  Les nouvelles traductions ne sont pas mises en avant : seul les derniers articles de la langue par défaut sont mis en avant dans un tri chronologique.
-  les squelettes sont très lourds: il y a beaucoup de redondance et de code php à exécuter à chaque visite.
Pour remplacer le le menu lang déroulant par une liste en évitant le PHP, il faudrait surcharger le formulaire_menu_lang.html. Ce n’est faisable sur la 1.8.2b, voir ce message de Emmanuel qui appelle les volontaires !
-  le mélange des langues pourrait dérouter quelqu’un qui ne comprend pas du tout la langue par défaut du site (il faut donc que ce soit une langue très répandue parmi les visiteurs)
-  le code généré n’est pas valide avec les standards w3c: les séparateurs des variables de l’url s’affichent avec & au lieu de &

Le squelette du site est — il est un peu bordélique est pas totalement à jour avec la 1.8 finale, mais il marche bien. Je vous encourage à ajouter des commentaires, questions, défauts à tout ceci.

[Error...31][Error...32]