Aller au menu du forum Aller au contenu du forum Aller à la recherche dans le forum
Logo Khaganat
Menu principal

Dokuwiki, quelques détails

Zatalyz

Ce sujet est là pour discuter des diverses particularités de Dokuwiki. Comme tout le monde doit le savoir ici, je porte un amour immodéré à ce logiciel, qui n'a que des qualités (ou presque). Bon, malgré tout, je patine un peu sur certains aspects où de l'aide est toujours bienvenue... donc ce sujet permettra de discuter de ce genre de choses. IRC ne se prête pas trop à ces informations qui ont besoin de structure et de pérennité.

TychoBrahe travaille actuellement sur Django, qui va nous fournir la barre de navigation générale. Cette barre est multilingue (alleluia !). Pour l'intégration dans Django, il suffit de l'exporter en php, puis de l'inclure dans le thème Dokuwiki.

Premier aspect : l'internationalisation.
Dokuwiki détecte la langue de l'utilisateur selon plusieurs paramètres. Par défaut il donne au visiteur le wiki dans la langue pour laquelle son navigateur est configuré, ou l'anglais s'il n'a pas cette langue. Comme j'ai activé le plugin Translation, il y a une gestion multilingue du wiki et si le visiteur passe d'un article en français à sa version en anglais, l'interface passe aussi du français à l'anglais.

Les traductions du thème (ce qui sera notre cas ici) se placent dans un dossier du template. Le chemin précis est dokuwiki/lib/tpl/<template>/lang/<ISO-code>/ ; ce qui donne dans le cas de la barre de navigation pour le template "wikhan" quelque chose comme
dokuwiki/lib/tpl/wikhan/lang/fr/khanav.php et dokuwiki/lib/tpl/wikhan/lang/en/khanav.php

Pour l'interface générale, le fichier appelé doit être lang.php dans lang/<ISO-code>/ . Mais il est déjà utilisé pour d'autres choses dans le thème et ne devrait pas être écrasé si on régénère la barre de navigation. Ceci dit, c'est du php, donc il suffit d'ajouter à la fin include('khanav.php'); et ça marche.

Voici l'exemple d'un fichier lang/fr/khanav.php :
<?php 

$lang
['khanav_test']            = "Ceci est un test incroyable.";


