Multilinguisme Non structuré

Attention, cette contribution est EN CHANTIER : elle n’est peut-être pas fonctionnelle.

Une approche de site multilingue sans découpage en secteur langue

Contexte

  • Un site mutilinge jouant sur les traductions d’articles et non pas un secteur = une langue
  • Une langue principale (le français chez moi) dans laquelle existent tous les articles...
  • Un processus de traduction anarchique : tous les articles ne sont pas traduits, certains sont dans toutes les langues, d’autres ne sont traduits que dans quelques langues...
  • Une navigation basée sur des rubriques/sous rubriques qui peuvent ne contenir qu’un seul article (et ses traductions potentielles) ou plusieurs articles fondamentalement différents.

Objectifs

Lister les articles d’une rubrique :

  • si la rubrique ne contient qu’un seul article traduit ou non, on affiche un lien dirigeant vers l’article, sinon vers la rubrique.
  • en utilisant si possible l’article dans la langue du visiteur (possibilité que tous les articles ne soit pas traduits)
  • en affichant sinon l’article original
  • en gardant l’ordre d’affichage choisit (par num titre, titre ou date)...

Eléments SPIP à connaitre - Quelques Balises

Générales

  • #URL_ARTICLE
  • #URL_RUBRIQUE
  • #TITRE
  • #ANCRE_PAGINATION
  • #PAGINATION

Spécifiques au multilinguisme

  • #LANG
  • #ENV{lang}

Eléments SPIP à connaitre - Critères de boucle

Généraux

  • {id_article}
  • {id_rubrique}
  • {par XXX}
  • {unique}
  • {id_parent}
  • {0,1}
  • {1,1}

Spécifiques au multilinguisme

  • {origine_traduction}
  • {traduction}
  • {lang=XXX}

Réalisation étape 1 : Boucle ultra de base qui liste tous les articles de la rubrique

