[Résolu] Préparation d’un site multilingue

Bonjour,

Comme je vais probablement créer un petit site multilingue, j’ai décidé de me préparer en local pour cela.

Configuration de l’administration
J’ai installé un SPIP avec la dernière version, configuré en français par défaut et en UTF-8. Ensuite, je suis allé dans /ecrire/langues, où j’ai activé toutes les options sauf Articles : activer le menu langue. Enfin, j’ai ajouté l’anglais comme langue supplémentaire.

J’ai ensuite créé trois rubriques contenant plusieurs articles.

  • Pour les titres des rubriques, j’ai utilisé les « multi ».
  • Pour les articles, j’ai utilisé la fonction Écrire une nouvelle traduction, qui génère une copie de l’article original dans un nouvel article. Il ne me reste plus qu’à traduire le texte, et j’adore cette façon de faire !
  • J’ai également utilisé les multi pour les légendes des images.

Mise en place dans les squelettes
Dans le footer, j’ai ajouté #MENU_LANG afin de gérer le changement de langue.
Pour sommaire.html, ça a été un peu compliqué. Finalement, j’ai créé un fichier sommaire.en.html, dans lequel j’ai ajouté un code provisoire :
<a href="#URL_PAGE{sommaire.en,lang=en}">Homepage in English</a>
J’ai fait l’inverse pour le français, et cela fonctionne bien.
J’ai aussi ajouté dans mes squelettes et ma navigation ce code : Langue actuelle : #ENV{lang}
Cela me permet de vérifier la langue en cours sur ma page.

Problèmes rencontrés

  • Navigation manquante en anglais !
  • Quand je passe en EN, ma navigation n’apparaît pas. Voici ma boucle de navigation :
