{"id":234218,"date":"2023-02-15T16:38:00","date_gmt":"2023-02-15T13:38:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=234218"},"modified":"2022-11-12T00:45:58","modified_gmt":"2022-11-11T21:45:58","slug":"creer-un-bloc-gutenberg-personnalise-partie-8-prise-en-charge-de-la-traduction","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/creer-un-bloc-gutenberg-personnalise-partie-8-prise-en-charge-de-la-traduction\/","title":{"rendered":"Cr\u00e9er un bloc Gutenberg personnalis\u00e9 &#8211; Partie 8 : Prise en charge de la traduction"},"content":{"rendered":"\n<p>Dans cette partie, nous allons nous concentrer sur la fa\u00e7on de traduire les textes et les valeurs dans notre bloc Gutenberg personnalis\u00e9. Nous utilisons WP-CLI pour g\u00e9n\u00e9rer les fichiers n\u00e9cessaires afin que Gutenberg puisse charger nos traductions lors du changement de langue WordPress.<\/p>\n<p>Avant de continuer, vous devez avoir install\u00e9 <a href=\"https:\/\/wp-cli.org\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP CLI<\/a> (interface de ligne de commande pour WordPress). Si vous ne l&rsquo;avez pas, suivez simplement le <a href=\"https:\/\/make.wordpress.org\/cli\/handbook\/installing\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">guide sur WordPress Handbook for CLI<\/a>.<\/p>\n<p>Pour expliquer en bref comment traduire pour les scripts Javascript (Gutenberg): WordPress n\u00e9cessite <code>.mo<\/code>des fichiers pour la traduction des fichiers PHP, mais pour Javascript, WordPress n\u00e9cessite un <code>.json<\/code>fichier. Chaque fichier Javascript n\u00e9cessite un fichier JSON pour la traduction. Le JSON doit \u00eatre d&rsquo;un format sp\u00e9cifique (WP CLI le g\u00e9n\u00e9rera pour nous) avec nos cha\u00eenes traduites. Nous avons besoin d&rsquo;un fichier JSON par langue dans laquelle nous souhaitons traduire.<\/p>\n<p>Donc, ce que nous devons faire, c&rsquo;est d&rsquo;abord ajouter les fonctions gettext (<code>__()<\/code>, <code>_e()<\/code>etc.) dans nos fichiers Javascript et g\u00e9n\u00e9rer un fichier PO comme d&rsquo;habitude pour notre th\u00e8me ou plugin. Parce que nous avons envelopp\u00e9 les textes dans nos fichiers de script avec par exemple <code>__()<\/code>, le fichier PO devrait pouvoir les inclure. Ensuite, nous faisons la traduction comme d&rsquo;habitude dans notre fichier PO. Et enfin, nous utilisons WP CLI pour extraire les cha\u00eenes n\u00e9cessaires du fichier PO et g\u00e9n\u00e9rer des fichiers JSON pour tous nos fichiers Javascript.<\/p>\n<p>Gardez \u00e0 l&rsquo;esprit que les fichiers\/fichiers de votre th\u00e8me ou plugin <code>.po<\/code>n&rsquo;auront <code>.mo<\/code>jamais d&rsquo;effet sur vos fichiers Javascript, m\u00eame s&rsquo;ils contiennent des cha\u00eenes traduites \u00e0 partir de nos fichiers Javascript.<\/p>\n<h2>Impl\u00e9mentation de la traduction en Javascript<\/h2>\n<p>La premi\u00e8re \u00e9tape consiste \u00e0 envelopper tous les textes dans notre fichier Javascript dans les fonctions de traduction. Si vous avez g\u00e9r\u00e9 la traduction de WordPress en PHP, vous connaissez probablement tr\u00e8s bien les fonctions <code>__()<\/code>, <code>_e()<\/code>, <code>esc_html__()<\/code>etc. WordPress a un package <code>wp.i18n<\/code>qui contient ces fonctions, qui fonctionnent exactement comme en PHP.<\/p>\n<p>Comme avec PHP, vous devez fournir un domaine textdomain (nom\/handle). Cela peut \u00eatre ce que vous voulez, mais soyez bref car vous devrez probablement le taper tr\u00e8s souvent. Pour mon th\u00e8me, j&rsquo;ai configur\u00e9 mon textdomain avec le domaine <code>awhitepixel<\/code>. Donc dans PHP je vais faire <code>__('My string', 'awhitepixel')<\/code>pour traduire les cha\u00eenes, et ce sera exactement la m\u00eame chose dans les fichiers Javascript.<\/p>\n<p>Commen\u00e7ons \u00e0 \u00e9diter notre fichier Javascript. Nous devons d&rsquo;abord d\u00e9structurer la fonction <code>__<\/code>et <code>_e<\/code>du <code>wp.i18n<\/code>package. En raison de la nature de React, vous utiliserez probablement la <code>__<\/code>fonction principalement ou peut-\u00eatre uniquement.<\/p>\n<pre><code>const { __, _e } = wp.i18n;<\/code><\/pre>\n<p>Et puis il s&rsquo;agit de retrouver tous nos textes cod\u00e9s en dur dans le fichier Javascript et de les mettre \u00e0 jour. Gardez \u00e0 l&rsquo;esprit que les fonctions <code>__<\/code>et <code>_e<\/code>n\u00e9cessitent un contexte Javascript. Cela signifie que lorsque nous tapons des cha\u00eenes comme par exemple des valeurs de propri\u00e9t\u00e9 d&rsquo;objet, nous utilisons <code>__()<\/code>tout de suite, mais comme valeurs pour, par exemple, des accessoires, nous devons tout envelopper \u00e0 l&rsquo;int\u00e9rieur <code>{ }<\/code>pour signifier qu&rsquo;il s&rsquo;agit de code Javascript.<\/p>\n<p>Par exemple, notre <code>registerBlockType<\/code>support pour la traduction ressemblera \u00e0\u00a0:<\/p>\n<pre><code>registerBlockType('awp\/firstblock', {\n    title: __('My first block', 'awhitepixel'), \n    category: 'common',\n    icon: 'smiley',\n    description: __('Learning in progress', 'awhitepixel'),\n    keywords: [__('example', 'awhitepixel'), __('test', 'awhitepixel')],\n    attributes: {\n        ...<\/code><\/pre>\n<p>Et en ce qui concerne les accessoires, c&rsquo;est-\u00e0-dire dans <code>InspectorControls<\/code>:<\/p>\n<pre><code>&lt;InspectorControls&gt;\n    &lt;PanelBody\n        title={__(\"Most awesome settings ever\", 'awhitepixel')}\n        initialOpen={true}\n    &gt;\n    ...\n        &lt;ToggleControl\n            label={__(\"Toggle me\", 'awhitepixel')}\n            checked={attributes.toggle}\n            onChange={(newval) =&gt; setAttributes({ toggle: newval })}\n        \/&gt;\n        ...<\/code><\/pre>\n<p>Enveloppez tous les textes dont vous souhaitez prendre en charge la traduction dans <code>__()<\/code>et <code>_e()<\/code>. Si vous avez suivi ce tutoriel \u00e9tape par \u00e9tape, vous ne devriez pas avoir de cas o\u00f9 vous devez utiliser <code>_e()<\/code>. Lorsque vous avez termin\u00e9, recompilez le Javascript et nous nous \u00e9loignerons de Javascript.<\/p>\n<h2>Configuration des fichiers po et\/ou pot<\/h2>\n<p>Cette \u00e9tape varie un peu en fonction de ce que vous avez d\u00e9j\u00e0 fait et configur\u00e9 pour votre th\u00e8me ou plugin. Vous \u00e9crivez peut-\u00eatre vos scripts Gutenberg dans un nouveau plugin vide qui n&rsquo;a pas \u00e9t\u00e9 configur\u00e9 pour la traduction PHP, ou dans un th\u00e8me qui a d\u00e9j\u00e0 un domaine de texte enregistr\u00e9. Vous pouvez avoir des fichiers PO (et MO) pr\u00eats, ou vous pouvez n&rsquo;avoir qu&rsquo;un fichier POT. Je ferai de mon mieux pour couvrir toutes les bases.<\/p>\n<h3>Mon th\u00e8me ou plugin a d\u00e9j\u00e0 un fichier po(t)<\/h3>\n<p>Si vous avez d\u00e9j\u00e0 un fichier PO ou POT dans votre projet, vous avez probablement aussi la fonction PHP <code>load_theme_textdomain()<\/code>, <code>load_child_theme_textdomain()<\/code>ou <code>load_plugin_textdomain()<\/code>quelque part dans votre code. Veuillez vous assurer que le domaine enregistr\u00e9 est le m\u00eame que celui que vous avez utilis\u00e9 dans vos fichiers Javascript.<\/p>\n<p>Tout ce que vous avez \u00e0 faire est de charger le fichier PO pour la langue que vous souhaitez traduire (ou d&rsquo;en g\u00e9n\u00e9rer un \u00e0 partir du fichier POT) dans par exemple <a href=\"https:\/\/poedit.net\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">PoEdit<\/a>. Cliquez sur &quot;Mettre \u00e0 jour \u00e0 partir du code&quot; (ou similaire dans d&rsquo;autres programmes) afin que le programme puisse analyser tous les fichiers du projet (y compris nos fichiers Javascript r\u00e9cemment mis \u00e0 jour) et mettre \u00e0 jour le pool de cha\u00eenes \u00e0 traduire. Les cha\u00eenes de notre fichier Javascript devraient appara\u00eetre. Ensuite il vous suffit de les traduire normalement et de les enregistrer.<\/p>\n<p>PS\u00a0: Si vous ne parvenez pas \u00e0 cliquer sur &quot;Mettre \u00e0 jour \u00e0 partir du code&quot; ou \u00e0 r\u00e9analyser les fichiers, le fichier PO n&rsquo;a probablement pas \u00e9t\u00e9 configur\u00e9 correctement. Recherchez des conseils dans la section suivante.<\/p>\n<h3>Je n&rsquo;ai pas de fichiers de traduction<\/h3>\n<p>Si votre th\u00e8me ou projet n&rsquo;a pas \u00e9t\u00e9 configur\u00e9 avec la traduction, vous devez soit g\u00e9n\u00e9rer un fichier POT \u00e0 l&rsquo;aide de WP-CLI, soit cr\u00e9er manuellement un fichier PO.<\/p>\n<p>J&rsquo;ai un guide complet sur la fa\u00e7on de cr\u00e9er un fichier PO dans mon <a href=\"https:\/\/awhitepixel.com\/blog\/wordpress-theme-tutorial-for-beginners-part-8-translation-of-your-theme\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">didacticiel th\u00e9matique pour d\u00e9butants &#8211; partie 8<\/a>. Le message d\u00e9crit comment vous pouvez cr\u00e9er le fichier et le configurer correctement pour rechercher vos fichiers de th\u00e8me, ainsi que les mots-cl\u00e9s \u00e0 rechercher (<code>__<\/code>, <code>_e<\/code>, etc.).<\/p>\n<p>Si vous souhaitez plut\u00f4t cr\u00e9er un fichier POT, vous pouvez utiliser la <a href=\"https:\/\/developer.wordpress.org\/cli\/commands\/i18n\/make-pot\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">commande wp i18n make-pot<\/a> dans WP-CLI, puis cr\u00e9er un fichier PO \u00e0 partir de celui-ci en utilisant par exemple PoEdit. Gardez \u00e0 l&rsquo;esprit que vous devrez r\u00e9g\u00e9n\u00e9rer le fichier POT (puis le fichier PO) chaque fois que vous mettez \u00e0 jour des cha\u00eenes dans votre code.<\/p>\n<h3>R\u00e9sultat final<\/h3>\n<p>Ce dont vous avez besoin en fin de compte, c&rsquo;est d&rsquo;un fichier PO qui a trouv\u00e9 vos cha\u00eenes Javascript l\u00e0 o\u00f9 elles ont \u00e9t\u00e9 traduites. Je vous recommande de placer vos fichiers de traduction dans un dossier s\u00e9par\u00e9 de votre th\u00e8me ou plugin. Lorsque nous commen\u00e7ons \u00e0 g\u00e9n\u00e9rer des fichiers JSON, nous nous retrouvons avec un certain nombre de fichiers \u00e0 traduire et ce sera bien de les garder tous ensemble dans leur propre dossier.<\/p>\n<p>Comme point de r\u00e9f\u00e9rence, je place tous les fichiers de traduction dans mon fichier <code>theme\/assets\/lang\/<\/code>. J&rsquo;ai ajout\u00e9 une traduction norv\u00e9gienne pour mon th\u00e8me, nomm\u00e9e <code>nb_NO.po<\/code>, qui contient les cha\u00eenes traduites de notre fichier Javascript de bloc personnalis\u00e9.<\/p>\n<h2>G\u00e9n\u00e9ration de fichiers JSON \u00e0 partir du fichier po<\/h2>\n<p>L&rsquo;\u00e9tape suivante consiste \u00e0 utiliser WP-CLI pour g\u00e9n\u00e9rer des fichiers JSON \u00e0 partir de notre fichier po. Pour ce faire, nous utilisons la commande <a href=\"https:\/\/developer.wordpress.org\/cli\/commands\/i18n\/make-json\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">wp i18n make-json<\/a>.<\/p>\n<p>Sachez que par d\u00e9faut, cette commande extraira les cha\u00eenes traduites de votre fichier PO pour les utiliser dans la g\u00e9n\u00e9ration du fichier JSON. Cela peut \u00eatre fastidieux au milieu du d\u00e9veloppement de votre th\u00e8me ou plugin. Parce que lorsque vous ajoutez de nouvelles cha\u00eenes ou que vous les ajustez, vous devrez analyser \u00e0 nouveau les fichiers et traduire \u00e0 nouveau toutes les cha\u00eenes (et encore et encore). Heureusement, il y a un drapeau \u00e0 la commande pour \u00e9viter cela.<\/p>\n<p>Commen\u00e7ons! Dans votre terminal, acc\u00e9dez au r\u00e9pertoire de votre langue pour votre projet. Ex\u00e9cutez la commande suivante et reportez-vous \u00e0 votre fichier po (comme mentionn\u00e9, j&rsquo;ai un <code>nb_NO.po<\/code>fichier pr\u00eat).<\/p>\n<pre><code>wp i18n make-json nb_NO.po --no-purge<\/code><\/pre>\n<p>Si vous n&rsquo;avez aucun probl\u00e8me \u00e0 supprimer les cha\u00eenes traduites de votre fichier PO (par exemple si vous faites votre version finale), vous pouvez ignorer le <code>--no-purge<\/code>drapeau.<\/p>\n<p>Le terminal doit indiquer &quot;Succ\u00e8s&quot; et indiquer le nombre de fichiers JSON cr\u00e9\u00e9s. Si vous voyez qu&rsquo;il a g\u00e9n\u00e9r\u00e9 deux fichiers JSON, c&rsquo;est parce qu&rsquo;il a lu \u00e0 la fois notre fichier Javascript de code source et le fichier de construction, et en a g\u00e9n\u00e9r\u00e9 un pour chacun. Si vous avez plus de fichiers Javascript dans votre projet, vous vous retrouverez avec encore plus de fichiers JSON.<\/p>\n<p>Au moment de la r\u00e9daction de ce document (WordPress v 5.3.2 et WP-CLI version 2.4.0), les fichiers JSON sont g\u00e9n\u00e9r\u00e9s avec le code de langue et un hachage &#8211; une cha\u00eene crypt\u00e9e comme noms de fichiers. Nous devons trouver le bon et le renommer.<\/p>\n<h2>Renommer le fichier JSON et le charger en PHP<\/h2>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153240-61e50a824a365.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153240-61e50a824a365.png\" alt=\"Cr\u00e9er un bloc Gutenberg personnalis\u00e9 - Partie 8 : Prise en charge de la traduction\" ><\/a><\/p>\n<p>Votre dossier de langue ressemble probablement \u00e0 ceci\u00a0:<\/p>\n<p>N&rsquo;oubliez pas que la commande a g\u00e9n\u00e9r\u00e9 un fichier JSON par fichier Javascript &#8211; et parce que nous avons en fait deux fichiers pour notre bloc personnalis\u00e9 (la source et la construction), elle a g\u00e9n\u00e9r\u00e9 deux fichiers. Si votre code Javascript est divis\u00e9 en plusieurs fichiers, chacun recevra deux de ses propres fichiers JSON.<\/p>\n<p>Si vous \u00eates assis avec seulement deux fichiers JSON (car aucun autre fichier Javascript n&rsquo;a \u00e9t\u00e9 trouv\u00e9), vous pouvez supprimer l&rsquo;un d&rsquo;entre eux maintenant. Si vous en avez plus de deux, vous devez ouvrir les fichiers JSON et voir \u00e0 quel fichier ils sont destin\u00e9s. Les fichiers JSON contiennent une propri\u00e9t\u00e9 &quot; <code>source<\/code>&quot; qui vous indique \u00e0 quel fichier Javascript ce fichier JSON est destin\u00e9. Utilisez-le pour d\u00e9terminer quel fichier JSON conserver. Je recommande de trouver le fichier de construction final (par opposition aux fichiers de d\u00e9veloppement) car il doit contenir toutes les cha\u00eenes de tous les fichiers.<\/p>\n<p>Lorsque vous avez trouv\u00e9 le bon, nous devons le renommer. Nous devons le renommer pour suivre ce mod\u00e8le\u00a0:<\/p>\n<p><code>[textdomain]-[language code]-[script handle].json<\/code><\/p>\n<p>Utilisez le domaine de texte que vous avez utilis\u00e9 partout (par exemple <code>__('My string', 'awhitepixel')<\/code>), ajoutez un tiret et le code de langue. Ensuite, fournissez un tiret et le descripteur de script que vous avez utilis\u00e9 pour enregistrer votre fichier Gutenberg Javascript (<code>wp_register_script()<\/code>). \u00c0 titre de r\u00e9f\u00e9rence, mon domaine de texte est <code>awhitepixel<\/code>, mon code de langue est <code>nb_NO<\/code>, et mon descripteur de script pour le script Gutenberg est <code>awp-myfirstblock-js<\/code>. Donc je renomme le fichier JSON en :<\/p>\n<p><code>awhitepixel-nb_NO-awp-myfirstblock-js.json<\/code><\/p>\n<h3>Dites \u00e0 WordPress de charger notre JSON<\/h3>\n<p>Il ne reste plus qu&rsquo;\u00e0 passer \u00e0 l&rsquo;\u00e9tape finale\u00a0: dire \u00e0 WordPress de charger notre fichier JSON. Nous devons utiliser la fonction <code>[wp_set_script_translations](https:\/\/developer.wordpress.org\/reference\/functions\/wp_set_script_translations\/)()<\/code>. Il s&rsquo;agit d&rsquo;une toute nouvelle fonction WordPress, je vous recommande donc de l&rsquo;envelopper dans un fichier <code>function_exists()<\/code>. Il accepte trois param\u00e8tres\u00a0; le descripteur de script pour notre bloc, le textdomain et le chemin vers notre dossier de traduction (note: le chemin, pas l&rsquo;URL).<\/p>\n<p>Dans notre fonction accroch\u00e9e \u00e0 <code>init<\/code>, o\u00f9 nous avons enregistr\u00e9 notre script de bloc et appel\u00e9, <code>register_block_type<\/code>nous pouvons \u00e9galement appeler cette nouvelle fonction pour charger notre fichier de traduction JSON. PS\u00a0: Gardez \u00e0 l&rsquo;esprit que le crochet <code>enqueue_block_assets<\/code>ne fonctionnera pas pour enregistrer des traductions.<\/p>\n<pre><code>add_action('init', function() {\n    wp_register_script('awp-myfirstblock-js', ....);\n    register_block_type('awp\/firstblock', ....\n\u00a0\n    if (function_exists('wp_set_script_translations')) {\n        wp_set_script_translations('awp-myfirstblock-js', 'awhitepixel', get_template_directory(). '\/assets\/lang');\n    }\n});<\/code><\/pre>\n<p>Et c&rsquo;est tout! Votre bloc devrait maintenant \u00eatre traduit. Basculez la langue WordPress vers la langue dans laquelle vous avez traduit et v\u00e9rifiez-la par vous-m\u00eame. Lorsque je change ma langue WordPress en norv\u00e9gien et que j&rsquo;ajoute mon bloc, le nom et tout ce qu&rsquo;il contient sont traduits\u00a0:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153240-61e50a83bedae.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153240-61e50a83bedae.png\" alt=\"Cr\u00e9er un bloc Gutenberg personnalis\u00e9 - Partie 8 : Prise en charge de la traduction\" ><\/a><\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Source d&rsquo;enregistrement:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Cette le\u00e7on se concentre sur la prise en charge de la traduction des textes de notre bloc Gutenberg. Nous utilisons WP-CLI pour g\u00e9n\u00e9rer les fichiers JSON requis pour WordPress.<\/p>\n","protected":false},"author":1,"featured_media":153241,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[893,893,936,936,1110,801,801,811,841,841,862,862],"tags":[1167],"class_list":{"0":"post-234218","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","6":"hentry","7":"category-code-2","9":"category-gutenberg-3","11":"category-n-a","12":"category-php-3","14":"category-plugins-2","15":"category-tutoriels","17":"category-wordpress-3","19":"tag-affiai-fr"},"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/234218","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/comments?post=234218"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/234218\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/153241"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=234218"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=234218"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=234218"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}