Liste multilingue d’articles

Boucles pour un site multilingue, mais sans multilinguisme structuré a priori.

Le contexte tour de Babel et langue de référence

Les boucles présentées ont été conçues pour un site multilingue, mais sans multilinguisme structuré a priori. Les traductions et articles en différentes langues peuvent être un peu partout. Plutôt tour de Babel, donc.

Néanmoins, le visiteur qui arrive peut exprimer sa langue de préférence. Spip, alors, essayera autant que possible de lui montrer le site dans la langue choisie. Outre l’utilisation des techniques habituelles intrinsèques à SPIP (blocs <multi>, <:chaines:> d’internationalisations, ...) on utilise ici la traduction d’articles pour sélectionner dans une liste d’articles autant que possible, la version dans la langue de préférence.

Mais puisqu’on est dans une tour de Babel il est fort possible que bon nombre d’articles ne soient pas dans la langue de préférence, et aussi que notre visiteur soit un peu polyglotte. Ainsi, si un article n’existe pas dans la langue du visiteur, SPIP montrera la langue de référence de l’article.

La suite de boucles ci-dessous affiche les dix derniers si possible dans la langue du contexte où elles sont appelées, tel que décrit ci-dessus. On peut voir le fonctionnement d’une boucle de ce type dans mon site http://abuelo.belvil.net/.

Le code

Il vous faudra mettre un code comme le suivant à l’endroit où vous voulez voir la liste d’articles.