<BOUCLE_nav(RUBRIQUES){!id_rubrique=1}{par num titre}{lang}>
<a href="#URL_RUBRIQUE" {lang=#ENV{lang}}>[(#TITRE)]</a>
</BOUCLE_nav>
  • Comment ajouter le paramètre de langue dans mes INCLURE ou dans mes liens internes ?

<INCLURE{fond=inclure/nav} />

  • Est-il possible d’ajouter du multi dans une balise #TITRE, par exemple avec une syntaxe comme :

[(#TITRE|multi)]

Merci d’avance pour vos réponses ! :blush:

Salut,

Il y a plein de façon de faire un site multi langues. Ca va de quelques articles traduits, à toute l’arborescence traduite en «miroir». Tout dépend de ce que tu cherches à obtenir.
Faire passer un contexte de langue dans tes inclures, c’est simple :
<INCLURE{fond=inclure/nav, env} /> // voire lang=x si pas de langue précise ds le contexte
<BOUCLE_nav(RUBRIQUES){!id_rubrique=1}{par num titre}{lang}>
L’objet rubrique n’a pas de lang par défaut, donc c’est normal que ça ne ressorte rien.

Un plugin le permet toutefois Interface de traduction pour objets - Plugins SPIP

Tu peux aussi démarrer avec Site multilingue facile - Plugins SPIP qui raisonne avec 1 secteur (rubrique) = 1 langue et permet de traduire rubriques et articles et les lier automatiquement.

Pour les menus de changement de langue je fais généralement un menu par objet :

  • sommaire : boucle sur les langues activées
  • rubrique : boucle sur les traductions de la rubrique choisie
  • article : boucle sur les traductions de l’article choisi
  • etc

Hello Fa_b, merci pour ton retour !

Je pense que tous les articles seront traduits, et ton idée d’une arborescence traduite en miroir est très intéressante.

Si je comprends bien, il s’agirait d’avoir une rubrique principale contenant des sous-rubriques pour chaque langue, par exemple FR et EN. Ensuite, les articles seraient répartis dans des squelettes spécifiques, nommés article.fr article.en etc.

Dans ce cas, la création de menus basés sur les objets prend tout son sens, comme tu l’as mentionné dans ton post.

C’est bien cela que tu suggères ?

Par ailleurs, le premier plugin ne fonctionne pas chez moi.

Exemple :

  • FR (rubrique appelée secteur car niveau 1)
    • Actualités (rubrique normale niveau 2)
    • etc
  • EN (rubrique appelée secteur car niveau 1)
    • News (rubrique normale niveau 2)
    • etc

J’utilise pas article.fr article.en je vois pas trop l’intérêt sauf à avoir une structure html complètement différente, genre 2 sites qui n’auraient rien à voir. La langue est dans la base article donc on sait si on a affaire à un article en anglais ou français.

Voici un exemple de menu langue pour article :

[(#REM) CONTEXTE = PAGE ARTICLE]

<BOUCLE_article(ARTICLES){id_article}>
<ul class="menu">
  <BOUCLE_traduction_article(ARTICLES){traduction}>
    [(#EXPOSE|?{
        <li class="#LANG"><span class="active">#LANG</span></li>
      ,
        <li class="#LANG"><a href="#URL_ARTICLE">#LANG</a></li>
    })]
  </BOUCLE_traduction_article>
</ul>
</BOUCLE_article>

Pour une page sommaire :


  <ul class="menu">
    <BOUCLE_sommaire_traduction(DATA){source table, #CONFIG{langues_multilingue}|explode{','}}>
      [(#ENV{lang}|=={#VALEUR}|?{
        <li class="#VALEUR"><span class="active">#VALEUR</span></li>
      ,
        <li class="#VALEUR"><a[ href="(#SELF|parametre_url{lang,#VALEUR})"]>#VALEUR</a></li>
      })]
    </BOUCLE_sommaire_traduction>
  </ul>

Tu noteras ds ce dernier le #ENV{lang} qui sous-entend que ce code est dans une inclusion du type <INCLURE{fond=inclure/menu-sommaire,env}>

Oulala, ça c’est d’la boucle ! :astonished:
Merci pour le partage. Je vais m’inspirer de ton code… enfin, d’abord essayer de bien comprendre son fonctionnement !
Je vais aussi revoir la hiérarchie de mes rubriques dans l’admin.
Encore merci ! Je te tiendrai au courant ici.

Hello Fab,

Merci pour tes codes, je les ai intégrés sur mes pages sommaire et article.

Concernant le reste, je me suis trompé : il y a en fait deux langues en plus du français.
Voici quelques points que je n’arrive pas à résoudre :

  • J’aimerais que le site s’affiche directement dans la langue du visiteur dès son arrivée. J’ai essayé d’ajouter dans config/mes_options.php :
    $GLOBALS['forcer_lang'] = true; mais cela ne fonctionne pas.

  • Actuellement, la langue change de manière aléatoire lorsqu’on navigue d’une page à l’autre. Peut-être y a-t-il un souci avec les inclusions (inclure) ? J’aimerais que la langue sélectionnée reste la même tout au long de la navigation.

  • Mon site est structuré en trois secteurs : FR, EN et IT. La navigation reflète ces rubriques. J’écris les articles dans les rubriques du secteur FR, puis je réalise les traductions au même endroit. Résultat : les rubriques des secteurs EN et IT sont vides, et leurs menus de navigation n’apparaissent pas sur le site public.
    Existe-t-il un moyen d’afficher des rubriques même si elles ne contiennent pas d’articles ?

  • Penses-tu qu’il serait possible, en modifiant tes codes, d’ajouter une image (par exemple un drapeau) pour représenter chaque langue ? Idéalement, le drapeau de la langue actuellement sélectionnée ne devrait pas s’afficher.

Merci

Alors, je n’ai pas encore testé :
Mais est-ce qu’on peut placer des images de drapeaux dans un dossier flags, par exemple, dans le répertoire IMG ? Chaque image porterait le nom abrégé des pays, comme fr.png, en.png et it.png.

Et est-ce que je peux modifier ton code comme ceci ?

<ul class="menu">
  <BOUCLE_sommaire_traduction(DATA){source table, #CONFIG{langues_multilingue}|explode{','}}>
    [(#ENV{lang}|=={#VALEUR}|?{
      <li class="#VALEUR">
        <span class="active">
          <img src="IMG/flags/#VALEUR.png" alt="#VALEUR" />
        </span>
      </li>
      ,
      <li class="#VALEUR">
        <a href="(#SELF|parametre_url{lang,#VALEUR})">
          <img src="IMG/flags/#VALEUR.png" alt="#VALEUR" />
        </a>
      </li>
    })]
  </BOUCLE_sommaire_traduction>
</ul>

Je ne suis pas chez moi, donc je n’ai pas pu tester.

On estime chez SPIP que les drapeaux pour signaler les langues ça n’est pas une bonne idée.

Rien que pour le français déjà ça ne fonctionne pas : en effet il y a des pays francophones dont le drapeau n’est pas le drapeau français. C’est donc assez déplacé de faire cliquer les gens concernés sur un drapeaux français.

Mais il y a d’autres cas plus problématiques encore :

  • les entités qui n’ont pas d’état avec drapeaux,
  • les gens qui parlent la même langue mais dont les pays sont en guerre les uns contre les autres,
  • les pays où l’on parle plusieurs langues (Belgique, Suisse…),
  • etc…

Bref, bien souvent la langue dépasse les nations et il est conseillé d’utiliser les codes ISO pour les langues.

forcer_lang j’ai jamais trop chercher à l’utiliser, je ne sais pas trop comment ça fonctionne. En tout cas pour la langue du navigateur ya des plugins qui font ça sans doute très bien, voire lien de @RealET

Le côté aléatoire vient sans doute de contexte de langue, tu peux avoir une langue d’interface, une langue dans une boucle et une autre langue dans une autre boucle, tout ça sur la même page.
#LANG dans un contexte de boucle ne sortira pas forcément la même chose hors contexte. N’hesite pas à coller des #LANG témoins un peu partout (avant une inclusion, hors boucle, dans une boucle)

Quand je disais que rubrique n’avait pas de langue c’est vrai mais faux aussi :wink: Un plugin peut lui donner ce pouvoir :wink: J’utilise Interface de traduction pour objets - SPIP-Contrib comme indiqué dans la 1ère réponse. Ce qui me permet de faire des boucles dans l’objet rubrique sous cette forme :

[(#REM) CONTEXTE = RUBRIQUE]

<BOUCLE_rubrique(RUBRIQUES){id_rubrique}>
<ul class="menu">
  <BOUCLE_traduction_rubrique(RUBRIQUES){traduction}>
    [(#EXPOSE|?{
        <li class="#LANG"><span class="active">#LANG</span></li>
      ,
        <li class="#LANG"><a href="#URL_RUBRIQUE">#LANG</a></li>
    })]
  </BOUCLE_traduction_rubrique>
</ul>
</BOUCLE_rubrique>

Exactement sur le même modèle que articles. Ce qui amène à la remarque suivante : chaque sous-rubrique contient son article de langue. Tu n’es pas obligé de ranger tes traductions sous le même dossier. C’est même recommandé si tu veux activer tes rubriques. Comme tu l’as remarqué une rubrique vide ne s’affiche pas.

Et si tu ne veux pas afficher la langue choisie, tu peux cacher avec du css

.menu .active {display:none}

avec l’exemple ci-dessus ou bien modifier le code et mettre une autre condition du type

[(#EXPOSE|non)
   <li class="#LANG"><a href="#URL_RUBRIQUE">#LANG</a></li>
]

ou bien (même mieux) ajouter un critère dans la boucle :

  <BOUCLE_traduction_rubrique(RUBRIQUES){traduction}{!id_rubrique}
                                                     ^

(économie de ressources)

Merci à vous deux, grâce à vous, j’ai réussi à obtenir ce que je voulais avec SPIP.

1 « J'aime »

J’ai passé en résolu.
Par curiosité, quelle solution retenue des propositions diverses ?

Bonjour Jack31,
Oui, bien sûr ! J’ai fait un patchwork des conseils donnés ici.
En gros, j’ai pris en compte les remarques et propositions de Fa_b et RealET.
J’ai principalement opté pour les plugins AutoLang, Menu de langues avec liens, et, du coup, SPIP Bonux.
Pour le squelette sommaire et ma navigation, j’ai choisi d’utiliser une BOUCLE (CONDITION) suivant le contexte de langue.

:blush: Merci !