Bribe

Tout ce que j’ai pu dénicher comme bribe d’information me conduit au même endroit : une belle impasse. C’est con parce que sur le principe ça devait faire le job comme on dit, sauf que je me heurte à un problème non solvable, ou plutôt qui va devoir me faire reprendre, éventuellement, quasi de zéro toute la conception de mon plugin Rosetta.

Pour résumer, techniquement :

Je souhaite intercepter la récupération d’une liste de billet pour en échanger tout ou partie avec leur traduction si celle-ci existe. Exemple : mon blog est positionné avec le français comme langue par défaut, je récupère pour la page d’accueil que des billets dans cette langue, et si il existe une traduction correspondante à une des langues préférées du visiteur — ça se règle dans les préférences d’icelui — alors je remplace le billet en français par le billet idoine.

La mécanique fonctionne, je l’ai codée hier, mais le seul hic est que je ne peux modifier la liste originale, ni même la remplacer intégralement par une que j’aurais construit expressément , vous voyez ?

Maintenant, j’ai deux solutions :

  1. Je reprends toute la conception de mon plugin compte tenu de cette limitation, ce qui va peu ou prou devoir me faire repartir d’une page blanche, ou ;
  2. Je fais sauter la limitation en question dans Dotclear — de l’avantage d’être le lead-dev du projet — mais j’ai tout de même du mal à justifier cette modif. en fonction de mes seuls besoins.

Sachant que quoi qu’il en soit, je ne suis pas tributaire de ce développement pour continuer à bloguer, c’est juste pour rendre service à une petite initiative que j’aime bien et qui s’appelle Cozy.

Une cote mal taillée serait de ne s’occuper que d’imposer une langue (détectée à la volée en fonction des réglages du navigateur du visiteur) pour afficher les billets traduits dans cette langue à défaut de ceux qui correspondraient à la langue par défaut du blog.

Je vais illustrer ça avec un petit exemple, ça sera peut-être plus clair :

La langue par défaut du blog est le Français et je dois afficher 4 billets sur la page d’accueil, le langue du visiteur est Anglais, et j’ai ces billets :

  • A (fr)
  • B (fr)
  • C (fr)
  • D (en) traduction de C (fr)
  • E (en) traduction de F (fr)
  • F (fr)

Le fonctionnement habituel de Dotclear provoquerait l’affichage des billets A, B, C et D.

L’idéal serait d’afficher les billets A, B, D et E pour un visiteur anglais ; on aura remplacé C (fr) par D (en) et F (fr) par E (fr).

La cote mal taillée dont je parlais plus haut fournirait alors les seuls billets D et E en page d’accueil, puisque ce sont les seuls existants en anglais.

Dilemme, dilemme…

Z’en pensez quelque chose vous ?


Je viens de tester en faisant sauter la limitation dans Dotclear, ce qui revient à ajouter un appel à un nouveau behavior qui permet d’utiliser un autre recordset si une alternative est fournie (juste avant le retour dans la fonction getPosts()), et ça fonctionne très bien :

# --BEHAVIOR-- coreBlogAfterGetPosts
$rsa = new arrayObject(array('rs' => null));
$this->core->callBehavior('coreBlogAfterGetPosts',$rs,$rsa);
if ($rsa['rs'] instanceof record) {
	$rs = $rsa['rs'];
}

Côté behavior il suffit alors de récupérer la liste des billets, de trouver leur éventuelle traduction et avec cette nouvelle liste de récupérer un recordset tout neuf :

// Get new list of posts as we have at least one exchange done
$params = new ArrayObject(array('post_id' => $ids));
$rsa['rs'] = $core->blog->getPosts($params);

Bien sûr, il faut veiller à ne pas tourner en boucle et ne faire ce traitement que si nous ne sommes pas déjà en train de le faire, vu que ce behavior utilise un appel à getPosts() qui appelle ce même behavior qui utilise un appel à getPosts(), etc.

Ajouter un commentaire

Les champs suivis d'un * sont obligatoires

Les commentaires peuvent être formatés en utilisant la syntaxe Markdown Extra.

Ajouter un rétrolien

URL de rétrolien : https://open-time.net/trackback/12533

Haut de page