SPIP-Contrib

SPIP-Contrib

عربي | Deutsch | English | Español | français | italiano

278 Plugins, 195 contribs sur SPIP-Zone, 44 visiteurs en ce moment

Accueil > Multilinguisme > Logo Origine Traduction > Logo d’origine de la traduction

Logo d’origine de la traduction

Balise #LOGO_ORIGINE_TRADUCTION

13 octobre 2007 – par El Murciélago – 12 commentaires

3 votes

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 :

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...

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.

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

Télécharger

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

  1. <?php
  2. function balise_LOGO_ORIGINE_TRADUCTION ($p) {
  3.  
  4. preg_match(",^LOGO_ORIGINE_TRADUCTION_([A-Z]+)(_.*)?$,i", $p->nom_champ, $regs);
  5. $type_objet = 'ARTICLE';
  6. $suite_logo = $regs[1];
  7. $id_objet = "id_".strtolower($type_objet);
  8. $_id_objet = champ_sql($id_objet, $p);
  9.  
  10. // analyser les faux filtres
  11. $flag_fichier = $flag_stop = $flag_lien_auto = $code_lien = $filtres = $align = $lien = $params = '';
  12.  
  13. if (is_array($p->fonctions)) {
  14. foreach($p->fonctions as $couple) {
  15. if (!$flag_stop) {
  16. $nom = trim($couple[0]);
  17.  
  18. // double || signifie "on passe aux vrais filtres"
  19. if ($nom == '') {
  20. if ($couple[1]) {
  21. $params = $couple[1]; // recuperer #LOGO_DOCUMENT{20,30}
  22. array_shift($p->param);
  23. }
  24. else
  25. $flag_stop = true;
  26. } else {
  27. // faux filtres
  28. array_shift($p->param);
  29. switch($nom) {
  30. case 'left':
  31. case 'right':
  32. case 'center':
  33. case 'top':
  34. case 'bottom':
  35. $align = $nom;
  36. break;
  37.  
  38. case 'lien':
  39. $flag_lien_auto = 'oui';
  40. $flag_stop = true; # apres |lien : vrais filtres
  41. break;
  42.  
  43. case 'fichier':
  44. $flag_fichier = 1;
  45. $flag_stop = true; # apres |fichier : vrais filtres
  46. break;
  47.  
  48. default:
  49. $lien = $nom;
  50. $flag_stop = true; # apres |#URL... : vrais filtres
  51. break;
  52. }
  53. }
  54. }
  55. }
  56. }
  57.  
  58. //
  59. // Preparer le code du lien
  60. //
  61. // 1. filtre |lien
  62. if ($flag_lien_auto AND !$lien)
  63. $code_lien = '($lien = generer_url_'.$type_objet.'('.art_ori_trad($_id_objet).')) ? $lien : ""';
  64. // 2. lien indique en clair (avec des balises : imprimer#ID_ARTICLE.html)
  65. else if ($lien) {
  66. $code_lien = "'".texte_script(trim($lien))."'";
  67. while (preg_match(",^([^#]*)#([A-Za-z_]+)(.*)$,", $code_lien, $match)) {
  68. $c = new Champ();
  69. $c->nom_champ = $match[2];
  70. $c->id_boucle = $p->id_boucle;
  71. $c->boucles = &$p->boucles;
  72. $c->descr = $p->descr;
  73. $c = calculer_champ($c);
  74. $code_lien = str_replace('#'.$match[2], "'.".$c.".'", $code_lien);
  75. }
  76. // supprimer les '' disgracieux
  77. $code_lien = preg_replace("@^''\.|\.''$@", "", $code_lien);
  78. }
  79.  
  80. if ($flag_fichier)
  81. $code_lien = "'',''" ;
  82. else {
  83. if (!$code_lien)
  84. $code_lien = "''";
  85. $code_lien .= ", '". $align . "'";
  86. }
  87.  
  88.  
  89. $p->code = "affiche_logos(calcule_logo('$id_objet', '" .
  90. (($suite_logo == '_SURVOL') ? 'off' :
  91. (($suite_logo == '_NORMAL') ? 'on' : 'ON')) .
  92. "', art_ori_trad($_id_objet)," .
  93. (($suite_logo == '_RUBRIQUE') ?
  94. champ_sql("id_rubrique", $p) :
  95. (($type_objet == 'RUBRIQUE') ? "sql_parent(art_ori_trad($_id_objet))" : "''")) .
  96. ", '$flag_fichier'), $code_lien)";
  97.  
  98. $p->interdire_scripts = false;
  99. return $p;
  100. }
  101. ?>

Télécharger

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 :

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 :

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.

Retour en haut de la page

Tout afficher