<BOUCLE_articles(ARTICLES) {id_rubrique} {par num titre, titre}>
	<li><a href="#URL_ARTICLE">[(#TITRE|supprimer_numero)]</a></li>
</BOUCLE_articles>

Réalisation étape 2 : Jouer un peu avec les langues

Page du manuel :
http://www.spip.net/fr_article2124.html

<BOUCLE_articles(ARTICLES){id_rubrique}{par num titre, titre}>
	<B_traductions>
	[(#REM) On affiche toutes les versions de l'article en question]
	<BOUCLE_traductions(ARTICLES){traduction}>
		[(#REM) On affiche toutes les versions de l'article en question]
		<BOUCLE_artdansnotrelangue(ARTICLES){id_article}{lang=#ENV{lang}}{unique}>
		<li><a href="#URL_ARTICLE">[(#TITRE|supprimer_numero)]</a></li>
		</BOUCLE_artdansnotrelangue>
	</BOUCLE_traductions>
	</B_traductions>
	[(#REM) Si l'article en question n'a aucune traduction on affiche la version originale]
	<li><a href="#URL_ARTICLE">[(#TITRE|supprimer_numero)]</a></li>
	<//B_traductions>
</BOUCLE_articles>

Réalisation étape 3 : Rajouter pour info si l’article n’est pas dans notre langue, sa langue d’origine

<ul>
	<BOUCLE_articles(ARTICLES) {id_rubrique} {par num titre, titre}>
		[(#REM) On affiche la version de l'article qui existe dans notre langue]
		<BOUCLE_traductions(ARTICLES){traduction}{lang}{unique}>
			<li><a href="#URL_ARTICLE">[(#TITRE|supprimer_numero)]</a></li>
		</BOUCLE_traductions>
					
		[(#REM) Si l'article n'a aucune version dans notre langue mais est traduit quand même, on affiche le titre original et les liens vers les différentes versions]
		<BOUCLE_danslanguedorigine(ARTICLES){id_article}{origine_traduction}>
			<li>[(#TITRE|supprimer_numero)]
			<BOUCLE_traductions_sansnotrelangue(ARTICLES){traduction}{' | '}>
			<a href="#URL_ARTICLE"[ hreflang="(#LANG|=={#ENV{lang}}|?{'', #LANG})" title="[(#LANG|traduire_nom_langue)]"]>[(#LANG|=={#ENV{lang}}|?{'', #LANG})]</a>
			</BOUCLE_traductions_sansnotrelangue>
			</li>
		</BOUCLE_danslanguedorigine>

		[(#REM) Si l'article n'a aucune traduction, il n'a qu'une seule version]
		<BOUCLE_articlefinal(ARTICLES){id_article}{id_trad=0}>
			[(#REM) Si la langue de l'article n'est pas la notre on affiche le titre sivi de la langue qui fait guise de lien]
			[(#LANG|=={#ENV{lang}}|?{'',' '})<li>[(#TITRE|supprimer_numero)] | <a href="#URL_ARTICLE"[ hreflang="(#LANG|=={#ENV{lang}}|?{'', #LANG})" title="[(#LANG|traduire_nom_langue)]"]>[(#LANG)]</a></li>]
			[(#REM) Si la langue de l'article est la notre on affiche directement le lien]
			[(#LANG|=={#ENV{lang}}|?{' ',''})<li><a href="#URL_ARTICLE">[(#TITRE|supprimer_numero)]</a></li>]
		</BOUCLE_articlefinal>

		<//B_traductions>
	</BOUCLE_articles>
</ul>

Réalisation étape 4 :

Pour une boucle ARTICLES c’est ok... Maintenant on veut afficher une boucle des sous rubriques et, s’il n’existe qu’un seul et unique article dans la sous rubrique, on affiche l’article dans notre langue. S’il n’existe pas on affiche l’article d’origine.

<B_rubriques_enfants>
<div class="liste_elements">
	#ANCRE_PAGINATION
	<h2 class="invisible"><:rubriques_rubrique:></h2>
	<ul class="liste_rub">
		<BOUCLE_rubriques_enfants(RUBRIQUES){id_parent}{par num titre, titre}{pagination}>

			[(#REM) Plus d'un article traduit]
			<BOUCLE_rubriques_plusdun_enfant_traduit(ARTICLES){id_rubrique}{origine_traduction}{1,1}>
			<li><a href="[(#URL_RUBRIQUE)]">[(#_rubriques_enfants:TITRE|supprimer_numero)]</a></li>
			</BOUCLE_rubriques_plusdun_enfant_traduit>

			[(#REM) Un seul article traduit]
			<BOUCLE_rubriques_unseul_enfant_traduit(ARTICLES){id_rubrique}{origine_traduction}{0,1}>
				
				[(#REM) On affiche seulement celui de notre langue]
				<BOUCLE_rubriques_unseul_enfants_orig_lang(ARTICLES){traduction}{lang=#ENV{lang}}>
				<li><a href="[(#URL_ARTICLE)]">[(#_rubriques_enfants2:TITRE|supprimer_numero)]</a></li>
				</BOUCLE_rubriques_unseul_enfants_orig_lang>

			</BOUCLE_rubriques_unseul_enfant_traduit>

				[(#REM) Si cet article a été traduit mais n'existe pas dans notre langue, on affiche l'original]
				<li><a href="[(#URL_ARTICLE)]">[(#_rubriques_enfants2:TITRE|supprimer_numero)]</a>[ | (#LANG|=={#ENV{lang}}|?{'', #LANG})]</li>
			<//B_rubriques_unseul_enfant_traduit>
			
			[(#REM) Des articles non traduits]
			<BOUCLE_rubriques_plusdun_enfant(ARTICLES){id_rubrique}{1,1}>
			<li><a href="[(#URL_RUBRIQUE)]">[(#_rubriques_enfants:TITRE|supprimer_numero)]</a></li>
			</BOUCLE_rubriques_plusdun_enfant>
			
			[(#REM) Un seul et unique article dans la rubrique, donc non traduit]
			<BOUCLE_rubriques_unseul_enfant(ARTICLES){id_rubrique}{0,1}>
			<li><a href="[(#URL_ARTICLE)]">[(#_rubriques_enfants:TITRE|supprimer_numero)]</a>[ | (#LANG|=={#ENV{lang}}|?{'', #LANG})]</li>
			</BOUCLE_rubriques_unseul_enfant>

			[(#REM) Dernière possibilité : aucun article directement dans la rubrique)]
			<li><a href="[(#URL_RUBRIQUE)]">[(#_rubriques_enfants:TITRE|supprimer_numero)]</a></li>

			[(#REM) On ferme les boucles]
			<//B_rubriques_unseul_enfant>
			<//B_rubriques_plusdun_enfant>
			<//B_rubriques_unseul_enfant_traduit>
			<//B_rubriques_plusdun_enfant_traduit>

		</BOUCLE_rubriques_enfants>
	</ul>
	[<p class="pagination">(#PAGINATION)</p>]
</div>
</B_rubriques_enfants>

Exemple d’utilisation de cette dernière boucle : http://lx5.sklunk.net/spip.php?rubrique21

Le gadget : mettre en place un transfert automatique vers la langue du navigateur

En fonction de la « politique éditoriale » du site, il peut être utile de mettre en place un processus qui permette la détection de la langue principale du navigateur (paramètre $_SERVER[’HTTP_ACCEPT_LANGUAGE’] de php) et la bascule automatique de la page dans cette langue.
Cette bascule se fera en utilisant la fonction redirige_par_entete() de spip et sera donc « transparente » pour l’internaute. Si par hasard la langue sur laquelle il est redirigé ne lui convient pas, il aura toujours la possibilité de revenir « manuellement » à la langue de son choix.

Pour cela vous pouvez procéder de la manière suivante :

  • en début de vos squelettes (obligatoirement avant toute sortie html) mettre cette balise :
    [(#CONFIG{langues_utilisees}|detecte_langue{#SELF})]
  • dans votre fichier mes_fonctions.php ou mes_options.php, vous devez ajouter le filtre detecte_langue avec un code du style :
    function detecte_langue($langues, $url_encours) {
        if (!$_COOKIE['spip_lang']) {
          // récupérer le tableau des langues utilisées dans le site
            $tab_langues = explode(",",$langues);
          // traiter (dans l'ordre !) les langues acceptées par le navigateur
            $Tlangues_brutes = split(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
            foreach ($Tlangues_brutes as $l) {
              // ne garder que le code de pays à 2 lettres pour les valeurs de langues
              // (exemple de code langue renvoyé par le navigateur : 
              // es,de-de;q=0.9,ca;q=0.7,fr-fr;q=0.6,en;q=0.4,fr;q=0.3,en-us;q=0.1)
                if (strpos($l, '-') !== false) {
         		    $Tl = split('-', $l);
        		    $l = $Tl[0];
                }
                if (strpos($l, ';') !== false) {
         		    $Tl = split(';', $l);
        		    $l = $Tl[0];
                }
              // si la langue en cours est utilisée dans le site, converser() vers cette langue
                if (in_array($l, $tab_langues)) {
         		    include_spip('inc/headers');
    redirige_par_entete('spip.php?action=converser&redirect='.$url_encours.'&var_lang='.$l);
                    break;
                }
            }
        }

    Exemple de site ayant ce fonctionnement opérationnel : http://overdon.fr (réglez la langue de votre navigateur à « English » comme premier choix avant votre visite).

Nota SPIP-Contrib : une contrib qui évoluera avec les travaux fait sur le site qui en est à l’origine

Discussion

Aucune discussion

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