Logo d’origine de la traduction

Balise #LOGO_ORIGINE_TRADUCTION

Une balise pour récupérer le logo de l’article de référence

La problématique dans le cadre d’un site multilingue

Dans le cadre d’un site multilingue, il est fréquent qu’un article et ses traductions aient le même logo. Il est particulièrement fastidieux, surtout lorsque le nombre de langues augmente, d’associer à chaque article et à ses traductions ce même logo, puis d’assurer les mises à jour redondantes lorsque ce logo est modifié. Il est donc naturel d’espérer pouvoir utiliser un seul et même logo, celui de l’article d’origine (ou de référence) pour tous les articles traduits.

Des solutions à ce type de demande ont été mentionnées dans la contribution Récupérer le logo de l’article d’origine - site multilingue. Ces solutions reviennent en général à proposer une variante de la boucle suivante :

<BOUCLE_logo_origine_traduction(ARTICLES){traduction}{origine_traduction 
}>
  [(#LOGO_ARTICLE_RUBRIQUE)]})]
 </BOUCLE_logo_origine_traduction>

Cette boucle fonctionne bien si on souhaite simplement afficher le logo. Dès qu’on souhaite insérer une balise « title » ou « alt » ou encore associer un lien vers l’article traduit au logo, cette solution ne fonctionne plus. En effet, lors de l’appel du logo, nous nous trouvons dans le contexte de l’article de référence et non plus dans celui de l’article traduit.

Ainsi, si l’on souhaite faire apparaître le logo de l’article de référence tout en renvoyant vers l’article traduit, on serait tenté d’utiliser la boucle suivante qui malheureusement fournira les balises « title » et « alt » de l’article de référence et non de l’article traduit et, plus ennuyeux, en cliquant sur le logo on sera dirigé vers l’article de référence au lieu de sa traduction...

<BOUCLE_logo_origine_traduction(ARTICLES){traduction}{origine_traduction 
}>
  [(#LOGO_ARTICLE_RUBRIQUE|left|#URL_ARTICLE|image_reduire{75,75}
   |inserer_attribut{alt,[(#TITRE|textebrut)]}
   |inserer_attribut{title,[(#SOUSTITRE|textebrut)]}
   )]
 </BOUCLE_logo_origine_traduction>

Solution proposée : création d’une nouvelle balise #LOGO_ORIGINE_TRADUCTION

Pour créer cette nouvelle balise, je suis reparti du code php de traitement des logos fourni dans la distribution de SPIP (fichier ecrire/public/balises.php) et je me suis aidé du tutoriel Balise #TITRE_PARENT.

Dans le fichier mes_fonctions.php, vous devez recopier la fonction suivante qui associe, à un article traduit, l’article de référence.

<?php
function art_ori_trad($id_article) {
     /* par precaution, on verifie que le parametre est une valeur numerique entiere, */
    if(!($id_article = intval($id_article))) return $id_article;
    /* on redige puis on execute la requete pour la base de donnees */
    $q = 'SELECT id_trad FROM spip_articles WHERE id_article='.$id_article;
    if($r = spip_query($q))
        /* si cette requete renvoie un resultat pour le champ demande, on le retourne */
        if($row = mysql_fetch_array($r))
		if($row['id_trad']==0)
			return $id_article; // s'il n'y a pas de traduction l'article de reference est lui-meme
		else
			return $row['id_trad'];
    /* sinon, on renvoie la chaine de depart */
    return $id_article;
}
?>

Toujours dans le fichier mes_fonctions.php, vous devez ensuite définir la nouvelle balise #LOGO_ORIGINE_TRADUCTION.

<?php
function balise_LOGO_ORIGINE_TRADUCTION ($p) {

	preg_match(",^LOGO_ORIGINE_TRADUCTION_([A-Z]+)(_.*)?$,i", $p->nom_champ, $regs);
	$type_objet = 'ARTICLE';
	$suite_logo = $regs[1];	
	$id_objet = "id_".strtolower($type_objet);
	$_id_objet = champ_sql($id_objet, $p);

	// analyser les faux filtres
	$flag_fichier = $flag_stop = $flag_lien_auto = $code_lien = $filtres = $align = $lien = $params = '';

	if (is_array($p->fonctions)) {
		foreach($p->fonctions as $couple) {
			if (!$flag_stop) {
				$nom = trim($couple[0]);

				// double || signifie "on passe aux vrais filtres"
				if ($nom == '') {
					if ($couple[1]) {
						$params = $couple[1]; // recuperer #LOGO_DOCUMENT{20,30}
						array_shift($p->param);
					}
					else
						$flag_stop = true;
				} else {
					// faux filtres
					array_shift($p->param);
					switch($nom) {
						case 'left':
						case 'right':
						case 'center':
						case 'top':
						case 'bottom':
							$align = $nom;
							break;
						
						case 'lien':
							$flag_lien_auto = 'oui';
							$flag_stop = true; # apres |lien : vrais filtres
							break;

						case 'fichier':
							$flag_fichier = 1;
							$flag_stop = true; # apres |fichier : vrais filtres
							break;

						default:
							$lien = $nom;
							$flag_stop = true; # apres |#URL... : vrais filtres
							break;
					}
				}
			}
		}
	}

	//
	// Preparer le code du lien
	//
	// 1. filtre |lien
	if ($flag_lien_auto AND !$lien)
		$code_lien = '($lien = generer_url_'.$type_objet.'('.art_ori_trad($_id_objet).')) ? $lien : ""';
	// 2. lien indique en clair (avec des balises : imprimer#ID_ARTICLE.html)
	else if ($lien) {
		$code_lien = "'".texte_script(trim($lien))."'";
		while (preg_match(",^([^#]*)#([A-Za-z_]+)(.*)$,", $code_lien, $match)) {
			$c = new Champ();
			$c->nom_champ = $match[2];
			$c->id_boucle = $p->id_boucle;
			$c->boucles = &$p->boucles;
			$c->descr = $p->descr;
			$c = calculer_champ($c);
			$code_lien = str_replace('#'.$match[2], "'.".$c.".'", $code_lien);
		}
		// supprimer les '' disgracieux
		$code_lien = preg_replace("@^''\.|\.''$@", "", $code_lien);
	}

	if ($flag_fichier)
		$code_lien = "'',''" ; 
	else {
		if (!$code_lien)
			$code_lien = "''";
		$code_lien .= ", '". $align . "'";
	}


		$p->code = "affiche_logos(calcule_logo('$id_objet', '" .
			(($suite_logo == '_SURVOL') ? 'off' : 
			(($suite_logo == '_NORMAL') ? 'on' : 'ON')) .
			"', art_ori_trad($_id_objet)," .
			(($suite_logo == '_RUBRIQUE') ? 
			champ_sql("id_rubrique", $p) :
			(($type_objet == 'RUBRIQUE') ? "sql_parent(art_ori_trad($_id_objet))" : "''")) .
			",  '$flag_fichier'), $code_lien)";

	$p->interdire_scripts = false;
	return $p;
}
?>

Exemples d’utilisation de la nouvelle balise #LOGO_ORIGINE_TRADUCTION

La nouvelle balise s’utilise comme une balise #LOGO_ARTICLE. En particulier l’ensemble des filtres utilisés sur ce type de balise semblent s’appliquer correctement.

Si on souhaite simplement afficher le logo de l’article de référence dans le contexte de l’article traduit, il suffit d’utiliser la balise seule en remplacement de la boucle indiquée plus haut.
[(#LOGO_ORIGINE_TRADUCTION)]

Dans le contexte de l’article traduit, on peut maintenant sans problème afficher le logo de l’article de référence tout en lui associant des données de l’article traduit. Par exemple :

[(#LOGO_ORIGINE_TRADUCTION|left|#URL_ARTICLE|image_reduire{80}
|inserer_attribut{alt,[(#TITRE|textebrut)]}						|inserer_attribut{title,[(#SOUSTITRE|textebrut)]}
)]

On peut même créer un menu qui liste les articles d’une rubrique donnée dans une langue donnée en faisant apparaitre le logo de l’article ou, s’il n’en a pas, celui de l’article de référence, tout en leur associant les données de l’article traduit. Par exemple avec la boucle suivante utilisant notre nouvelle balise :

<BOUCLE_rubrique_menu_sommaire(RUBRIQUES) {id_rubrique}>
<B_articles_rubrique>
[<h1>(#TITRE)</h1>]			<BOUCLE_articles_rubrique(ARTICLES){id_rubrique}{lang}{!par date}>
[(#LOGO_ARTICLE_RUBRIQUE|left|#URL_ARTICLE|image_reduire{80}
|inserer_attribut{alt,[(#TITRE|textebrut)]}
|inserer_attribut{title,[(#SOUSTITRE|textebrut)]}
|sinon{[(#LOGO_ORIGINE_TRADUCTION|left|#URL_ARTICLE|image_reduire{80}
	|inserer_attribut{alt,[(#TITRE|textebrut)]}
	|inserer_attribut{title,[(#SOUSTITRE|textebrut)]}
)]})]
<h2><a href="#URL_ARTICLE">#TITRE</a></h2>
</BOUCLE_articles_rubrique>
</B_articles_rubrique>
</BOUCLE_rubrique_menu_sommaire>

Limitation : pas de gestion du survol

Pour le moment, il n’est pas possible de gérer ainsi le logo de survol. Ainsi la balise #LOGO_ORIGINE_TRADUCTION_SURVOL ne fonctionne pas. Si une personne peut apporter une aide, elle sera la bienvenue.

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