[spip-dev] [Spip] urls propres et balise multi

Nicolas Germain a écrit :


  
Nicolas Germain a écrit :
    

 
      
Nicolas Germain a écrit :
   
        
J'ai lu quelque part que SPIP attribue une seule réécriture d'URL par identifiant de rubrique et d'article. Je comprends donc pourquoi la réécriture ne fonctionne pas correctement sur un site multilingue,
     
          
tout dépend de la structure du site.
   
        
En gros, y'a 2 structures possibles, soit on sectorise par langue, y'a des avantages et des inconvénients, soit on définit une seule hiérarchie de rubriques valable pour toutes les langues, et les articles sont des traductions d'articles de référence. Cette 2ème façon de faire est la plus souple, et c'est ce que j'ai adopté. 
      
donc on parle bien uniquement des url propres des rubriques, pour les autres pas de probleme.

    
Et c'est précisément là-dessus que la réécriture d'url coince en n'interprétant pas la balise multi des rubriques.
 
      
il faut bien comprendre qu'il n'y a rien d'interprété.
A un instant T, on definit une url pour la rubrique, et au moment de l'acces à une url propre, Spip cherche dans la base à quel type d'objet ca correspond et son id et appelle le squelette correspondant en ajoutant l'id dans le contexte.

    
Or il n'y a aucun inconvénient en principe à définir plusieurs urls pour une seule rubrique15 par exemple, s'il y a changement de langue.
      
Et comment est connue la langue correspondant à l'url ?
Pour faire ce que tu veux, il faudrait ajouter un champ lang à spip_urls et au moment de la génération, créer plusieurs entrées quand on a un champ de type multi.
Ca pourrait faire un beau plugin, mais c'est pas un petit developpement...
    

Je crois qu'on est d'accord sur le constat, ce serait super si SPIP gérait ça en natif, où s'il y avait un plugin, car connaissant l'importance de la réécriture d'url pour le référencement et sachant que la langue est généralement un des grands critères de réécriture, je m'étonne simplement que ça n'ait pas été pensé comme ça dès l'origine.

Alors gros développement, je ne sais pas, car au moment où on construit la table des urls, on connaît forcément le numéro de la rubrique et la langue de l'utilisateur (ou la langue par défaut du site), et ensuite, quand on appelle l'url "Qui-sommes-nous", par exemple, on connaît l'id rubrique et la langue associée, et même chose dans les autres langues... Il faut aussi prévoir une option pour vider la table spip_urls, ce que le couteau suisse propose déjà.

