Traduction des configurations (yaml, xml, json) et certains formulaires ( _T_ou_typo )
Je remets le texte d'un mail envoyé sur spip-devel (comme il n'y a plus de liens gmane pour les voir), sur le sujet parlant de la fonction _T_ou_typo()
qui permet de pouvoir traiter des chaînes contenant
- soit
"du texte"
- soit une
"<:chaine_de_langue:>"
- soit des
"<multi>...</multi>"
La fonction _T_ou_typo()
a comme usage principal d'appliquer la fonction typo()
sur le texte qui lui est envoyé, ou récursivement sur chaque valeur si un tableau lui est donné.
Et, si un des textes est de la forme <:cle_de_langue:>
ou <:module:cle_de_langue:>
(une forme simple de l'écriture de chaîne de langue dans les squelettes donc), alors c'est la valeur de traduction de cette chaîne de langue qui est retourné.
Autrement dit :
_T_ou_typo("Coucou") == "Coucou" _T_ou_typo("<:module:bonjour:>") == "Coucou" (avec le fichier de langue qui va bien quand même) _T_ou_typo("[fr]Coucou[en]Hi") == "Coucou" _T_ou_typo(["Coucou", "<:module:bonjour:>", "[fr]Coucou[en]Hi"]) == ["Coucou", "Coucou", "Coucou"]
Cette intégration pose plusieurs questions sur l'usage / le besoin d'origine et sur la réponse apportée.
L'usage et solution actuelle
Le besoin est de permettre dans des fichiers de configuration (yaml, xml, json) de certains plugins, ou dans des options de configuration de certains plugins directement dans l'interface privée de SPIP (Menus, Formidable, Champs Extras, ...), de pouvoir indiquer soit un texte quelconque, soit de se référer à une chaîne de langue quelque part.
Par exemple, dans une déclaration .yaml
d'une saisie, on peut trouver : label: '<:saisies:option_groupe_description:>'
. On pourrait utiliser pour des saisies spécifiques à un site label: 'Description'
si on sait que le site n'est pas multilingue par exemple.
La difficulté d'utiliser directement le code de langue (ie: label: 'saisies:option_groupe_description'"
qui paraît pourtant plus simple) est qu'il est impossible de discriminer les cas où on écrirait un code de langue, des cas où c'est réellement le texte voulu, par exemple avec "label: 'todo'"
, qui si on utilise le code de langue retournerait 'à venir' (dans spip_fr.php), alors que ce n'était pas forcément ce qui serait souhaité.
D'où donc l'apparition de cette écriture <:truc:muche:>
pour les textes de configuration, écriture connue déjà dans les squelettes SPIP, avec les nuances qu'on parle bien ici d'une syntaxe simplifiée.
On ne peut pas écrire label: '<:module:nb_elephants{nb=5}:>'
par exemple.
Proposition
Il me semble qu'on pourrait voir la chose autrement, en considérant que toute présence d'un idiome
doit être transformé par la fonction typo()
.
La fonction typo()
traite déjà en fait le cas des polyglottes <multi>...</multi>
que l'on peut écrire à la fois dans les squelettes SPIP et à la fois dans le texte d'un article.
Il suffirait d'ajouter la gestion de l'idiome <:module:cle:>
également. Ainsi typo("<:module:bonjour:>")
retournerait "Coucou" en allant piocher la chaîne de langue correspondante.
La conséquence est que ça permettrait plus de possibilités que le besoin d'origine (on pourrait mettre des chaines de langue dans les textes d'articles par exemple) (je ne dis pas que ça serait recommandé non plus, mais dans certains cas ça serait pratique !), tout en répondant au problème avec les configurations de type .yaml ou d'autres déclarations multilingues : il leur suffirait d'appliquer typo() sans autre question, du moins en théorie.