Carnet Wiki

MultilinguismeExemple1

NB. depuis la 1.8 et les explications de Pierre Andrews sur le wiki, les choses sont nettement plus simples avec le multilinguisme
Et j’ai l’impression qu’une bonne partie des difficultés se lèvent dès que l’on met $forcer_lang=true dans : ecrire/mes_options.php3 (à créer si non présent).
$forcer_lang=true impose à l’interface de Spip d’être écrite dans la
langue du choix du visiteur
alors que si ce n’est pas le cas (par défaut = false) elle se met ou dans la langue par défaut du site ou dans la langue de l’article affiché


L’objectif : un site Corporate bilingue (voire trilingue, cf l’autre site d’exemple, un peu plus bas (variante), sur les mêmes bases). Le cas d’un tel site est un des cas signalés dans la doc (2 articles sur le multilinguisme). Avec en plus un traitement multilingue des mots-clés (les mots clés sont définis au niveau de l’article original, et les traductions héritent de ces mots-clés)

Rappel sur le multilinguisme dans Spip (doc 1.7.2) :
-  l’interface (Spip) est affichée dans une langue, ce qui n’empêche pas d’afficher un article dans une autre langue, selon les choix faits dans les squelettes (et à la configuration ?).
-  les traductions sont en fait des éléments à part entière, comme les articles originaux. Ils peuvent être liés, ou déliés de l’article original.
-  les blocs « multi » permettent d’afficher différents éléments, comme les mots-clés de l’article affiché, dans la langue de l’interface.
-  le critère {lang_select=non} dans une boucle_(ARTICLES) de recherche permet de ne pas utiliser la langue stockée avec l’article consulté dans la base de données, et sert ainsi « à conserver le contexte de langue de l’article en cours d’affichage ». (Arno) (attendre la v1.8 pour que cela marche tout à fait comme annoncé, voir remarque de Fil, plus bas).