Et voici le bout de code qui me permet de voir ce message dans dokuwiki (bout que j'ai ajouté dans le main.php du template, mais osef) :

<div><?php 
$khanav_test tpl_getLang('khanav_test');
            echo 
$khanav_test ;
?>
</div>

Note : il y a très probablement plus élégant et si vous voyez comment faire ça, proposez-moi. Mais ça, ça marche.

Zatalyz

Les onglets
Ha ce morceau...

Pour résumer : sur l'um1  nous avons, au dessus des articles, des onglets (général, animation, gameplay etc...). Ce qui est très bien, sauf que cela a été fait il y a plusieurs années, par quelqu'un qui ne maitrisait pas bien dokuwiki et php. Donc, le code est un assemblage de trucs piqués ici et là (dont des morceaux inutiles) et surtout : je ne peux pas remettre le thème à jour parce que cette fonction me bloque. C'est tentaculaire, tel que c'est fait, et je finis toujours par casser des trucs en nettoyant parce que c'est pas clair du tout. Il me faut un truc que je puisse ensuite coller où je veux dans mon nouveau thème. Mais c'est moins trivial que ça n'en a l'air car tous ceux à qui j'ai tenté de confier le job se sont enfuis en hurlant, visiblement rendus fous par les appels à des choses immondes dont nul ne devrait parler.

La problématique est aussi détaillé (avec le code actuel et des idées) ici : https://git.khaganat.net/khaganat/website_jukni/issues/8

Je finirais par y arriver. Si.

Un lien dans l'UM1 ressemble ensuite en gros à ceci (après https://khaganat.net/um1/ ) :
$lang:$tab:<ns>:$id
où :
- $lang est le code de langue déclaré dans le plugin translate
- $tab est le nom des onglets (chez nous, donc, "Général, Animation, Gameplay, Développement, Discussion")
- <ns> : il peut potentiellement y avoir des sous-espaces de nom, même si en théorie, non...
- $id : le nom de la page


En théorie, le lien commence toujours par "$lang:$tab:" et se termine toujours par ":$id".  Et en gros, il faut que j'arrive à générer ces variables proprement, suivant où le visiteur se situe dans l'arborescence.

L'un de mes premiers problèmes est de détecter si on est sur du wiki multilingue, et si oui, prendre l'espace de nom avec le code de lang et le traiter à part. Alors, oui : sur Khaganat le multilangue est activé partout, mais je souhaiterais partager ce thème à la communauté Dokuwiki (quelle ambition) et donc je ne dois pas supposer que forcément, il existe...

Détecter si le plugin est actif, ça se fait comme ça :

if ($translation)
echo "translate" ;
else
echo "notranslate";



Et il y a le code suivant qui me retrouve les langues configurées pour le wiki :
$tab_lang = explode(" ", $conf["plugin"]["translation"]["translations"]) ;


Seul souci, je ne sais pas comment traiter ce que je reçois avec explode. Ok, je récupère "en", "fr" et autre ; je sais que comme la condition du plugin existant est rempli, je trouve ça en début de chaine. Mais je ne vois pas trop la suite. Probable même que ça ne me serve à rien, tout ça...

Zatalyz

J'ai pas mal avancé ; j'ai même pushé ça :
https://git.khaganat.net/zatalyz/khum1-doku

Depuis le dernier commit j'ai encore ajouté quelques trucs mais bon, flemme, tout ça. Même si ce n'est pas parfait, ça marche relativement bien. Il faut que je peaufine des détails, que je teste ça comme il faut et si c'est bon, je ferais le reste du thème façon Um1. Mon regret est qu'actuellement, vu comme c'est fait, les onglets ne sont pas dynamiques ; je vois bien comment faire pour qu'on déclare les onglets qu'on veut dans l'interface d'admin, mais pas comment les gérer dans le code, donc c'est tout en dur. Et flute. Mais qui sait, je finirais peut-être aussi par m'y attaquer... ou quelqu'un pourra refactoriser ce code qui a au moins le mérite d'être commenté et verbeux à l'extrême.

Alleluia !  :ola:

Zatalyz

J'en suis à une interrogation de design... Et aussi la certitude que je devrais faire de cette fonctionnalité d'onglets un plugin et pas mettre ça dans le code. Mais bon avant que je fasse un plugin faudrait que je lise plus de doc, et comment dire...  :sleep:

Bref, toujours est-il qu'il faut décider de certains comportements.

Option numéro 1 : on ne change presque rien à ce qui existe actuellement
Ça veut dire que :
- les pages "générales" sont sous la forme de lien "fr:page"
- les autres pages sont sous la forme "fr:onglet:page" (donc fr:gameplay:page, fr:animation:page, etc)
À noter que j'ai mis les pages discussions au même niveau que les autres : fr:talk:page (et plus talk:fr:page qui est le truc actuel).

Option numéro 2 : la page générale a son onglet
Ça veut dire qu'on n'aura plus, par exemple, de fr:branaz, mais fr:general:branaz.
La première conséquence c'est que tous les liens externes à l'um1 qui pointe vers une page de l'um1 deviendront faux (faudra rajouter "general"). On peut faire une redirection automatique, par contre : si on arrive sur fr:page, ça redirige en automatique sur fr:general:page. Mais cette redirection auto empêche du coup d'utiliser fr:page pour autre chose. Est-ce bien utile de la bloquer ?
La seconde conséquence, un peu trivial, c'est que je trouve moins intuitif de créer sa page en mettant "general" dans le namespace et que ça alourdit d'autant les liens. Mais bon c'est juste une habitude à prendre.
Enfin, ça demande de déplacer toutes les pages dans l'espace de nom fr ; y'a des outils pour assister ça, mais je ne sais pas trop comment ça va se passer, je crains un peu les soucis (faut pas faire du recursif).

Option bis : les onglets ne s'affichent que dans des espaces de noms précis
Ça, ce serait clairement plus simple si j'en faisais un plugin... bref, vu le fonctionnement de l'um1, les pages encyclopédiques sont intéressantes avec les onglets (branaz, ra, blasa, etc) mais c'est moins vrai dans certains espaces de noms. Les pages sous les espaces de nom tag(génération du menu par catégorie), user (pages persos), wiki (pages d'explication de comment marche le wiki) : on s'en fout des onglets.
C'est un peu plus complexe à faire pour moi mais si c'est un idéal à atteindre, je peux le mettre sur la todoliste. À voir si on s'en fout ou pas.

Il s'agit donc surtout de trancher entre l'option 1 et 2. J'attends vos retours.

Licences Mentions légales Accueil du site Contact