Vos commentaires

  • Le 4 février 2010 à 21:39, par FabriceN En réponse à : Logo d’origine de la traduction

    Très intéressante contribution ! merci !

    je me demande s’il serait facile de modifier le code pour faire appel à la balise #LOGO_ARTICLE_RUBRIQUE de l’article d’origine plutôt qu’à LOGO_ARTICLE.

    Je constate par ailleurs que les derniers messages ici sont anciens. Est-ce que SPIP ou un plug-in aurait déjà intégré ceci ?

    Merci.

    Répondre à ce message

  • Le 22 avril 2008 à 12:29, par Léo. En réponse à : Logo d’origine de la traduction

    Petite précision pour les néophytes, le fichier mes_options.php est à créer, s’il n existe pas, dans le dossier /squelettes ;)

    Répondre à ce message

  • Le 22 octobre 2007 à 15:12, par Joseph En réponse à : A insérer dans le couteau suisse

    Voilà une contrib fort intéressante. Elle aurait, me semble-t-il, toute sa place dans le couteau suisse.

    • Le 22 octobre 2007 à 22:04, par El Murciélago En réponse à : A insérer dans le couteau suisse

      Pourquoi pas... mais il faudrait règler cette histoire de « _SURVOL » avant, me semble-t-il...

    • Le 23 octobre 2007 à 17:11, par Joseph En réponse à : A insérer dans le couteau suisse

      Au début de la fonction balise_LOGO_ORIGINE_TRADUCTION le preg_match ne devrait-il pas être :
      preg_match(",^LOGO_ORIGINE_TRADUCTION([A-Z]+)(_.*)?$,i", $p->nom_champ, $regs); sans underscore (_) après LOGO_ORIGINE_TRADUCTION ?

      En effet, s’il y a un _ après LOGO_ORIGINE_TRADUCTION, alors $suite_logo devrait être égal à SURVOL et non à _SURVOL. Or le test réalisé à la fin de la fonction porte sur _SURVOL.

      En fait, il semble que cela devrait être plus précisément preg_match(",^LOGO_ORIGINE_TRADUCTION(_.*)?$,i", $p->nom_champ, $regs); sur le modèle de la recherche qui est fait

    • Le 24 octobre 2007 à 21:28, par El Murciélago En réponse à : A insérer dans le couteau suisse

      Je pense comme vous que le problème vient du « preg_match » et j’ai tenté quelques variantes sans succès.

      Vos propositions semblent pertinentes pour autant que je puisse en juger, mais lorsque je les teste elles ne permettent pas davantage de récupérer le logo de survol...

      J’avoue que cela me laisse de plus en plus perplexe.

    • Le 25 octobre 2007 à 11:51, par Joseph En réponse à : A insérer dans le couteau suisse

      Avez-vous fait un test pour vérifier ce que renvoie le preg_match ?

    • Le 29 novembre 2007 à 22:52, par El Murciélago En réponse à : A insérer dans le couteau suisse

      (Désolé pour le délai...)

      En fait le preg_match ne renvoie rien... et pour cause.

      Après quelques tests, je me suis aperçu que la fonction balise_LOGO_ORIGINE_TRADUCTION n’est pas appelée par les balises avec options du genre #LOGO_ORIGINE_TRADUCTION_SURVOL. C’est pourquoi aucun logo ne s’affiche plus lorsqu’on rajoute une suite...

      Corollaire : si on créé en plus de la fonction balise_LOGO_ORIGINE_TRADUCTION une fonction balise_LOGO_ORIGINE_TRADUCTION_SURVOL contenant le même code tout rentre effectivement dans l’ordre avec l’affichage du logo de survol de l’article de référence...

      Donc : comment faire pour que les balises de type #LOGO_ORIGINE_TRADUCTION_XXX soient aussi traitées par la fonction balise_LOGO_ORIGINE_TRADUCTION... (et non par la fonction par défaut des logos calculer_balise_logo_dist qui ne sait pas les traiter) ?

    Répondre à ce message

  • Le 15 octobre 2007 à 12:49, par Le renard En réponse à : Logo d’origine de la traduction

    Bonjour,
    très intéressant cet article. Merci. Y a-t-il un moyen d’en fair autant avec les documents liés à un article ?
    Merci.

    • Le 22 octobre 2007 à 22:09, par El Murciélago En réponse à : Logo d’origine de la traduction

      Oui, enfin ça dépend de ce que vous voulez faire...

      Si vous souhaitez récupérer les documents joints à l’article de référence dans les différentes traductions, il suffit d’utiliser le critère origine_traduction.

      Si vous souhaitez modifier des informations concernant ces documents en fonction du contexte de l’article traduit, il faudra sans doute quelque chose de plus pointu voire ré-écrire une balise sur le type de celle-ci...

    Répondre à ce message

Répondre à cet article

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 Les choses à faire avant de poser une question (Prolégomènes aux rapports de bugs. )
Ajouter un document

Retour en haut de la page

Ça discute par ici

  • Groupes de mots clés arborescents

    26 juillet 2012 – 14 commentaires

    Ce plugin permet de gérer une arborescence de groupes de mots clés. Les sous groupes de mots héritent des propriétés du groupe racine (sur quoi peut on le lier ? peut il y avoir un ou plusieurs mots). Les formulaires de liens qui permettent de lier (...)

  • Afficher les articles en entier ou en résumé selon leur nombre dans une rubrique

    22 octobre 2006 – commentaires

    Selon le contenu de rubrique, afficher les articles dans leurs intégralités (si 1 seul article dans la rubrique) ou leurs résumés (si plusieurs articles). Cette boucle peut être donc pratique pour réaliser le squelette d’un site contenant beaucoup de (...)

  • Afficher les données EXIF des images

    12 mai 2008 – commentaires

    Plugin pour disposer le la balise EXIF pour SPIP 1.9.2 et squelette EXIF pour afficher les données de l’appareil photo.

  • Dépublication

    16 décembre 2010 – 80 commentaires

    Parfois des articles n’ont plus d’intérêt à une date donnée et vous souhaitez programmer leur dépublication pour qu’elle s’effectue automatiquement. Vous pouvez aussi renseigner une date d’expiration des droits d’un auteur. A la date donnée, (...)

  • Rechercher remplacer

    17 octobre 2011 – commentaires

    Ce plugin permet de simplement rechercher une chaine dans les champs textes de la base de donnée, et éventuellement de la remplacer par une autre chaine. Cet outil peut servir tant à l’administrateur d’un site, qu’à son rédacteur en chef. (...)