{"id":233502,"date":"2023-02-15T16:59:00","date_gmt":"2023-02-15T13:59:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233502"},"modified":"2022-11-11T00:02:59","modified_gmt":"2022-11-10T21:02:59","slug":"crea-un-blocco-gutenberg-personalizzato-parte-8-supporto-alla-traduzione","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/crea-un-blocco-gutenberg-personalizzato-parte-8-supporto-alla-traduzione\/","title":{"rendered":"Crea un blocco Gutenberg personalizzato &#8211; Parte 8: Supporto alla traduzione"},"content":{"rendered":"\n<p>In questa parte ci concentreremo su come tradurre i testi e i valori nel nostro blocco Gutenberg personalizzato. Usiamo WP-CLI per generare i file necessari in modo che Gutenberg sia in grado di caricare le nostre traduzioni quando si cambia la lingua di WordPress.<\/p>\n<p>Prima di procedere con questo, \u00e8 necessario avere installato <a href=\"https:\/\/wp-cli.org\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP CLI<\/a> (interfaccia della riga di comando per WordPress). Se non ce l&#8217;hai, segui la <a href=\"https:\/\/make.wordpress.org\/cli\/handbook\/installing\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">guida su WordPress Handbook for CLI<\/a>.<\/p>\n<p>Per spiegare in breve come tradurre per gli script Javascript (Gutenberg): WordPress richiede <code>.mo<\/code>dei file per la traduzione dei file PHP, ma per Javascript WordPress richiede un <code>.json<\/code>file. Ogni file Javascript necessita di un file JSON per la traduzione. Il JSON dovrebbe essere di un formato specifico (WP CLI lo generer\u00e0 per noi) con le nostre stringhe tradotte. Abbiamo bisogno di un file JSON per la lingua in cui desideriamo tradurre.<\/p>\n<p>Quindi quello che dobbiamo fare \u00e8 prima aggiungere le funzioni gettext (<code>__()<\/code>, <code>_e()<\/code>ecc.) nei nostri file Javascript e generare un file PO come al solito per il nostro tema o plugin. Poich\u00e9 abbiamo racchiuso i testi nei nostri file di script con es <code>__()<\/code>, il file PO dovrebbe essere in grado di includerli. Quindi eseguiamo la traduzione come al solito nel nostro file PO. E infine utilizziamo WP CLI per estrarre le stringhe necessarie dal file PO e generare file JSON per tutti i nostri file Javascript.<\/p>\n<p>Tieni presente che i file \/ del tuo tema o plugin <code>.po<\/code>non <code>.mo<\/code>avranno mai effetto sui tuoi file Javascript, anche se contengono stringhe tradotte dai nostri file Javascript.<\/p>\n<h2>Implementazione della traduzione in Javascript<\/h2>\n<p>Il primo passo \u00e8 racchiudere tutti i testi nel nostro file Javascript all&#8217;interno delle funzioni di traduzione. Se hai gestito la traduzione per WordPress in PHP probabilmente hai molta familiarit\u00e0 con le funzioni <code>__()<\/code>, <code>_e()<\/code>, <code>esc_html__()<\/code>e cos\u00ec via. WordPress ha un pacchetto <code>wp.i18n<\/code>che contiene queste funzioni, che funzionano esattamente come in PHP.<\/p>\n<p>Come con PHP, devi fornire un dominio textdomain (nome\/handle). Pu\u00f2 essere quello che vuoi, ma mantienilo breve poich\u00e9 probabilmente dovrai scriverlo molto spesso. Per il mio tema ho impostato il mio dominio di testo con il dominio <code>awhitepixel<\/code>. Quindi all&#8217;interno di PHP far\u00f2 <code>__('My string', 'awhitepixel')<\/code>per tradurre le stringhe e sar\u00e0 esattamente lo stesso nei file Javascript.<\/p>\n<p>Iniziamo a modificare il nostro file Javascript. Per prima cosa dobbiamo destrutturare la funzione <code>__<\/code>e <code>_e<\/code>dal <code>wp.i18n<\/code>pacchetto. A causa della natura di React, molto probabilmente utilizzerai principalmente o forse solo la <code>__<\/code>funzione.<\/p>\n<pre><code>const { __, _e } = wp.i18n;<\/code><\/pre>\n<p>E poi si tratta di trovare tutti i nostri testi hardcoded nel file Javascript e aggiornarli. Tieni presente che le funzioni <code>__<\/code>e <code>_e<\/code>richiedono il contesto Javascript. Ci\u00f2 significa che quando scriviamo stringhe come ad esempio i valori delle propriet\u00e0 degli oggetti, le usiamo <code>__()<\/code>immediatamente, ma come valori per es. props dobbiamo racchiudere tutto all&#8217;interno <code>{ }<\/code>per significare che si tratta di codice Javascript.<\/p>\n<p>Ad esempio, il nostro <code>registerBlockType<\/code>con supporto per la traduzione sar\u00e0 simile a:<\/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>E per quanto riguarda gli oggetti di scena, cio\u00e8 in <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>Avvolgi tutti i testi per i quali desideri supportare la traduzione in <code>__()<\/code>e <code>_e()<\/code>. Se hai seguito questo tutorial passo dopo passo, non dovresti avere casi in cui devi usare <code>_e()<\/code>. Quando hai finito, ricompila Javascript e ci allontaneremo da Javascript.<\/p>\n<h2>Configurazione di file po e\/o pot<\/h2>\n<p>Questo passaggio varia leggermente a seconda di ci\u00f2 che hai gi\u00e0 fatto e configurato per il tuo tema o plug-in. Potresti scrivere i tuoi script Gutenberg in un nuovo plug-in vuoto che non \u00e8 stato impostato per la traduzione PHP o all&#8217;interno di un tema che ha gi\u00e0 registrato un dominio di testo. Potresti avere file PO (e MO) pronti o potresti avere solo un file POT. Far\u00f2 del mio meglio per coprire tutte le basi.<\/p>\n<h3>Il mio tema o plugin ha gi\u00e0 un file po(t).<\/h3>\n<p>Se hai gi\u00e0 un file PO o POT nel tuo progetto, molto probabilmente hai anche la funzione PHP <code>load_theme_textdomain()<\/code>o <code>load_child_theme_textdomain()<\/code>da <code>load_plugin_textdomain()<\/code>qualche parte nel tuo codice. Assicurati che il dominio registrato sia lo stesso che hai utilizzato nei tuoi file Javascript.<\/p>\n<p>Tutto quello che devi fare \u00e8 caricare il file PO per la lingua che vuoi tradurre (o generarne uno dal file POT) ad esempio <a href=\"https:\/\/poedit.net\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">PoEdit<\/a>. Fai clic su &quot;Aggiorna da codice&quot; (o simile in altri programmi) in modo che il programma possa scansionare tutti i file di progetto (inclusi i nostri file Javascript aggiornati di recente) e aggiornare il pool di stringhe per la traduzione. Le stringhe nel nostro file Javascript dovrebbero apparire. Quindi devi solo tradurli normalmente e salvare.<\/p>\n<p>PS: se non sei in grado di fare clic su &quot;Aggiorna da codice&quot; o scansionare nuovamente i file, \u00e8 probabile che il file PO non sia stato impostato correttamente. Cerca suggerimenti nella prossima sezione.<\/p>\n<h3>Non ho nessun file di traduzione<\/h3>\n<p>Se il tuo tema o progetto non \u00e8 stato impostato con la traduzione, devi generare un file POT utilizzando WP-CLI o creare manualmente un file PO.<\/p>\n<p>Ho una guida completa su come creare un file PO nel mio <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\">Tutorial tema per principianti \u2013 parte 8<\/a>. Il post descrive come creare il file e configurarlo correttamente per cercare i file del tema e le parole chiave da cercare (<code>__<\/code>, <code>_e<\/code>, ecc.).<\/p>\n<p>Se si desidera creare un file POT, \u00e8 possibile utilizzare il <a href=\"https:\/\/developer.wordpress.org\/cli\/commands\/i18n\/make-pot\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">comando wp i18n make-pot<\/a> in WP-CLI, quindi creare un file PO utilizzando ad esempio PoEdit. Tieni presente che dovrai rigenerare il file POT (e quindi il file PO) ogni volta che aggiorni le stringhe nel tuo codice.<\/p>\n<h3>Risultato finale<\/h3>\n<p>Ci\u00f2 di cui hai bisogno alla fine \u00e8 un file PO che abbia trovato le tue stringhe Javascript dove queste sono state tradotte. Ti consiglio di posizionare i tuoi file di traduzione in una cartella separata nel tuo tema o plugin. Quando inizieremo a generare file JSON, ci ritroveremo con un bel po&#8217; di file da tradurre e sar\u00e0 bello tenerli tutti insieme nella loro cartella.<\/p>\n<p>Come punto di riferimento sto inserendo tutti i file di traduzione nel mio file <code>theme\/assets\/lang\/<\/code>. Ho aggiunto una traduzione norvegese per il mio tema, denominata <code>nb_NO.po<\/code>, che contiene le stringhe tradotte dal nostro file Javascript di blocco personalizzato.<\/p>\n<h2>Generazione di file JSON dal file po<\/h2>\n<p>Il passaggio successivo consiste nell&#8217;utilizzare WP-CLI per generare file JSON dal nostro file po. Per fare ci\u00f2 utilizziamo il comando <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>Tieni presente che come impostazione predefinita questo comando eliminer\u00e0 le stringhe tradotte dal tuo file PO per utilizzarle nella generazione di file JSON. Questo pu\u00f2 essere ingombrante durante lo sviluppo del tuo tema o plugin. Perch\u00e9 quando aggiungi nuove stringhe o modifichi le stringhe dovrai scansionare nuovamente i file e tradurre tutte le stringhe ancora (e ancora, e ancora). Fortunatamente c&#8217;\u00e8 un flag al comando per evitarlo.<\/p>\n<p>Iniziamo! Nel tuo terminale, vai alla directory della tua lingua per il tuo progetto. Esegui il comando seguente e fai riferimento al tuo file po (come accennato, ho un <code>nb_NO.po<\/code>file pronto).<\/p>\n<pre><code>wp i18n make-json nb_NO.po --no-purge<\/code><\/pre>\n<p>Se non hai problemi con la rimozione delle stringhe tradotte dal tuo file PO (ad esempio se stai creando la tua build finale), puoi saltare il <code>--no-purge<\/code>flag.<\/p>\n<p>Il terminale dovrebbe richiedere &quot;Success&quot; e indicare quanti file JSON sono stati creati. Se vedi che ha generato due file JSON, \u00e8 perch\u00e9 ha letto sia il nostro file Javascript del codice sorgente che il file build e ne ha generato uno per ciascuno. Se hai pi\u00f9 file Javascript nel tuo progetto, ti ritroverai con ancora pi\u00f9 file JSON.<\/p>\n<p>Al momento della stesura di questo (WordPress v 5.3.2 e WP-CLI versione 2.4.0) i file JSON vengono generati con il codice della lingua e un hash, una stringa criptica come nomi di file. Dobbiamo trovare quello giusto e rinominarlo.<\/p>\n<h2>Rinominare il file JSON e caricarlo in 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=\"Crea un blocco Gutenberg personalizzato - Parte 8: Supporto alla traduzione\" ><\/a><\/p>\n<p>La tua cartella della lingua probabilmente assomiglia a questa:<\/p>\n<p>Ricorda che il comando ha generato un file JSON per file Javascript e poich\u00e9 in realt\u00e0 abbiamo due file per il nostro blocco personalizzato (il sorgente e la build) ha generato due file. Se il tuo codice Javascript \u00e8 suddiviso in pi\u00f9 file, ognuno otterr\u00e0 due dei propri file JSON.<\/p>\n<p>Se sei seduto con solo due file JSON (perch\u00e9 non sono stati trovati altri file Javascript), puoi eliminarne uno ora. Se ne hai pi\u00f9 di due, devi aprire i file JSON e vedere a quale file si riferiscono. I file JSON contengono una propriet\u00e0 &quot; <code>source<\/code>&quot; che indica a quale file Javascript \u00e8 destinato questo file JSON. Usalo per capire quale file JSON conservare. Consiglio di trovare il file di build finale (al contrario dei file dev) poich\u00e9 dovrebbe contenere tutte le stringhe di tutti i file.<\/p>\n<p>Quando hai trovato quello corretto, dobbiamo rinominarlo. Dobbiamo rinominarlo per seguire questo schema:<\/p>\n<p><code>[textdomain]-[language code]-[script handle].json<\/code><\/p>\n<p>Usa il dominio di testo che hai usato ovunque (es <code>__('My string', 'awhitepixel')<\/code>), aggiungi un trattino e il codice della lingua. Quindi fornisci un trattino e l&#8217;handle di script che hai usato per registrare il tuo file Javascript Gutenberg (<code>wp_register_script()<\/code>). Come riferimento, il mio dominio di testo \u00e8 <code>awhitepixel<\/code>, il codice della mia lingua \u00e8 <code>nb_NO<\/code>e il mio handle di script per lo script Gutenberg \u00e8 <code>awp-myfirstblock-js<\/code>. Quindi rinomino il file JSON in:<\/p>\n<p><code>awhitepixel-nb_NO-awp-myfirstblock-js.json<\/code><\/p>\n<h3>D\u00ec a WordPress di caricare il nostro JSON<\/h3>\n<p>Tutto ci\u00f2 che rimane ora \u00e8 il passaggio finale: dire a WordPress di caricare il nostro file JSON. Dobbiamo usare la funzione <code>[wp_set_script_translations](https:\/\/developer.wordpress.org\/reference\/functions\/wp_set_script_translations\/)()<\/code>. Questa \u00e8 una nuova funzione di WordPress, quindi consiglio di avvolgerla all&#8217;interno di un file <code>function_exists()<\/code>. Accetta tre parametri; l&#8217;handle di script per il nostro blocco, il dominio di testo e il percorso della nostra cartella di traduzione (nota: il percorso, non l&#8217;URL).<\/p>\n<p>All&#8217;interno della nostra funzione hooked to <code>init<\/code>, dove abbiamo registrato il nostro script di blocco e call <code>register_block_type<\/code>, possiamo anche chiamare questa nuova funzione per caricare il nostro file di traduzione JSON. PS: Tieni presente che l&#8217;hook <code>enqueue_block_assets<\/code>non funzioner\u00e0 per la registrazione delle traduzioni.<\/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>E questo \u00e8 tutto! Il tuo blocco ora dovrebbe essere tradotto. Cambia la lingua di WordPress nella lingua in cui hai tradotto e verifica tu stesso. Quando cambio la mia lingua WordPress in norvegese e aggiungo il mio blocco, il nome e tutto ci\u00f2 che contiene vengono tradotti:<\/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=\"Crea un blocco Gutenberg personalizzato - Parte 8: Supporto alla traduzione\" ><\/a><\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte di registrazione:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Questa lezione si concentra su come supportare la traduzione dei testi nel nostro blocco Gutenberg. Usiamo WP-CLI per generare i file JSON richiesti per 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":[896,896,939,939,1110,804,804,814,814,844,844,865,865],"tags":[1168],"class_list":{"0":"post-233502","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","6":"hentry","7":"category-codice","9":"category-gutenberg-6","11":"category-n-a","12":"category-php-6","14":"category-plugin-2","16":"category-tutorial","18":"category-wordpress-6","20":"tag-affiai-it"},"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/233502","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/comments?post=233502"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/233502\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/153241"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=233502"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=233502"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=233502"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}