une remarque importante qui se déduit du premier rappel, ci-dessus.
Il semble qu’une bonne partie des difficultés liées au multilinguisme disparaissent dès qu’on décide de bien distinguer la langue de l’interface (à choisir dans une longue liste, celle des langues de Spip), et la langue du contenu (dans une liste beaucoup plus restreinte en général.
Une conclusion possible : avoir 2 boutons/drapeaux pour l’utilisateur : un pour la langue de l’interface (menu fourni : #MENU_LANG) et un autre pour celle du contenu, un drapeau. Et on n’affiche que les contenus dans la langue choisie (drapeau), et en plus la traduction de l’article affiché, dans les langues disponibles.

Les principes cherchés/choisis dans cet exemple :
-  un secteur par langue : English, Français, Español
+ éventuellement des rubriques multilingues (ne sachant si c’était nécessaire, j’ai configuré Spip ainsi)
-  l’auteur d’un article reste auteur par défaut des traductions de cet article, mais lorsqu’un article est affiché et que ce nom d’auteur apparaît sur l’écran, seul les articles de référence (dont il est l’auteur) sont mentionnés (avec bien sûr le lien vers cet article original). L’idéal serait que le(s) traducteur(s) apparaisse comme co-auteur de la traduction, que son nom soit saisi pour chaque traduction faite par lui, et qu’il apparaisse en co-auteur de l’article traduit.
_Il est donc supposé (à terme) que l’auteur (sur une traduction) sera récupéré depuis l’article de référence (comme les mots clés). En attendant, il pourra être mis à la main, sur les articles traduits.
-  quand un article est affiché dans une langue, un menu (avec un intitulé dans la langue de l’interface, grâce aux blocs multi) permet d’accéder à sa traduction dans la liste des langues où elle existe.
-  un drapeau pourrait permettre de passer à la version du site dans la langue correspondante => changement de secteur, (et de rubrique ??)
-  de même, les mots clés sont affichés, dans la langue de l’interface, grâce aux blocs multi
-  ces mots clés sont seulement saisis dans l’article de référence, et quand ils sont nécessaires (par ex. pour l’affichage des traductions de ves articles) dans le squelette, on va les chercher dans l’article de référence.
-  afficher les articles relatifs à un mot clé, non dans la langue originale, mais dans la langue de l’article affiché, s’ils sont disponibles dans cette langue.

NB REvoir ce qui est proposé au sujet de la gestion des mots clés, à la configuration de Spip ; par exemple : est-ce que cliquer OUI permet de faire hériter les traductions des mots clés de l’article original ??

Les fichiers .php3 et squelettes .html modifiés depuis le standard fourni (spip 1.7.2) sont placés dans le répertoire : http://franck.saintgermain.free.fr/...

Vous pouvez tester le fonctionnment sur cet exemple très simple, et reprendre ces squelettes pour les modifier/améliorer à votre convenance.

Config du site Spip
gestion des langues : activé le menu des langues au niveau des rubriques, de la racine, et non au niveau des articles
coché : gestion des liens de traduction.
(les mots clés ne peuvent être attribués par les rédacteurs)

Comment les tests sont faits
pour 2 langues : en, fr, sur le site de test : http://franck.saintgermain.free.fr

6 articles en tout :
2 articles (1 de référence en chaque langue), traduits chacun dans les deux autres langues => 4 articles
2 articles écrits en une seule langue : « english only », « français seulement »

ces 6 articles étant répartis dans deux (sous) rubriques des secteurs anglais, français (2 rubriques par secteur, donc par langue)

-  des mots clés répartis en ssgroupe (2), en groupe1 (mots clés 11 et 12), en groupe2 (mots clés 21 et 22)
Les groupes et les mots clés sont décrits avec les « blocs multi » :
<multi> Group 1 [en] Group 1 [fr] Groupe 1 </multi>
<multi> [en] KWord12 [fr] motCle12 </multi>

Les articles de référence sont associés à 1 ou 2 mots clés

Le même mot clé21, pour tous les articles de référence, sauf l’article "français seulement, (mot clé12 et mot clé22). (et aucun mot clé dans les traductions)

pour le moment 2 auteurs Fr sg pour les articles FR, En rique pour les articles EN, un pour chaque doc, y compris pour les traductions (à terme, faire « hériter » l’auteur depuis l’original)

-  Tableau récapitulatif :
Deux rubriques dans chacun des 2 secteurs (en, fr) contiennent 4 articles, éventuellement traduits, avec les mots clés associés (aux articles de référence seulement)
(2 mots clés dans le groupe 1, 2 mots clés dans le groupe 2)
Exemples : l’article 1, de référence en français, appartient aux Rubriques 1 dans les 2 langues (2 secteurs). L’article « english only », disponible seulement en anglais, est donc dans la rubrique 1 du secteur anglais, mais pas encore dans les autres secteurs.

Articles Rub 1 Rub 2 motcleSansGroupe mtcl2ssgr mot11 mot12 mot21 mot 22 Auteur
English only r1en x x ENrique
Français seulement r2fr x x x FRanck
1 vo fr r1 x FRanck
2 vo en r2 x x ENrique

VariantePour3langues : eng, fr, esp Site (différent du précédent) pour cet exemple, squelettes 1.7.2. Le site contient d’autres articles, regarder seulement ceux dont le nom commence par_ (il y a aussi d’autres secteurs que les 3 (eng, fr, esp) : rubrique 1 et 2 qui n’ont rien à voir).

Les squelettes fonctionnent en 1.8.1 (très bien), voir sur ce site

Attention : ne pas oublier de mettre forcer_lang=true, dans ecrire/mes_options.php3 (à créer si non présent)


Remarques :
-  les rubriques ne peuvent être associées (1.7.2) à des mots clés sans groupe (volontaire ? bug ? obligation ?) Ce n’est pas dramatique, mais il faut le savoir.
-  des mots clés spécifiques à une langue peuvent être ajoutés à un secteur (1 langue) [en plus de l’association à des rubriques et des articles]
-  un bug d’affichage (avec le squelette MOT.html standard) n’apparait que s’il n’y a pas plus de 1 article avec un mot clé, et/ou plus de 1 rubrique associée à un mot clé. (j’ai vainement cherché à comprendre, et j’ai découvert que cela disparaissait tout à coup...). Cela ne devrait pas être trop compliqué à changer.

Infos diverses, non nécessairement utilisées ici :
-  pour la 1.8.1 : (#LANG donne le nom de la langue (exemple français, quand #LANG vaut fr.

Les squelettes standard (1.7.2) ont été utilisés, complétés et modifiés, pour que chacun puisse essayer facilement, et en les modifiant / complétant.

Résultat des essais, fructueux

0. Le menu

 #MENU_LANG
<BR> 

inséré tout en haut, permet de choisir la langue de l’interface (il a le même effet que de cliquer sur les Menu « rubriques » (c’est-à dire les langues), mais sans revenir au sommaire du site (mais seulement dans certains cas avec la 1.7.2 ; et cliquer sur une rubrique n’a pas d’effet sur le changement de langue, avec la 1.8.1, si $forcer_lang = true). Ce menu est donc très utile pour les tests.

Et forcer_lang=true facilite bien le traitement multilingue, avec les hypothèses de travail choisies.

1. En ajoutant le code suivant à article.html,

   <BOUCLE_artmots(ARTICLES){traduction}{origine_traduction}{lang_select=non}>
	<B_mots2>
	<div class="menu">
	<h1 class="structure"><:mots_clefs:></h1>
	<ul class="divers" title="<:mots_clefs:>">
        <BOUCLE_mots2(MOTS){id_article}>
		<li>
		<div class="menu-titre"><a href="#URL_MOT" 				[title="(#DESCRIPTIF|textebrut|entites_html)"]>#TITRE</a></div>
	</li>
        </BOUCLE_mots2>
	</ul>
	</div>
	</B_mots2>
    </BOUCLE_artmots>

avant <!-- Liens des forums -->

on affiche les mots clés, dans la langue de l’interface.

1. deux possibilités différentes : 1.a et 1.b, pour l’affichage des articles liés par mot-clé à l’article affiché :

1.a le code :

<!-- Menu de navigation mots-cles -->

<B_mots>
<div class="menu">

<h1 class="structure"><:mots_clefs:></h1>

<ul class="divers" title="<:mots_clefs:>">
<BOUCLE_mots(MOTS) {id_article} {par titre}>
<li>
<div class="menu-titre"><a href="#URL_MOT" [title="(#DESCRIPTIF|textebrut|entites_html)"]>#TITRE</a></div>
<B_articles_mots>
	<ul class="menu-liste">
<BOUCLE_articles_mots(ARTICLES) {id_mot} {lang?} {exclus} {par hasard} {0,4}>
	<li class="menu-item"><a href="#URL_ARTICLE" title="[(#DESCRIPTIF|textebrut|entites_html)]">#TITRE</a></li>
</BOUCLE_articles_mots>
	</ul>
</B_articles_mots>
</li>
</BOUCLE_mots>
</ul>
</div>
</B_mots>

résulte d’une modification du code standard, et n’affiche en marge gauche (sous les mots-clés) que les articles traduits dans la langue de l’article affiché.

1.b le code :

<!-- Menu de navigation mots-cles -->

<B_tester_traduction>
<BOUCLE_tester_traduction(ARTICLES){id_article}{traduction} {lang_select=non}>
	<B_traduit>
	<BOUCLE_traduit(ARTICLES){id_article}{origine_traduction} {lang_select=non}>
		<INCLUDE(affichemots.php3) {id_article} {lang} {$lalangue} >
	</BOUCLE_traduit>
		<BOUCLE_motscles_origine(ARTICLES){traduction}{origine_traduction} {lang_select=non}>
			<INCLUDE(affichemots.php3) {id_article} {lang}  {$lalangue} >
		</BOUCLE_motscles_origine>
	<//B_traduit>
</BOUCLE_tester_traduction>
<!-- vérifier si ce cas existe finalement -->
<INCLUDE(affichemots.php3) {id_article} {lang} {$lalangue} >
<//B_tester_traduction>
</ul></div>

avec le code de « affichemots.html » mis en include :

<B_mots>
<div class="menu">
<h1 class="structure"><:mots_clefs:></h1>
<ul class="divers" title="<:mots_clefs:>">

<BOUCLE_mots(MOTS) {id_article} {par titre}>
<li>
<div class="menu-titre"><a href="#URL_MOT&lang=<?php echo $lalangue ; ?>" [title="(#DESCRIPTIF|textebrut|entites_html)"]>#TITRE</a></div>

	<B_articles_mots>
	<ul class="menu-liste">
	<!-- on cherche tous les articles (de référence) ayant le mot clé -->
	<BOUCLE_articles_mots(ARTICLES) {id_mot} {lang_select=non}>
<!-- si c'est un article (de référence) dans la langue on affiche son titre -->
		<B_articles_dslalangue>
		<BOUCLE_articles_dslalangue(ARTICLES) {id_article} {lang} {par titre}>

		<li class="menu-item"><a href="#URL_ARTICLE" 			title="[(#DESCRIPTIF|textebrut|entites_html)]">#TITRE</a></li>
		</BOUCLE_articles_dslalangue>
		
<!-- si ce n'est pas un article (de réf) dans la langue on cherche une trad ds la langue --> 
			<B_articles_traduits>
			<BOUCLE_articles_traduits(ARTICLES) {traduction} {lang}>
			<li class="menu-item"><a href="#URL_ARTICLE" 						
			title="[(#DESCRIPTIF|textebrut|entites_html)]">#TITRE</a></li>
			</BOUCLE_articles_traduits>
			<!-- si pas de traduction ds la langue on affiche l'article de réf (dans une autre langue) --> 
			<!-- affichage à enlever plus tard, surtout s'il y a beaucoup d'articles -->
			<li class="menu-item"><a href="#URL_ARTICLE" 						
			title="[(#DESCRIPTIF|textebrut|entites_html)]">#TITRE</a></li>
			<//B_articles_traduits>
		<//B_articles_dslalangue>
	</BOUCLE_articles_mots>
	</ul>
	</B_articles_mots>
	</li>
</BOUCLE_mots>

</B_mots>

affiche les mots clés de l’article affiché, en quelque sorte « hérités » de l’article de référence (original) et les articles correspondant à chaque mot clé ; ces articles signalés étant les articles de référence (quelquefois dans une autre langue que celle de l’article affiché, si l’article n’existe pas dans la langue de l’interface, choisie avec $forcer_lang=true).
Quand l’article est disponible dans la langue affichée, son titre est affiché sous le mot clé.

2. Le code :

 <B_articles_autrelangue>
	<div class="menu">
	<ul class="divers">
		<h2 class="structure"><:meme_rubrique:></h2>
		<div class="menu-titre">
		<multi> [en] in another language [fr] en une autre langue </multi>
		</div>
		<ul>
	<BOUCLE_articles_autrelangue(ARTICLES) {traduction} {exclus}>
		<li class="menu-item">
		<a href="#URL_ARTICLE" dir="#LANG_DIR">#TITRE</a>
		</li>
	</BOUCLE_articles_autrelangue>
		</ul>
	</ul>
	</div>

	</B_articles_autrelangue>

ajouté au standard, affiche un menu donnant les traductions de l’article affiché, dans les différentes langues où elles existent.

thierrybo : Si on veut afficher uniquement le nom de la langue des articles traduits (au lieu du nom de l’article), remplacer la ligne 11 :

<a href="#URL_ARTICLE" dir="#LANG_DIR">#TITRE</a>

par :

[<a href="#URL_ARTICLE" dir="#LANG_DIR">(#LANG|traduire_nom_langue)</a>]

/thierrybo

3. Le code

 
<!-- Auteurs de l'article -->
<!-- essai 040602 lang_select=oui  pour les 2 boucles, pour éviter d'afficher plusieurs occurences du même article écrit en  différentes langues -->

	<B_auteurs>

	<div class="menu">
	<h2 class="structure"><:memes_auteurs:></h2>
	<ul class="divers">
	<BOUCLE_auteurs(AUTEURS) {id_article} {par nom} >
		<li>
		<div class="menu-titre"><a href="#URL_AUTEUR">#NOM</a></div>
		<ul>
		[<li class="menu-item" style="text-align: center"><a href="(#URL_SITE)">#NOM_SITE</a></li>]
		[<li class="menu-item" style="text-align: center">(#BIO)</li>]
	<B_articles_auteur>
	<BOUCLE_articles_auteur(ARTICLES) {id_auteur} {lang?} {exclus} {par popularite} {inverse} {0,5}>
		<li class="menu-item"><a href="#URL_ARTICLE" [title="(#DESCRIPTIF|textebrut|entites_html)"]>#TITRE</a></li>
	</BOUCLE_articles_auteur>
		</ul>
		</li>
	</BOUCLE_auteurs>
	</ul>
	</div>

	</B_auteurs>

n’affiche que l’article original de l’auteur (et non ses traductions, dont il est aussi considéré comme auteur)

il faudra plus tard reprendre cette partie, en utilisant l’enchainement de Arno http://article.gmane.org/gmane.comp...

 
<BOUCLE_tester_traduction(ARTICLES){id_article}{traduction}>
	<BOUCLE_traduit(ARTICLES){id_article}{origine_traduction}>
		[<p>par (#LESAUTEURS)]
	</BOUCLE_traduit>
		<BOUCLE_auteur_origine(ARTICLES){traduction}{origine_traduction}>
		[<p>by (#LESAUTEURS)]
		</BOUCLE_auteur_origine>
		[<br>translation by (#LESAUTEURS)]
	<//B_traduit>
</BOUCLE_tester_traduction>
	[<p>par (#LESAUTEURS)]
<//B_tester_traduction>


, pour afficher non pas l’auteur de l’article courant, mais l’auteur de l’article original ; dans le cas où le choix serait confirmé de ne saisir que l’auteur de l’article original, comme avec les mots clés

4. Le code, à la fin de Mot.html :

 
<!-- Articles lies au mot-cle -->

<h1 class="structure"><:articles:></h1>

<div class="liste-articles">

<BOUCLE_articles_selection_mot(ARTICLES)  {id_mot} {lang_select=non}>
<BOUCLE_articles_langue(ARTICLES) {id_article} {traduction} {lang?} {par titre}>
	<h2><a href="#URL_ARTICLE" [title="(#DESCRIPTIF|textebrut|entites_html)"]>#TITRE</a></h2>
	<div class="detail">
	[(#DATE|nom_jour)] [(#DATE|affdate)]

	<B_auteurs><:par_auteur:> 
	<BOUCLE_auteurs(AUTEURS) {id_article} {", "}>
	#NOM
	</BOUCLE_auteurs>

	</div>
	<br>
</BOUCLE_articles_langue>
</B_articles_langue>
	<h2><a href="#URL_ARTICLE" [title="(#DESCRIPTIF|textebrut|entites_html)"]>#TITRE</a></h2>
	<div class="detail">
	[(#DATE|nom_jour)] [(#DATE|affdate)]

	<B_auteurs><:par_auteur:> 
	<BOUCLE_auteurs2(AUTEURS) {id_article} {", "}>
	#NOM
	</BOUCLE_auteurs2>

	</div>
	<br>
<//B_articles_langue>
</BOUCLE_articles_selection_mot>

affiche, avec la 1.8.1 (bug dans 1.7.2), dans la page Mot=xx, les articles relatifs à ce mot clé, dans la langue en cours,
ainsi que les articles de référence, relatifs à ce mot clé, non encore traduits dans la langue en cours.

5. Divers
5a. S’assurer d’avoir  title="[(#DESCRIPTIF|textebrut|entites_html)]">#TITRE   par exemple dans cette boucle :

 
<BOUCLE_mot_cousin(MOTS) {id_groupe} {par titre} {0,1}>
	<li class="menu-item"><a href="#URL_MOT" title="[(#DESCRIPTIF|textebrut|entites_html)]">#TITRE</a></li>
</BOUCLE_mot_cousin>


et non pas :  <li class="menu-item"><a href="#URL_MOT">#TYPE   pour pouvoir afficher les mots clés dans la langue en cours.

5b. Quand on fait des essais, prendre soin de bien « vider le cache » avant de réessayer un squelette : en ne faisant que ’recalculer la page’, le résultat peut être surprenant (mise en page complètement décalée sur la 1.7.2 au moins).

5c. Ne pas oublier de faire des mots clés et groupes de mots « multi », pour qu’ils puissent s’afficher dans les différentes langues.

5d. Les brèves ne sont pas utilisées dans le site de test. Si elles sont utilisées, faire les mêmes modifications pour les brèves que pour les articles.

FranckSG

- Mise à jour :18 novembre 2007 à 17h47min