[(#REM) trad_lang_pref, trad_lang_pref2: exclure les traductions des 10 dernier articles dans la langue forcee ]

<BOUCLE_exclure_trad_pref(ARTICLES) {par date} {inverse} {0,10} {lang}>
	<BOUCLE_traductions_pref(ARTICLES){traduction}{exclus} 
			{doublons trad_lang_pref} {doublons trad_lang_pref2}>
	</BOUCLE_traductions_pref>
</BOUCLE_exclure_trad_pref>

[(#REM) trad_lang_autres: exclure les traductions des 10 dernier articles, autres que les 10 derniers dans la langue forcee, dans d'autres langues que la langue forcee ou que la langue d'origine, si pas de trad en langue forcee ]

<BOUCLE_exclure_trad(ARTICLES) {par date} {inverse}
			 {doublons trad_lang_pref2} {0,10}>
	<BOUCLE_lang_pref_ex(ARTICLES) {traduction} {lang = #ENV{lang}}>
		<BOUCLE_sel_trad_ex(ARTICLES) {traduction}{exclus}
				{doublons trad_lang_autres}>
		</BOUCLE_sel_trad_ex>
	</BOUCLE_lang_pref_ex> 
	</B_lang_pref_ex>
		<BOUCLE_lang_origine_ex(ARTICLES) 
			{traduction}{origine_traduction}>
			<BOUCLE_sel_art_ex(ARTICLES) 
				{traduction}{exclus}
				{doublons trad_lang_autres}>
			</BOUCLE_sel_art_ex>
		</BOUCLE_lang_origine_ex>
	<//B_lang_pref_ex> 
</BOUCLE_exclure_trad>

[(#REM) inclure les dix articles plus recents, si possible dans la langue forcee ]
<BOUCLE_article_une(ARTICLES) {par date} {inverse}
			{doublons trad_lang_pref} 
			{doublons trad_lang_autres}{0,10}>
	<BOUCLE_lang_pref(ARTICLES) {traduction} {lang = #ENV{lang}}>
[(#REM)			si l'article existe dans la lanue forcee ]
		<INCLURE(article_une.php3){id_article}>
	</BOUCLE_lang_pref> 
	</B_lang_pref> 
		<BOUCLE_lang_origine(ARTICLES) {traduction}{origine_traduction}>
[(#REM)		si l'article n'existe pas dans la langue forcee,
		si l'article a des traductions on prend l'originale ]
 			<INCLURE(article_une.php3){id_article}>
		</BOUCLE_lang_origine>
[(#REM)			si l'article n'existe pas dans la langue forcee,
			si l'article est monolingue ]
			<INCLURE(article_une.php3){id_article}>
		<//B_lang_origine>
	<//B_lang_pref> 
</BOUCLE_article_une>

Pour finir l’exemple

Essayez simplement cette boucle dans un squelettes basique de sommaire,
sans la mettre dans une autre boucle.

Techniquement, c’est mieux de configurer notre site avec la variable $forcer_lang = true; dans mes_options.php3.

Pour que le visiteur puisse exprimer sa langue de préférence, on mettra une balsie #MENU_LANG un peu n’importe où sur la page.

Dans le squelette article_une.html on mettra ce que l’on souhaite pour les élements de la liste. Par exemple :

<BOUCLE_principale(ARTICLES){id_article}>
	<h2>
		<a href="#URL_ARTICLE" 
			[title="(#DESCRIPTIF|textebrut|entites_html)"]>
		#TITRE</a>
	</h2>
	<div class="detail">
	([(#LANG|traduire_nom_langue)]) [(#DATE|nom_jour)] 
			[(#DATE|affdate)]	
	<B_auteurs_recents><:par_auteur:> 
	<BOUCLE_auteurs_recents(AUTEURS) {id_article} 
					{", "}>
	#NOM</BOUCLE_auteurs_recents>
	<B_trad_art2>
	<br /><:traductions:>
	<BOUCLE_trad_art2(ARTICLES){traduction} {exclus}>
		<div class="langue">
		[[<a href="#URL_ARTICLE" dir="#LANG_DIR"> 
		(#LANG|traduire_nom_langue)</a>]]
		</div>
	</BOUCLE_trad_art2>

	</div>
	<br />
</BOUCLE_principale>

Ainsi, quoi qu’il en soit, on construira des liens vers toutes les traductions d’un article.

Explication de l’idée de développement

Comme dans beaucoup de cas pour appliquer des critères de sélection avec des relations logiques complexes, on utilisera avantageusement les critères {doublons} et {exclus} : on fait une première série de boucles sans rien afficher, seulement pour exclure ce qu’on ne souhaite pas afficher.

On tirera profit du nouveau paramètre optionnel pour faire des {doublons} « nommés », permettant de constituer plusieurs listes de résultats à exclure ailleurs.

On va donc d’abord sélectionner les 10 les plus récents articles dans la langue préférée [1]. Disons que la langue préférée est l’espagnol. On va exclure les traductions de ces articles en d’autres langues. On constituera deux fois cette liste d’exclusions (pour l’utiliser deux fois : trad_lang_pref et trad_lang_pref2).

En utilisant une première fois l’exclusion ci-dessus, on selectionnera les 10 articles les plus récents dans d’autres langues que l’espagnol. Et on ira examiner l’existence de traductions de ces articles en espagnol pour constituer une troisième liste d’exclusions (trad_lang_autres) :
-  si l’article est traduit en espagnol on excluera toutes ses traductions,
-  si l’article n’existe pas en espagnol alors on excluera toutes ses traductions, sauf l’article de référence (seul ou origine des traductions).

On fera ensuite une sélection qui sera celle des dix articles les plus récents sauf ceux de l’union de la première exclusion (trad_lang_pref) et de cette troisième (trad_lang_autres). Cela devrait devrait nous choisir, dans l’ordre anté-chronologique, dix articles parmis l’union des 10 articles les plus récents en espagnol et les dix les plus récents dans les autres langues (qui peuvent être ou non traduits en espagnol).

Après, pour chacun de ces articles, on l’affiche en espagnol s’il est disponible, et sinon dans la langue de l’article d’origine. Et dans le squelette inclus, on fait affiche toutes les autres traductions.

Notes

[1en fait la langue du contexte. hors toute autre boucle il s’agit de la langue choisie dans l’URL ou à défaut la langue principale du site.

Discussion

Une discussion

  • 1

    Je voudrais utiliser votre contrib pour réaliser un menu qui contient tous les articles de la rubrique, p.ex.

    -  first
    -  second
    -  third

    Supposons qu’il y a aussi primo et premier (traductions de first), et qu’il n’y a pas de traductions de second et third.

    Si le visiteur choisit ’primo’ comme version de l’article, je voudrais que le menu change en

    -  primo
    -  second
    -  third

    Est-ce possible ? Comment faire avec spip 1.9.1 ?

    Merci.

    • popojcb

      Peut-être n’ai-je pas pas bien compris la question, mais avec la balise multi sur le titre, lorsque tu swicth de langue, cela dois fonctionner non ?

    Répondre à ce message

Ajouter un commentaire

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

Qui êtes-vous ?
[Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom