SPIP-Contrib

SPIP-Contrib

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

286 Plugins, 197 contribs sur SPIP-Zone, 265 visiteurs en ce moment

Accueil > Multilinguisme > Structures de sites multilingues > Multilinguisme Non structuré

Multilinguisme Non structuré

17 février 2007 – par cy_altern, kent1 – commentaires

4 votes

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

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

Télécharger

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

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

  1. <BOUCLE_articles(ARTICLES){id_rubrique}{par num titre, titre}>
  2. <B_traductions>
  3. [(#REM) On affiche toutes les versions de l'article en question]
  4. <BOUCLE_traductions(ARTICLES){traduction}>
  5. [(#REM) On affiche toutes les versions de l'article en question]
  6. <BOUCLE_artdansnotrelangue(ARTICLES){id_article}{lang=#ENV{lang}}{unique}>
  7. <li><a href="#URL_ARTICLE">[(#TITRE|supprimer_numero)]</a></li>
  8. </BOUCLE_artdansnotrelangue>
  9. </BOUCLE_traductions>
  10. </B_traductions>
  11. [(#REM) Si l'article en question n'a aucune traduction on affiche la version originale]
  12. <li><a href="#URL_ARTICLE">[(#TITRE|supprimer_numero)]</a></li>
  13. <//B_traductions>
  14. </BOUCLE_articles>

Télécharger

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

  1. <ul>
  2. <BOUCLE_articles(ARTICLES) {id_rubrique} {par num titre, titre}>
  3. [(#REM) On affiche la version de l'article qui existe dans notre langue]
  4. <BOUCLE_traductions(ARTICLES){traduction}{lang}{unique}>
  5. <li><a href="#URL_ARTICLE">[(#TITRE|supprimer_numero)]</a></li>
  6. </BOUCLE_traductions>
  7.  
  8. [(#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]
  9. <BOUCLE_danslanguedorigine(ARTICLES){id_article}{origine_traduction}>
  10. <li>[(#TITRE|supprimer_numero)]
  11. <BOUCLE_traductions_sansnotrelangue(ARTICLES){traduction}{' | '}>
  12. <a href="#URL_ARTICLE"[ hreflang="(#LANG|=={#ENV{lang}}|?{'', #LANG})" title="[(#LANG|traduire_nom_langue)]"]>[(#LANG|=={#ENV{lang}}|?{'', #LANG})]</a>
  13. </BOUCLE_traductions_sansnotrelangue>
  14. </li>
  15. </BOUCLE_danslanguedorigine>
  16.  
  17. [(#REM) Si l'article n'a aucune traduction, il n'a qu'une seule version]
  18. <BOUCLE_articlefinal(ARTICLES){id_article}{id_trad=0}>
  19. [(#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]
  20. [(#LANG|=={#ENV{lang}}|?{'',' '})<li>[(#TITRE|supprimer_numero)] | <a href="#URL_ARTICLE"[ hreflang="(#LANG|=={#ENV{lang}}|?{'', #LANG})" title="[(#LANG|traduire_nom_langue)]"]>[(#LANG)]</a></li>]
  21. [(#REM) Si la langue de l'article est la notre on affiche directement le lien]
  22. [(#LANG|=={#ENV{lang}}|?{' ',''})<li><a href="#URL_ARTICLE">[(#TITRE|supprimer_numero)]</a></li>]
  23. </BOUCLE_articlefinal>
  24.  
  25. <//B_traductions>
  26. </BOUCLE_articles>
  27. </ul>

Télécharger

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.

  1. <B_rubriques_enfants>
  2. <div class="liste_elements">
  3. #ANCRE_PAGINATION
  4. <h2 class="invisible"><:rubriques_rubrique:></h2>
  5. <ul class="liste_rub">
  6. <BOUCLE_rubriques_enfants(RUBRIQUES){id_parent}{par num titre, titre}{pagination}>
  7.  
  8. [(#REM) Plus d'un article traduit]
  9. <BOUCLE_rubriques_plusdun_enfant_traduit(ARTICLES){id_rubrique}{origine_traduction}{1,1}>
  10. <li><a href="[(#URL_RUBRIQUE)]">[(#_rubriques_enfants:TITRE|supprimer_numero)]</a></li>
  11. </BOUCLE_rubriques_plusdun_enfant_traduit>
  12.  
  13. [(#REM) Un seul article traduit]
  14. <BOUCLE_rubriques_unseul_enfant_traduit(ARTICLES){id_rubrique}{origine_traduction}{0,1}>
  15.  
  16. [(#REM) On affiche seulement celui de notre langue]
  17. <BOUCLE_rubriques_unseul_enfants_orig_lang(ARTICLES){traduction}{lang=#ENV{lang}}>
  18. <li><a href="[(#URL_ARTICLE)]">[(#_rubriques_enfants2:TITRE|supprimer_numero)]</a></li>
  19. </BOUCLE_rubriques_unseul_enfants_orig_lang>
  20.  
  21. </BOUCLE_rubriques_unseul_enfant_traduit>
  22.  
  23. [(#REM) Si cet article a été traduit mais n'existe pas dans notre langue, on affiche l'original]
  24. <li><a href="[(#URL_ARTICLE)]">[(#_rubriques_enfants2:TITRE|supprimer_numero)]</a>[ | (#LANG|=={#ENV{lang}}|?{'', #LANG})]</li>
  25. <//B_rubriques_unseul_enfant_traduit>
  26.  
  27. [(#REM) Des articles non traduits]
  28. <BOUCLE_rubriques_plusdun_enfant(ARTICLES){id_rubrique}{1,1}>
  29. <li><a href="[(#URL_RUBRIQUE)]">[(#_rubriques_enfants:TITRE|supprimer_numero)]</a></li>
  30. </BOUCLE_rubriques_plusdun_enfant>
  31.  
  32. [(#REM) Un seul et unique article dans la rubrique, donc non traduit]
  33. <BOUCLE_rubriques_unseul_enfant(ARTICLES){id_rubrique}{0,1}>
  34. <li><a href="[(#URL_ARTICLE)]">[(#_rubriques_enfants:TITRE|supprimer_numero)]</a>[ | (#LANG|=={#ENV{lang}}|?{'', #LANG})]</li>
  35. </BOUCLE_rubriques_unseul_enfant>
  36.  
  37. [(#REM) Dernière possibilité : aucun article directement dans la rubrique)]
  38. <li><a href="[(#URL_RUBRIQUE)]">[(#_rubriques_enfants:TITRE|supprimer_numero)]</a></li>
  39.  
  40. [(#REM) On ferme les boucles]
  41. <//B_rubriques_unseul_enfant>
  42. <//B_rubriques_plusdun_enfant>
  43. <//B_rubriques_unseul_enfant_traduit>
  44. <//B_rubriques_plusdun_enfant_traduit>
  45.  
  46. </BOUCLE_rubriques_enfants>
  47. </ul>
  48. [<p class="pagination">(#PAGINATION)</p>]
  49. </div>
  50. </B_rubriques_enfants>

Télécharger

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 :
    1. [(#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 :
    1. function detecte_langue($langues, $url_encours) {
    2. if (!$_COOKIE['spip_lang']) {
    3. // récupérer le tableau des langues utilisées dans le site
    4. $tab_langues = explode(",",$langues);
    5. // traiter (dans l'ordre !) les langues acceptées par le navigateur
    6. $Tlangues_brutes = split(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
    7. foreach ($Tlangues_brutes as $l) {
    8. // ne garder que le code de pays à 2 lettres pour les valeurs de langues
    9. // (exemple de code langue renvoyé par le navigateur :
    10. // 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)
    11. if (strpos($l, '-') !== false) {
    12. $Tl = split('-', $l);
    13. $l = $Tl[0];
    14. }
    15. if (strpos($l, ';') !== false) {
    16. $Tl = split(';', $l);
    17. $l = $Tl[0];
    18. }
    19. // si la langue en cours est utilisée dans le site, converser() vers cette langue
    20. if (in_array($l, $tab_langues)) {
    21. include_spip('inc/headers');
    22. redirige_par_entete('spip.php?action=converser&redirect='.$url_encours.'&var_lang='.$l);
    23. break;
    24. }
    25. }
    26. }

    Télécharger

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

P.-S.

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

Dernière modification de cette page le 4 octobre 2011

Retour en haut de la page

Vos commentaires

  • Le 7 août 2015 à 11:41, par Thierry Kauffmann En réponse à : Multilinguisme Non structuré

    Bonjour,

    Merci Kent1 pour cette contrib très utile.

    Deux commentaires sur la dernière partie de cette contrib « Redirection automatique vers la langue du navigateur » :

    1- Lorsque l’on utilise que les chaînes de langues sur le site, la variable #CONFIG{langues_utilisee} ne contient que la langue principale du site. Il peut être nécessaire d’utiliser à la place #CONFIG{langues_multilingue} qui contient bien la liste des langues déclarées dans l’interface d’admin.

    2- Dans le script php, il est nécessaire de remplacer ls occurrences de split par des explode. En effet, split() est obsolète depuis PHP5.3

    Bien à vous,

    Pielo

    Répondre à ce message

  • Le 31 décembre 2007 à 14:33, par Cyril En réponse à : Multilinguisme Non structuré

    Salut Kent1

    Ton article m’a bien inspiré pour un site multilingue type « babel » (Tchendukua, ici et ailleurs).

    Il me semble que l’on peut encore simplifier la 1re boucle, de la manière suivante :
    -  on cherche tous les articles d’une rubrique
    -  pour chaque article, on vérifie s’il y a une trad dans la langue ; si oui on l’affiche. Si non, on affiche l’article d’origine.

    Voila ce que ça donne :

    Encore merci,

    A+
    Cyril

    • Le 29 octobre 2008 à 00:49, par bertrand En réponse à : bug à l’insertion d’un critère inverse

      ton exemple marche bien. quand je lui ajoute les critere {par date} et {inverse}
      lorsque je met le site en francais c’a marche
      mais lorsque je passe en langue anglaise mes articles qui sont en anglais et francais s’affiche une fois en anglais et une fois en francais.

      je ne comprend pas.

      c’a à l’air de ce comporter comme si {doublons} ne fonctionnait pas

      quelqu’un aurais déjà été confronté à ce problème ?

      a+

      <BOUCLE_chaque_article(ARTICLES){id_rubrique}{par date} {inverse} >

      l’exemple repris est celui de cyril marion posté le 31 décembre

    • Le 30 décembre 2008 à 15:45, par Aude En réponse à : bug à l’insertion d’un critère inverse

      idem quelque soit le critère indiqué (par titre, par date...)

      Aurais-tu trouver la solution ?

    • Le 16 août 2010 à 12:08, par filnug En réponse à : Multilinguisme Non structuré

      j’ai exactement le même problème décrit par bertrand !

      une idée ?

    Répondre à ce message

  • Le 4 août 2009 à 10:47, par delorimier En réponse à : Multilinguisme Non structuré

    accolade fermante manquante dans le script php pour mes_option.php.

    Répondre à ce message

  • Le 19 mars 2008 à 10:03, par Minus En réponse à : Multilinguisme Non structuré

    Merci pour cette contrib’ c’est un début qui m’aide bien pour mettre les mains dans un site multilingue.

    A tout hasard, est ce que quelqu’un aurait une idée pour organiser un site multilingue avec mettons de 3 langues où le principe serait d’afficher les articles dans la langue de navigation turc par exemple, s’il n’y a pas de trad de l’afficher en anglais de préférence en second choix, puis en dernier recours dans la langue de l’article de référence, le français.

    Si quelqu’un a une piste pour que je puisse me lancer car je vois pas trop. Merci

    Répondre à ce message

  • Le 26 mai 2007 à 03:32, par Pablo En réponse à : Multilinguisme Non structuré

    Limpide et redoutablement efficace. Excellent travail !

    • Le 21 août 2007 à 00:57, par kent1 En réponse à : Multilinguisme Non structuré

      Pardon ...

      Je n’avais jamais vu votre message et vous en remercie...

      Si d’autres cas intéressent... c’est un sujet qui m’intéresse fortement et une des principale raison pour laquelle j’ai choisi spip....

    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

  • Mailsubscribers

    16 janvier 2013 – 274 commentaires

    Ce plugin permet de gérer les inscriptions (ou abonnements) à la diffusion de contenu par email. Mailsubscribers permet de gérer les inscriptions par Opt-in simple ou double et la désinscription par URL. Ce plugin gère également plusieurs listes (...)

  • noiZetier v2

    9 novembre 2012 – 36 commentaires

    Le noiZetier offre une interface d’administration permettant d’insérer au choix des éléments modulaires de squelettes (noisettes) et de les ajouter ainsi à ses squelettes. Compatibilité La version 2 du noizetier fonctionne sous SPIP 3. Elle est (...)

  • cirr : plugin « rédacteur restreint »

    29 octobre 2010 – 60 commentaires

    Ce plugin « cirr : rédacteur restreint » permet d’affecter des rubriques aux rédacteurs et modifie les droits afin qu’un rédacteur restreint (ou un administrateur restreint) voit dans l’espace privé uniquement les rubriques qui lui sont affectées (et leur (...)

  • Un retour d’expérience d’utilisation de Formidable

    26 octobre – commentaires

    Il s’agissait de créer un formulaire d’inscription à un évènement modérer les inscriptions dans le privé publier les inscriptions dans le public Nous avons discuté de cette présentation lors de l’apéro SPIP du 15 février 2016 à la Cantine (...)

  • Métas +

    3 décembre – 14 commentaires

    Améliorez l’indexation de vos articles dans les moteurs et leur affichage sur les réseaux sociaux grâce aux métadonnées Dublin Core, Open Graph et Twitter Card. Installation Activer le plugin dans le menu dédié. Dans le panel de configuration, (...)

Ça spipe par là