Carnet Wiki

MultilinguismeExemple5

Bien. Moi aussi, j’ai opté pour une seule arborescence de rubriques puisque l’idée d’avoir un secteur par langue me semble un choix très étrange et inefficace depuis le debut du SPIP multilingue. Heureusement, les contraintes initiales du multilingue SPIP commencent à s’estomper, mais du coup, c’est le gros bins .
J’ai un peu souffert (beaucoup), notamment parce qu’un wikini ne vaudra jamais une vraie documentation synthétique et reflechie et qu’il n’y a pas de doc officielle correcte pour le multilingue. J’espere que la doc viendra un jour.
Mais ... ca a finit par bien vouloir marcher ! Et comme souvent, une fois la phase de recherche terminee, c’est étonnament concis.

Contrainte :

-  Dans la même arborescence de rubriques, des articles dans plusieurs langues. Il peut y avoir des articles non traduits dans n’importe quelle langue.

Préalable :

-  SPIP 1.8btruc : il paraît que le paramètre {lang=%lang} devient disponible à partir de cette version (voir NouveauCompilo). Ce code permet de sélectionner les articles disponibles dans la langue du visiteur, c’est à dire, celle passée dans l’url grâce au #MENU_LANG (plutôt que celle du contexte, de la rubrique courante par exemple).

-  SPIP 1.8.2 : la notation {lang=%lang} est remplacée par {lang=#ENV{lang}}

-  SPIP 1.9 $forcer_lang=true; dans ecrire/mes_options.php3.
-  SPIP 2.0$GLOBALS['forcer_lang']=true; dans ecrire/mes_options.php. [1]

-  Insérer #MENU_LANG là où il faut dans la page pour que le visiteur puisse choisir sa langue.

-  Pour les squelettes en morceaux, penser à passer le paramètre {lang} à tous les <INCLURE(machin.php)> qui deviennent donc des <INCLURE(machin.php) {lang}>

Objectif :

En fonction du choix du visiteur sur #MENU_LANG,

- Au niveau de la rubrique : Le visiteur doit avoir accès à tous les articles disponibles, quand c’est possible dans la version traduite dans sa langue, sinon en version originale.

<BOUCLE_rubrique_principale(RUBRIQUES){id_rubrique}>  // Tout en haut par defaut dans les squelettes SPIP

Sélectionner les articles qui sont dans la langue du visiteur ( #ENVlang ), et exclure leurs traductions (y compris les versions originales) de la suite du traitement.

<BOUCLE_articles_with_translation(ARTICLES){id_rubrique}{lang=#ENV{lang}}>  
<BOUCLE_traductions(ARTICLES){lang!=#ENV{lang}}{traduction}{doublons}>    
</BOUCLE_traductions></BOUCLE_articles_with_translation>

À ce niveau, il reste les articles dans la langue du visiteur plus tous ceux qui ne sont pas traduits dans celle ci.

<BOUCLE_coming(ARTICLES){id_rubrique}{doublons}>
	#TITRE
	#TEXTE
</BOUCLE_coming>

</BOUCLE_rubrique_principale>   // Tout en bas par defaut dans les squelettes SPIP

C’est la solution la plus élégante a ma connaissance : pas d’horrible PHP, court, clair et efficace. Tout cela grâce au NouveauCompilo, ce qui limite cette boucle aux version spip > 1.8b1.

Il faut juste comprendre qu’au lieu de selectionner tous les articles correspondant à nos critères - demarche habituelle des boucles SPIP -, on fait le contraire en excluant au prealable les articles que ne correspondent pas aux critères avant de traiter les autres tout a fait normalement.
(exclure se traduit ici par selectionner dans une boucle avec un {doublon} qui empeche les articles ainsi identifies de reapparaitre par la suite)


une alternative peut être plus compacte pour lister tous les articles d’une rubrique en ne les listant qu’une seule fois et en précisant si c’est un article original, traduit de quelle langue ou un original non traduit

[(#REM)  on liste tous les articles originaux]
<BOUCLE_art_rub(ARTICLES){id_rubrique}{!par date}{pagination 10}{origine_traduction}>
   [(#REM)  on cherche l'article dans la langue selectionnée]                                  
   <BOUCLE_trad(ARTICLES){traduction}{lang}{doublons trad}>
   <h2>#TITRE  ([(#_art_rub:LANG|=={#ENV{lang}}|?{<:article_orignal:>,<:traduction:> [(#_art_rub:LANG|traduire_nom_langue)]})])</h2>
   </BOUCLE_trad></B_trad>
   [(#REM)  aucune traduction:on prend l'article original]   
   <h2>#TITRE ([(#LANG|traduire_nom_langue)])</h2>
   <//B_trad>
                                               
</BOUCLE_art_rub>
    [<p class="pagination"><:pagination:> (#PAGINATION{page})</p>]
</B_art_rub>

méthode :

  1. on boucle sur {origine_traduction} pour récupérer les articles originaux (pour que les autres filtres date, num_titre )
  2. on utilise une boucle traduction avec un critèredoublons

-  EraTional / mai 2008 / spip 192c avec $forcer_lang


- Au niveau de l’article : Si le visiteur change de langue (avec #MENU_LANG) au niveau d’un article, on tente de lui proposer le même article traduit dans sa langue si disponible.

<BOUCLE_article_principal(ARTICLES) {id_article}>   // Tout en haut par defaut dans les squelettes SPIP

Pour l’article en cours, vérifier si il existe une traduction dans la langue du visiteur

<BOUCLE_traductions(ARTICLES){traduction}{lang=#ENV{lang}}>  
	#TITRE
	#TEXTE
</BOUCLE_traductions>  // Sinon, affiche la version originale (la version sur laquelle on se trouve deja)
	#TITRE
	#TEXTE
<//B_traductions>
</BOUCLE_article_principal>  // Tout en bas par defaut dans les squelettes SPIP

C’est moins élégant que pour les rubriques. Je vais chercher une meilleure méthode sans redondance, y doit bien y en avoir une dans le meme style que ci dessus...
Mais en tout cas, ca marche bien.

Mortimer remarque : ce code oblige l’utilisateur à regarder l’article dans la langue qu’il a choisie. S’il décide de visiter le site en français, mais veut tout de même lire la traduction en anglais (disons id=15) d’un article qu’il vient de lire en francais (id=14) (il y a plein de bonnes raisons pour vouloir le faire), il doit changer de langue sur le site (i.e. s’il demande l’article 15, il verra toujours l’article 14, à moins de passer tout le site en anglais).

- Mise à jour :11 mars 2010 à 16h46min