Version de langue des URLs propres

Bonjour,

Comment générer un jeu d’url dans différentes versions de langue à partir d’une extraction d’un bloc multi dans le champ indiqué par table_titre ?

L’idée est de pouvoir utiliser la version de langue d’une url en fonction de l’alias du domaine d’appel (correspondant à une version de langue du site).

Je pense que ça doit être possible via un plugin, mais si quelqu’un une piste ?

Merci pour vos lumières.

Pas certain que ça réponde exactement à ta question, mais tu peux déjà t’inspirer de ce qu’on fait sur spip.net qui utilises des urls différentes en fonction du secteur de langue des articles et rubriques cf galactic_spip_net/trad.php at master - galactic_spip_net - SPIP on GIT

Sur OrientPalms, où je propose les mêmes «contenus» mais en différentes langues, en fonction du sous-nom de domaine, je gère ça assez simplement directement dans config/$mes_options.php:

$host = str_replace(":8080", "", $_SERVER["HTTP_HOST"]);

 if ($host == "orientpalms.com") $_GET["lang"] = "en";
	else if ($host == "www.orientpalms.com") $_GET["lang"] = "en";
	else if ($host == "nl.orientpalms.com") $_GET["lang"] = "nl";
	else if ($host == "el.orientpalms.com") $_GET["lang"] = "el";
	else if ($host == "fr.orientpalms.com") $_GET["lang"] = "fr";
	else if ($host == "ru.orientpalms.com") $_GET["lang"] = "ru";
	else if ($host == "ar.orientpalms.com") $_GET["lang"] = "ar";
	else if ($host == "it.orientpalms.com") $_GET["lang"] = "it";
	else if ($host == "de.orientpalms.com") $_GET["lang"] = "de";
	else if ($host == "pt.orientpalms.com") $_GET["lang"] = "pt";
	else if ($host == "zh.orientpalms.com") $_GET["lang"] = "zh";
	else if ($host == "ja.orientpalms.com") $_GET["lang"] = "ja";
	else if ($host == "tr.orientpalms.com") $_GET["lang"] = "tr";
	else if ($host == "en.orientpalms.com") $_GET["lang"] = "en";
	else if ($host == "es.orientpalms.com") $_GET["lang"] = "es";
	else if ($host == "sv.orientpalms.com") $_GET["lang"] = "sv";
	else if ($host == "ko.orientpalms.com") $_GET["lang"] = "ko";
	else if ($host == "kr.orientpalms.com") $_GET["lang"] = "ko";

(La suppression de 8080 dans mon $host, c’est parce que je suis derrière Varnish, et de mémoire, dans ce cas je récupère une valeur qui n’est pas directement la même.)

Ainsi tu as une version en anglais, en arabe, etc., des mêmes articles, rubriques, etc., selon le sous-nom de domaine utilisé.

Merci pour vos retours.

Alors, je vais essyer d’être plus précis.

Il s’agit de mon site percussionafricaine.com, qui possède cinq alias pour afficher les contenus dans différentes langues (afrikanische-percussion.com, african-percussion.net, percusion-africana.com et pêrcussioni-africane.com).

La langue est donc déterminée par l’alias utilisé (merci Arno) et l’arborescence est organisée par secteur de langues. L’arborescence du catalogue évolue peu, ce n’est donc pas gênant pour l’intégrateur de créer une rubrique et ses traductions dans les différents secteurs lorsque c’est nécessaire. Et donc, pas de problème côté url (et surtout référencement) puisqu’on a bien une url différente par version de langue.

Pour les articles (hors articles statiques), c’est différent. Il y a quotidiennement des articles de type fiche produit à créer, et ce ne serait pas pratique (ni efficace) pour l’intégrateur de se lancer dans la création d’autant d’articles que de version de langue.

D’où le choix de créer un seul article, placé dans le secteur de la langue de référence (le français) et d’utiliser des blocs pour afficher le contenu dans la bonne langue en fonction du nom de domaine.

Oui mais.

Dans ce cas, l’url propre n’est générée que dans une seule langue (malgré l’utilisation d’un bloc dans le titre).

L’idéal aurait été que l’url soit générée dans toutes les langues du bloc , et que l’appel à l’une ou l’autre de ces url renvoient au même article.

Il est bien possible d’attribuer plusieurs url à un article ? Comment générer automatiquement ces urls « multilingues » à partir des extrait du bloc ?

Je ne sais pas si c’est plus clair.

de mémoire indiquer « fr:monurl » dans le formulaire d’édition d’url d’un article pour le multilangue (pour un SPIP récent au moins)

/**
 * Verifier la saisie de l'URL
 * on peut prefixer par une langue au format
 * fr:Mon-URL-fr
 * en:My-english-url
 * pour specifier la langue de l'URL (mais il faut que le module d'URL la prenne en charge)
 * @param $type
 * @param $id
 * @return array
 */
function formulaires_editer_url_objet_verifier_dist($type, $id) { ... }

Il y a quand même « (mais il faut que le module d’URL la prenne en charge) »

C’est pris en charge au moins par les URL arbo, en activant avec le define :