En tout cas, merci Stéphane pour tes idées et pistes, bien que celle de l'article virtuel me semble délicat à manipuler par les rédacteurs en cas de changement de hiérarchie du contenu.

  
Les urls libres ne permettent pas de définir plusieurs url pour une seule rubrique, et rajouter directement dans la table mysql les 2 url pour la même rubrique ne marche pas.
 
      
ben, en fait, si, normalement.
Sinon, j'ai fait un petit plugin urledit il y a quelques temps de ca qui permet la definition manuelle d'une ou plusieurs url (mais comme je le disais, en l'etat, ca fera unue redirection sur la dernière url entrée) mais ca n'orientera pas forcement sur la bonne langue (ca, ca depend aussi des squelettes, de l'utilisation ou pas de lang_select et/ou forcer_lang)

    
Bref, mon problème reste entier : avoir une url en russe sur une rubrique russe, et une url en français sur une rubrique française. J'ai l'impression qu'il n'y a pas de solution à ce jour.
 
      
ben je t'ai quand meme donné unue piste : faire un article virtuel avec l'url souhaitée qui pointe sur ?rubrique15&lang=ru

@++
_______________________________________________
    

Bonjour,
(je poste aussi ce message sur spip-dev car les spécialistes auront peut-être une suggestion sur comment gérer ça mieux et plus proprement, voire l’envie de le faire de base dans une future version de spip)

J’ai eu exactement le même problème avec mon site franco-chinois qui utilise la même structure (la structure « un secteur par langue » est trop contraignante pour les contributeurs car elle oblige à choisir la nouvelle rubrique à chaque traduction → beaucoup trop d’opérations).

Résultat, j’ai dû forker le fichier « propre.php » pour que l’url unique intègre à la fois le titre en chinois et le titre en français.
C’est pas idéal, je préfèrerais en effet que spip gère une url par langue, ce qui est parfaitement possible vu la structure de la table spip_url, et de plus ne crée pas de duplicate content puisque de fait, quand on change de langue, on change de content.
Toujours est-il que ça a permis à mon site de se voir bien mieux référencé en chinois qu’avant.
Voici les modifications à apporter à propre.php (copier le ficher dans (dossier_squelette)/url et éditer le contenu de la copie, spip 2 gère la surcharge) :

//---------------------------1) augmentation de la longueur maximale de l’url (pour les langues à alphabet non latin, ça augmente vite à coup de %truc)

ligne 85

  • @define(‹ _URLS_PROPRES_MAX ›, 35);
  • @define(‹ _URLS_PROPRES_MAX ›, 100);

//---------------------------2) désactivation de la limite inférieure de caractères latins pour générer l’url propre

commenter les lignes 107 à 113

  • // S’il reste trop peu, on retombe sur article12
  • if (strlen($url) < _URLS_PROPRES_MIN) {
  • $url = $objet[‹ type ›].$objet[‹ id_objet ›];
  • }

J'ai eu exactement le même problème avec mon site franco-chinois qui utilise la même structure (la structure "un secteur par langue" est trop contraignante pour les contributeurs car elle oblige à choisir la nouvelle rubrique à chaque traduction -> beaucoup trop d'opérations).

Si les traductions de rubriques étaient possibles, cela pourrait être automatisé, non ?

Nous avons tenté d'utiliser le plugin d'Artego, mais il plantait en SPIP 2.

Résultat, j'ai dû forker le fichier "propre.php" pour que l'url unique intègre à la fois le titre en chinois et le titre en français.
C'est pas idéal, je préfèrerais en effet que spip gère une url par langue, ce qui est parfaitement possible vu la structure de la table spip_url, et de plus ne crée pas de duplicate content puisque de fait, quand on change de langue, on change de content.
Toujours est-il que ça a permis à mon site de se voir bien mieux référencé en chinois qu'avant.
Voici les modifications à apporter à propre.php (copier le ficher dans (dossier_squelette)/url et éditer le contenu de la copie, spip 2 gère la surcharge) :

//---------------------------1) augmentation de la longueur maximale de l'url (pour les langues à alphabet non latin, ça augmente vite à coup de %truc)

ligne 85
- @define('_URLS_PROPRES_MAX', 35);

+ @define('_URLS_PROPRES_MAX', 100);

Ca tu peux le faire dans ton mes_options.php

//---------------------------2) désactivation de la limite inférieure de caractères latins pour générer l'url propre

commenter les lignes 107 à 113
- // S'il reste trop peu, on retombe sur article12
- if (strlen($url) < _URLS_PROPRES_MIN) {
- $url = $objet['type'].$objet['id_objet'];
- }
-
- // Sinon couper les mots et les relier par des tirets
- else {

ainsi que 136

        if (strlen($url) < _URLS_PROPRES_MIN) # pourquoi "-1" avant ?
            $url = $objet['type'].$objet['id_objet']; // 'article12'
- }

Pareil, tu définis _URLS_PROPRES_MIN dans ton mes_options.php et ça ira.

//---------------------------3) ajout d'un test pour les url ne comportant que des caractères non latins
[...]
//----------------------3) ajout des deux fonctions suivantes en début de fichier pour changer le comportement des blocs multi :
[...]
//----------------------4) replacement de l'appel à la fonction extraire_multi par extraire_multi_local dans la fonction creer_chaine_url
[...]
//----------------------5) enfin, renommage de la fonction url_propres_dist en url_propre
[...]
Voilà, c'est pas idéal, mais avec ça les url des objets nommés par des blocs multi vont prendre la forme /francais_anglais_chinois_esperanto_martien.
Si quelqu'un sait comment avoir simplement plusieurs url pour le même objet en fonction de la langue, le tout sans forcer le calcul de l'url à chaque hit (je l'ai testé, ça a quand-même un impact significatif sur les perfs, je suis preneur (et je pense que je ne serai pas le seul) !

Et si au recalcul, tu mets en base les deux versions ?

-Nicolas

Nicolas Hoizey a écrit :

Si les traductions de rubriques étaient possibles, cela pourrait être automatisé, non ?
Nous avons tenté d'utiliser le plugin d'Artego, mais il plantait en SPIP 2.
  

Certainement, mais se pose aussi la question de l'arborescence multiple : pourquoi répliquer la totalité de l'arborescence alors que la hiérarchie de thèmes est en général la même (ou presque) dans toutes les langues.
Pourquoi ne pas gérer les rubriques différemment, comme par exemple : déporter les champs lang, titre, descriptif, texte, maj, date et statut dans une table spip_rubriques_trad indexée sur l'id_rubrique ?
Ca permettrait d'avoir une structure unique de rubrique qui garderait sa logique purement thématique, sans forcer le split à la base en plusieurs langues.

(...les define...)
Ca tu peux le faire dans ton mes_options.php
  

Ah ben ouais, c'est plus simple, mais bon j'ai fait ce fork en tâtonnant un peu.
Quand ça s'est mis à marcher, j'ai plus touché, faudra que je clean

Et si au recalcul, tu mets en base les deux versions ?
  

Ca serait mieux, en effet.
Encore faudrait-il que je sache détecter le recalcul dans le code (qui n'est pas forcément en paramètre dans l'url), je rappelle que je commence tout juste à bidouiller dans spip et beaucoup de concepts m'échappent encore.
Si tu as un bout de code qui permettrait de faire ça, je serais archi-preneur (et limite ça justifierait un set officiel d'url propre-multi pour une version future, non ?).

A bientôt
    Simon

Nicolas Hoizey a écrit :

Si les traductions de rubriques étaient possibles, cela pourrait être automatisé, non ?
Nous avons tenté d'utiliser le plugin d'Artego, mais il plantait en SPIP 2.

Certainement, mais se pose aussi la question de l'arborescence multiple : pourquoi répliquer la totalité de l'arborescence alors que la hiérarchie de thèmes est en général la même (ou presque) dans toutes les langues.

C'est nécessaire tout simplement à cause de ton « ou presque ». Sur la plupart des projets multilingues sur lesquels j'ai bossé, il y avait de bonnes intentions au départ pour tout traduire, puis il a fallu réduire la voile sur les langues secondaires, donc avoir des arborescences différentes, pour ne pas laisser voir le vide.

Pourquoi ne pas gérer les rubriques différemment, comme par exemple : déporter les champs lang, titre, descriptif, texte, maj, date et statut dans une table spip_rubriques_trad indexée sur l'id_rubrique ?

Euh... tu laisses quoi de non « déporté » ? :wink:

Ca permettrait d'avoir une structure unique de rubrique qui garderait sa logique purement thématique, sans forcer le split à la base en plusieurs langues.

Qui a ses avantages.

Déjà, pouvoir avoir des liens de traduction entre rubriques comme c'est le cas avec les articles, cela permettrait de virer les multi et simplifier pas mal de choses.

(...les define...)
Ca tu peux le faire dans ton mes_options.php

Ah ben ouais, c'est plus simple, mais bon j'ai fait ce fork en tâtonnant un peu.
Quand ça s'est mis à marcher, j'ai plus touché, faudra que je clean

Je connais ça... :wink:

Et si au recalcul, tu mets en base les deux versions ?

Ca serait mieux, en effet.
Encore faudrait-il que je sache détecter le recalcul dans le code (qui n'est pas forcément en paramètre dans l'url), je rappelle que je commence tout juste à bidouiller dans spip et beaucoup de concepts m'échappent encore.
Si tu as un bout de code qui permettrait de faire ça, je serais archi-preneur (et limite ça justifierait un set officiel d'url propre-multi pour une version future, non ?).

Dans ton code, quand tu calcules l'URL c'est qu'on t'a demandé de faire ce calcul, donc c'est là qu'il faut le faire.

-Nicolas

Nicolas Hoizey a écrit :

Et si au recalcul, tu mets en base les deux versions ?

Ca serait mieux, en effet.
Encore faudrait-il que je sache détecter le recalcul dans le code (qui n'est pas forcément en paramètre dans l'url), je rappelle que je commence tout juste à bidouiller dans spip et beaucoup de concepts m'échappent encore.
Si tu as un bout de code qui permettrait de faire ça, je serais archi-preneur (et limite ça justifierait un set officiel d'url propre-multi pour une version future, non ?).

Dans ton code, quand tu calcules l'URL c'est qu'on t'a demandé de faire ce calcul, donc c'est là qu'il faut le faire.

En commençant à y réfléchir, je me suis rendu compte que ça ne suffit pas : la balise URL_RUBRIQUE ne serait pas typée en fonction de la langue.

Effectivement... on peut générer les deux, et y accéder, mais comment savoir laquelle choisir avec la balise #URL_RUBRIQUE n'est pas aussi simple...

Salut,
mais qu'est-ce qui s'opposerait à ce que #URL_RUBRIQUE utilise l'information contextuelle de langue pour retourner sa valeur ? Car au moment, où on utilise cette balise, #LANG est connue.
Nicolas

Nicolas Germain a écrit :

Nicolas Hoizey a écrit :

Et si au recalcul, tu mets en base les deux versions ?

Ca serait mieux, en effet.
Encore faudrait-il que je sache détecter le recalcul dans le code (qui n'est pas forcément en paramètre dans l'url), je rappelle que je commence tout juste à bidouiller dans spip et beaucoup de concepts m'échappent encore.
Si tu as un bout de code qui permettrait de faire ça, je serais archi-preneur (et limite ça justifierait un set officiel d'url propre-multi pour une version future, non ?).
    

Dans ton code, quand tu calcules l'URL c'est qu'on t'a demandé de faire ce calcul, donc c'est là qu'il faut le faire.
  

En commençant à y réfléchir, je me suis rendu compte que ça ne suffit pas : la balise URL_RUBRIQUE ne serait pas typée en fonction de la langue.
Il faudrait donc impérativement ajouter une propriété langue dans la table spip_url pour que ça fonctionne.

Donc pour l'instant, j'en reste à mes url composites bancales...

A bientôt
    Simon

Le 18 déc. 2009 à 04:03, Simon Camerlo a écrit :

Nicolas Hoizey a écrit :

Et si au recalcul, tu mets en base les deux versions ?
      

Ca serait mieux, en effet.
Encore faudrait-il que je sache détecter le recalcul dans le code (qui n'est pas forcément en paramètre dans l'url), je rappelle que je commence tout juste à bidouiller dans spip et beaucoup de concepts m'échappent encore.
Si tu as un bout de code qui permettrait de faire ça, je serais archi-preneur (et limite ça justifierait un set officiel d'url propre-multi pour une version future, non ?).
   

Dans ton code, quand tu calcules l'URL c'est qu'on t'a demandé de faire ce calcul, donc c'est là qu'il faut le faire.

En commençant à y réfléchir, je me suis rendu compte que ça ne suffit pas : la balise URL_RUBRIQUE ne serait pas typée en fonction de la langue.

Effectivement... on peut générer les deux, et y accéder, mais comment savoir laquelle choisir avec la balise #URL_RUBRIQUE n'est pas aussi simple...

Il faudrait donc impérativement ajouter une propriété langue dans la table spip_url pour que ça fonctionne.

Euh... oui, mais gérer des traductions de rubriques, ce serait pas plus simple ?

-Nicolas

--
Nicolas HOIZEY
Blog : http://www.gasteroprod.com/
Photos : http://flic.kr/nicolas-hoizey/