define('_url_arbo_multilang', true);

Avec ça pour les nouveaux contenus, si t’as des balises multi dans le titre, ça générera des URL différentes par langues (par exemple pour des rubriques communes traduites en multi).

PAR CONTRE, attention, ça le fait pas magiquement pour les contenus déjà existants. Donc là faut que t’ailles dans la gestion des URL et tu que ajoutes des URL en explicitant la langue en premier comme a dit @marcimat avec le format : « code:mon-url ». Donc par exemple : « en:my-great-url »

Ou bien autre méthode pour les contenus déjà existants : dans le tableau des URL, tu les supprimes toutes (dans les cas où tu veux de toute façon que des URL venant des mots du titre), et alors là si et seulement si ya plus rien : SPIP te le re-génère toutes dans toutes les langues du multi cette fois.

1 « J'aime »

Avec toutes ces infos il y a moyen de rédiger un beau proto de doc :slight_smile:

Super ça ! Déjà une bonne nouvelle…

C’est dommage que le module URL propres ne le prenne pas directement en charge. Ca ferait de belles sitemaps.

Pourquoi pas… :sweat_smile:

Avec le module arbo, je ne parviens pas à récupérer l’url de l’article (ou objet) de référence lorsque la langue de l’environnement est différente… même en passant par une inclusion.

Curieusement, je peux par contre récupérer les urls dans les autres langues dans n’importe quel contexte (il suffit de faire une inclusion avec le contexte de langue souhaité pour l’url).

Je constate que rien n’'est renseigné la colonne lang de spip_urls pour les objets d’origine, le problème vient de là ? Sinon c’est presque parfait.

Bon, j’ai finalement réussi à résoudre mon problème en le contournant de la façon suivante pour créer un menu « propre » avec des liens du style <a href="url de la version de langue du site/lang/url de la version de langue de la page>Nom de la langue

J’ai donc opté pour les urls arbo, avec, pour rester sur des urls les plus courtes que possible :

define('_url_arbo_multilang', true);
$GLOBALS['url_arbo_parents'] = array('rubrique' => array(),'article' => array());
$GLOBALS['url_arbo_types'] = array('rubrique' => '','article' => '');

Dans mes squelettes, j’ai créé une noisette incluse dans une boucle « secteurs » (car je travaille par secteur de langue, afin de recréer un contexte de langue.

La boucle qui appelle la noisiette :

<BOUCLE_secteurs (RUBRIQUES) {racine} {par lang} {tout}>

<BOUCLE_pages (ARTICLES) {traduction} {lang=#LANG}>

<INCLURE{fond=inclure/alternate,id_secteur=#_secteurs:ID_RUBRIQUE,lang=#_secteurs:LANG,id_article=#ID_ARTICLE} />

</BOUCLE_pages>

</BOUCLE_secteurs>

La noisette :

<BOUCLE_secteur (RUBRIQUES) {id_rubrique=#ENV{id_secteur}} {tout}>

  <BOUCLE_version (SITES) {id_rubrique}>

    <BOUCLE_page (ARTICLES) {id_article=#ENV{id_article}}>

      <BOUCLE_reference (URLS) {type=article} {id_objet=#ENV{id_article}} {langue=''} {par date} {inverse} {0,1}>

        <li><a href="[(#ENV{lang}|=={fr}|?{[(#VAL{fr/#URL}|url_absolue{#_version:URL_SITE})],[(#URL_ARTICLE|url_absolue{#_version:URL_SITE})]})]" rel="alternate" hreflang="#ENV{lang}"[ title="(#H1|extraire_multi{#ENV{lang}}|attribut_html)"]>[(#ENV{lang}|traduire_nom_langue|ucfirst)]</a></li>

      </BOUCLE_reference>

    </BOUCLE_produit>

  </BOUCLE_version>

</BOUCLE_secteur>

Voilà, la boucle version, c’est parce que j’ai créé un site associé à chaque secteur pour les informations liées aux versions de langue du site. On peut très bien aussi créer des champs supplémentaires sur les secteurs.

Voilà, je ne sais pas si ma solution est farfelue, mais elle fonctionne. Par souci esthétique, si vous avez plus simple et plus classe, je suis preneur ! :slight_smile:

Quelques pistes à première vue pour essayer de simplifier :

  • la boucle secteur semble inutile puisque tu peux avoir directement <BOUCLE_version(SITES){id_rubrique=#ENV{id_secteur}}

  • et même <BOUCLE_version(SITES){id_rubrique} si tu appelles la variable d’environnement id_rubrique au lieu de id_secteur.

  • <BOUCLE_page (ARTICLES) {id_article=#ENV{id_article}}> doit pouvoir s’écrire <BOUCLE_page (ARTICLES) {id_article}> non ?

  • et puis cette boucle est elle vraiment nécessaire ? Tu pourrais essayer de la virer. Tu as besoin de #URL_ARTICLE après mais il y a d’autres moyens de l’avoir à partir de #ENV{id_article}. Ah mais tu utilises un #H1 : ça vient de ta table article aussi ?