{"id":562,"date":"2015-09-15T11:36:46","date_gmt":"2015-09-15T09:36:46","guid":{"rendered":"https:\/\/alistapart.com\/it\/article\/plurali-con-javascript\/"},"modified":"2015-09-15T11:36:46","modified_gmt":"2015-09-15T09:36:46","slug":"plurali-con-javascript","status":"publish","type":"article","link":"https:\/\/alistapart.com\/it\/article\/plurali-con-javascript\/","title":{"rendered":"Pluralizzazione per JavaScript"},"content":{"rendered":"<div class=\"paragrafo\">\n<p><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2015\/09\/n116plurale.jpg\" border=\"0\" width=\"300px\" style=\"float: left;\" \/>Il 71% degli utenti attuali di internet <a href=\"http:\/\/www.internetworldstats.com\/stats7.htm\">non parla inglese come prima lingua<\/a> e questo numero continua a crescere, ma nonostante ci\u00f2, poche persone si specializzano nell&#8217;internazionalizzazione. Come risultato, la maggior parte dei siti sbaglia perch\u00e9 le cose che sembrano semplici sono spesso tutto tranne quello.<\/p>\n<p>Prendiamo per esempio la pluralizzazione. Mettere al plurale singole parole all&#8217;interno di stringhe diventa rapidamente complesso, anche in inglese, dove la maggior parte delle parole plurali finisce con una <em>s<\/em>.  Per esempio, ho lavorato ad una app per condivisione di foto che supporta due lingue, inglese e cinese. Aggiungere una <em>s<\/em> per mostrare \u201cX like[s]\u201d o \u201cY comment[s]\u201d \u00e8 stato semplice, ma cosa sarebbe successo se avessimo avuto bisogno di pluralizzare \u201cfoot\u201d o \u201cinch\u201d o \u201cquiz\u201d? La nostra semplice soluzione sarebbe diventata un hack malfunzionante.<\/p>\n<p>Per di pi\u00f9, l&#8217;inglese \u00e8 un caso relativamente semplice. Molte lingue hanno pi\u00f9 di due forme plurali: l&#8217;arabo, per esempio, ne ha sei e molte lingue slave ne hanno pi\u00f9 di tre. In effetti, almeno 39 lingue hanno pi\u00f9 di due forme plurali. Alcune lingue hanno una forma, come il cinese e il giapponese, il che implica che i nomi singolari e plurali sono identici.<\/p>\n<p>Come possiamo dare un senso a tali complesse questioni riguardanti la pluralizzazione e risolverle nei nostri progetti? In questo articolo, vi mostrer\u00f2 alcuni dei pi\u00f9 comuni problemi di pluralizzazione e vi spiegher\u00f2 come superarli.<\/p>\n<\/div>\n<div class=\"paragrafo\">\n<h2>Problemi con la pluralizzazione<\/h2>\n<p>La pluralizzazione \u00e8 addirittura ancora pi\u00f9 complicata: ogni lingua ha anche le sue regole per definire ogni forma di plurale. Una regola per il plurale definisce una forma di plurale usando una formula che include un <strong>contatore<\/strong>. Un contatore \u00e8 un numero di oggetti che si sta cercando di rendere al plurale. Supponiamo che stiamo lavorando con \u201c2 conigli\u201d. Il numero prima di \u201cconigli\u201c \u00e8 il contatore, che in questo caso ha valore 2. Ora, se prendiamo l&#8217;inglese come esempio, ha due forme plurali: singolare e plurale. Pertanto, le nostre regole avranno questo aspetto:<\/p>\n<ul>\n<li>Se il contatore ha il valore intero 1, usa il <strong>singolare<\/strong>: \u201crabbit\u201d.<\/li>\n<li>Se il contatore ha un valore diverso da 1, usa il <strong>plurale<\/strong>: \u201crabbits\u201d.<\/li>\n<\/ul>\n<p>Tuttavia, non si pu\u00f2 affermare lo stesso per il polacco, in cui la stessa parola, \u201crabbit\u201d o \u201c<em>kr\u00f3lik<\/em>\u201d, pu\u00f2 avere pi\u00f9 di forme:<\/p>\n<ul>\n<li>Se il contatore ha il valore intero 1, usate \u201c<em>kr\u00f3lik<\/em>\u201d.<\/li>\n<li>Se il contatore ha un valore che finisce in 2\u20134, esclusi 12\u201314, usate \u201c<em>kr\u00f3lika<\/em>\u201d.<\/li>\n<li>Se il contatore non \u00e8 1 e ha un valore che finisce in 0 o 1, oppure il contatore termina in 5\u20139, o il contatore termina in 12\u201314, usate \u201c<em>kr\u00f3lik\u00f3w<\/em>\u201d.<\/li>\n<li>Se il contatore ha un valore diverso da quelli elencati prima, usate \u201c<em>kr\u00f3liki<\/em>\u201d.<\/li>\n<\/ul>\n<p>E questo solo per il \u201csingolare\u201d e per il \u201cplurale\u201d. Per le lingue con tre o pi\u00f9 forme di plurale, abbiamo bisogno di etichette pi\u00f9 specifiche.<\/p>\n<h3>Diverse lingue usano diversi tipi di numeri<\/h3>\n<p>Potreste anche dover mostrare il contatore con il nome pluralizzato, come ad esempio \u201cYou have 3 rabbits\u201d. Tuttavia, non tutte le lingue usano i numeri arabi a cui potreste essere abituati. Per esempio, l&#8217;arabo usa i <a href=\"http:\/\/www.unicode.org\/cldr\/charts\/latest\/supplemental\/language_plural_rules.html#ar\">numeri Indo-Arabi<\/a>, \u0660\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669:<\/p>\n<ul>\n<li>0 libri: \u0660 \u0643\u062a\u0627\u0628 <\/li>\n<li>1 libro: \u0643\u062a\u0627\u0628 <\/li>\n<li>3 libri: \u0663 \u0643\u062a\u0628<\/li>\n<li>11 libri: \u0661\u0661 \u0643\u062a\u0627\u0628\u064b\u0627<\/li>\n<li>100 libri: \u0661\u0660\u0660 \u0643\u062a\u0627\u0628<\/li>\n<\/ul>\n<h3>Diverse lingue o differenti regioni usano formati numerici diversi<\/h3>\n<p>Spesso, abbiamo anche come obiettivo quello di rendere pi\u00f9 leggibili i numeri molto grossi aggiungendo dei separatori, come quando mostriamo il numero 1000 come \u201c1,000\u201d in inglese. Ma molte lingue e regioni usano diversi frazionari e separatori per le migliaia. Per esempio, il tedesco rende il numero 1000 come \u201c1.000\u201d. Altre lingue non raggruppano i numero per le migliaia, ma per decine di migliaia.<\/p>\n<\/div>\n<div class=\"paragrafo\">\n<h2>Soluzione: il MessageFormat di <abbr title=\"International Components for Unicode\">ICU<\/abbr><\/h2>\n<p>La pluralizzazione \u00e8 un problema complesso da risolvere, perlomeno se volete gestire tutti i casi limite. Recentemente l&#8217;International Components for Unicode (ICU) ha fatto proprio questo con <a href=\"http:\/\/userguide.icu-project.org\/formatparse\/essages\">MessageFormat<\/a>. Il MessageFormat di ICU \u00e8 un linguaggio di markup creato specificatamente per la localizzazione. Permette di definire, in maniera dichiarativa, il modo in cui i nomi dovrebbero essere resi in varie forme plurali. Classifica al posto vostro tutte le forme plurali e relative regole e formatta i numeri in maniera corretta. Sfortunatamente, molti di voi non avranno ancora sentito parlare di MessageFormat, perch\u00e9 \u00e8 perlopi\u00f9 utilizzato da persone che lavorano specificamente con l&#8217;internazionalizzazione, noti agli addetti ai lavori come <em>i18n<\/em> e JavaScript si \u00e8 evoluto solo recentemente per gestirlo.<\/p>\n<p>Vediamo come funziona<\/p>\n<h3>Usare <abbr title=\"Common Locale Data Repository\">CLDR<\/abbr> per la forma plurale<\/h3>\n<p><abbr title=\"Common Locale Data Repository\">CLDR<\/abbr> sta per Common Locale Data Repository ed \u00e8 un repository che aziende come Google, IBM e Apple usano per avere informazioni sulla formattazione di numeri, date e tempo. Il <abbr title=\"Common Locale Data Repository\">CLDR<\/abbr> contiene anche dati sulle forme plurali e regole per molte lingue. \u00c8 probabilmente il locale data repository pi\u00f9 grande al mondo, il che lo rende ideale come base per ogni tool di internazionalizzazione JavaScript.<\/p>\n<p>Il <abbr title=\"Common Locale Data Repository\">CLDR<\/abbr> definisce fino a sei forme diverse di plurale. A ogni forma \u00e8 assegnato un nome: <strong>zero<\/strong>, <strong>one<\/strong>, <strong>two<\/strong>, <strong>few<\/strong>, <strong>many<\/strong>, o <strong>other<\/strong>. Non tutte le locali hanno bisogno di ogni forma: ricordate, l&#8217;inglese ne ha solo due: one e other. Il nome di ogni forma \u00e8 basato sulla sua regola plurale corrispondente. Ecco un esempio <abbr title=\"Common Locale Data Repository\">CLDR<\/abbr> per la lingua polacca, versione leggermente modificata delle nostre regole precedenti per il contatore:<\/p>\n<ul>\n<li>Se il contatore ha il valore intero 1, usa la forma plurale <strong>one<\/strong>.<\/li>\n<li>Se il contatore ha un valore che termina in 2\u20134, esclusi 12\u201314, usa la forma plurale <strong>few<\/strong>.<\/li>\n<li>Se il contatore non \u00e8 1 e ha un valore che termina in 0 o 1, o il contatore finisce in 5\u20139, o il contatore termina in 12\u201314, usa la forma plurale <strong>many<\/strong>.<\/li>\n<li>Se il contatore ha un qualsiasi altro valore diverso dai precedenti, usa la forma plurale <strong>other<\/strong>.<\/li>\n<\/ul>\n<p>Invece di implementare a mano le forme plurali del <abbr title=\"Common Locale Data Repository\">CLDR<\/abbr>, potete usare dei tool e delle librerie. Per esempio, ho creato <a href=\"http:\/\/l10ns.org\/\">L10ns<\/a>, che compila il codice al posto vostro, <a href=\"http:\/\/formatjs.io\/\">FormatJS<\/a> di Yahoo ha tutte le forme plurali al suo interno. Il grande vantaggio di questi tool e di queste librerie \u00e8 che scalano bene perch\u00e9 estraggono la geestione della forma plurale. Se scegliete di fare voi stessi la codifica delle forme plurali, finirete con l&#8217;esaurire voi stessi e i vostri compagni di team, perch\u00e9 dovrete tenere traccia di tutte le varie forme e regole e definirle pi\u00f9 e pi\u00f9 volte ogni volta e in ogni posto in cui vorrete formattare una stringa plurale.<\/p>\n<h3>MessageFormat<\/h3>\n<p>MessageFormat \u00e8 un linguaggio domain-specific che usa <abbr title=\"Common Locale Data Repository\">CLDR<\/abbr> ed \u00e8 specificatamente creato per localizzare le stringhe. Si definisce il markup inline. Per esempio, vogliamo formattare il messaggio \u201cI have X rabbit[s]\u201d usando la forma plurale giusta per la parola \u201crabbit\u201d:<\/p>\n<pre id=\"snippet1\" class=\" language-javascript\"><code class=\" language-javascript\">\n<span class=\"token keyword\">var<\/span> message <span class=\"token operator\">=<\/span> <span class=\"token string\">'I have {rabbits, plural, one{# rabbit} other{# rabbits}}'<\/span><span class=\"token punctuation\">;<\/span>\n\n<\/code><\/pre>\n<p>Come potete vedere, un formato plurale \u00e8 definito all&#8217;interno di parentesi graffe <code>{}<\/code>. Prende un contatore, <code>rabbits<\/code>, come primo argomento. Il secondo argomento definisce il tipo di formattazione; il terzo argomento include la forma plurale (<code>one<\/code>, <code>many<\/code>) del <abbr title=\"Common Locale Data Repository\">CLDR<\/abbr>. Dovete definire un sotto-messaggio all&#8217;interno delle parentesi graffe corrispondente a ciascuna forma plurale. Potete anche passargli il simbolo <code>#<\/code> per rendere il contatore con il formato del corretto numero e con il corretto sistema di numerazione, cos\u00ec da risolvere i problemi che abbiamo identificato in precedenza con il sistema di numeri indo-arabico e con la formattazione dei numeri.<\/p>\n<p>Qui facciamo il parsi del messaggio nella local en-US e abbiamo in uscita diversi messaggi a seconda della forma di plurale che assume la variabile <code>rabbits<\/code>:<\/p>\n<pre id=\"snippet2\" class=\" language-javascript\"><code class=\" language-javascript\">\n<span class=\"token keyword\">var<\/span> message <span class=\"token operator\">=<\/span> <span class=\"token string\">'I have {rabbits, plural, one{# rabbit} other{# rabbits}}.'<\/span><span class=\"token punctuation\">;<\/span>\n<span class=\"token keyword\">var<\/span> messageFormat <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span> MessageFormat<span class=\"token punctuation\">(<\/span><span class=\"token string\">'en-US'<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n<span class=\"token keyword\">var<\/span> output <span class=\"token operator\">=<\/span> messageFormat<span class=\"token punctuation\">.<\/span>parse<span class=\"token punctuation\">(<\/span>message<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n\n<span class=\"token\">\/\/ Will output \"I have 1 rabbit.\"\n<\/span>console<span class=\"token punctuation\">.<\/span>log<span class=\"token punctuation\">(<\/span>output<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span> rabbits<span class=\"token punctuation\">:<\/span> <span class=\"token number\">1<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n\n<span class=\"token\">\/\/ Will output \"I have 10 rabbits.\"\n<\/span>console<span class=\"token punctuation\">.<\/span>log<span class=\"token punctuation\">(<\/span>output<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span> rabbits<span class=\"token punctuation\">:<\/span> <span class=\"token number\">10<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n\n<\/code><\/pre>\n<h3>Vantaggi dell&#8217;inline<\/h3>\n<p>Come potete vedere nel messaggio precedente, abbiamo definito il formato plurale inline. Se non fosse stato inline, avremmo avuto bisogno di ripetere le parole \u201cI have\u2026\u201d per tutte le forme plurali invece di scriverle una sola volta. Immaginate se aveste bisogno di usare ancora pi\u00f9 parole, come nel seguente esempio:<\/p>\n<pre id=\"snippet3\" class=\" language-javascript\"><code class=\" language-javascript\">\n<span class=\"token punctuation\">{<\/span>\n  one<span class=\"token punctuation\">:<\/span> <span class=\"token string\">'My name is Emily and I got 1 like in my latest post.'<\/span>\n  other<span class=\"token punctuation\">:<\/span>  <span class=\"token string\">'My name is Emily and I got # likes in my latest post.'<\/span>\n<span class=\"token punctuation\">}<\/span>\n\n<\/code><\/pre>\n<p>Senza l&#8217;inline, dovremmo ripetere \u201cMy name is Emily and I got\u2026in my latest post\u201d ogni singola volta. Si tratta di molte parole.<\/p>\n<p>Di contro, l&#8217;inline nel MessageFormat di <abbr title=\"International Components for Unicode\">ICU<\/abbr> semplifica le cose: invece di ripetere la frase per ogni forma plurale, tutto quello che dobbiamo fare \u00e8 localizzare la parola \u201clike\u201d:<\/p>\n<pre id=\"snippet4\" class=\" language-javascript\"><code class=\" language-javascript\">\n<span class=\"token keyword\">var<\/span> message <span class=\"token operator\">=<\/span> <span class=\"token string\">'My name is Emily and I got {likes, plural, one{# like} other{# likes}} in my latest post'<\/span><span class=\"token punctuation\">;<\/span>\n\n<\/code><\/pre>\n<p>In questo caso non dobbiamo ripetere le parole \u201cMy name is Emily and I got\u2026in my latest post\u201d per ogni forma plurale. Al contrario dobbiamo semplicemente localizzare la parola \u201clike\u201d.<\/p>\n<h3>Vantaggi dell&#8217;annidamento dei messaggi<\/h3>\n<p>La natura annidata di MessageFormat ci viene inoltre in aiuto dandoci possibilit\u00e0 infinite per definire una moltitudine di stringhe complesse. Qui definiamo un formato di select in un formato plurale per dimostrare quanto sia flessibile MessageFormat:<\/p>\n<pre id=\"snippet5\" class=\" language-javascript\"><code class=\" language-javascript\">\n<span class=\"token keyword\">var<\/span> message <span class=\"token operator\">=<\/span> '<span class=\"token punctuation\">{<\/span>likeRange<span class=\"token punctuation\">,<\/span> select<span class=\"token punctuation\">,<\/span>\\\n  range1<span class=\"token punctuation\">{<\/span>I got no likes<span class=\"token punctuation\">}<\/span>\\\n  range2<span class=\"token punctuation\">{<\/span>I got <span class=\"token punctuation\">{<\/span>likes<span class=\"token punctuation\">,<\/span> plural<span class=\"token punctuation\">,<\/span> one<span class=\"token punctuation\">{<\/span># like<span class=\"token punctuation\">}<\/span> other<span class=\"token punctuation\">{<\/span># likes<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">}<\/span>\\\n  other<span class=\"token punctuation\">{<\/span>I got too many likes<span class=\"token punctuation\">}<\/span>\\\n<span class=\"token punctuation\">}<\/span>'<span class=\"token punctuation\">;<\/span>\n\n<\/code><\/pre>\n<p>Un formato select abbiana un insieme di casi e, a seconda del caso con cui fa coppia, d\u00e0 in uscita il corrispondente sotto-messaggio. \u00c8 perfetto per costruire messaggi basati su un range. Nell&#8217;esempio precedente, vogliamo costruire tre tipi di messaggio per ciascun range di <code>like<\/code>. Come potete vedere in <code>range2<\/code>, abbiamo definito un formato plurale per formattare il messaggio \u201cI got X like[s]\u201d e poi abbiamo annidato il formato plurale all&#8217;interno del formato select. Questo esempio mostra una formattazione molto complessa che pochissime sintassi possono ottenere, dimostrando la flessibilit\u00e0 di MessageFormat.<\/p>\n<p>Con il formato di cui sopra, ecco i messaggi che possiamo ottenere:<\/p>\n<ul>\n<li>\u201cI got no likes,\u201d se <code>likeRange<\/code> \u00e8 nel <code>range1<\/code>.<\/li>\n<li>\u201cI got 1 like,\u201d se <code>likeRange<\/code> \u00e8 nel <code>range2<\/code> e il numero di like \u00e8 1.<\/li>\n<li>\u201cI got 10 likes,\u201d se <code>likeRange<\/code> \u00e8 nel <code>range2<\/code> e il numero di like \u00e8 10.<\/li>\n<li>\u201cI got too many likes,\u201d se <code>likeRange<\/code> non \u00e8 n\u00e9 in <code>range1<\/code> n\u00e9 in <code>range2<\/code>.<\/li>\n<\/ul>\n<p>Si tratta di concetti veramente difficili da localizzare: perfino uno dei pi\u00f9 famosi tool di internazionalizzazione, <a href=\"https:\/\/www.gnu.org\/software\/gettext\/\">gettext<\/a>, non pu\u00f2 fare questa cosa.<\/p>\n<h3>Storage e messaggi pre-compilati<\/h3>\n<p>Tuttavia, invece di memorizzare i messaggi di MessageFormat in una variabile JavaScript, potreste dover usare qualche tipo di formato di memorizzazione, come pi\u00f9 files <abbr title=\"JavaScript Object Notation\">JSON<\/abbr>. Questo vi permetter\u00e0 di pre-compilare i messaggi in semplici getter di localizzazione. Se non volete gestire questo da soli potreste provare L10ns, che gestisce lo storage e la pre-compilazione per voi, cos\u00ec come la sincronizzazione delle chiavi di traduzione tra sorgente e storage.<\/p>\n<h3>I traduttori devono conoscere MessageFormat?<\/h3>\n<p>Potreste pensare che sia troppo pesante per traduttori non-programmatori conoscere MessageFormat e la forma plurale di <abbr title=\"Common Locale Data Repository\">CLDR<\/abbr>, ma, per quella che \u00e8 la mia esperienza, per insegnargli le basi di come appare il markup e quello che fa e cosa sono le forme plurali di <abbr title=\"Common Locale Data Repository\">CLDR<\/abbr> ci vogliono solo alcuni minuti e d\u00e0 sufficienti informazioni ai traduttori per svolgere il loro lavoro usando MessageFormat. L&#8217;interfaccia web di L10ns mostra anche i numeri di esempio per ogni forma plurale di <abbr title=\"Common Locale Data Repository\">CLDR<\/abbr> per farvi riferimento facilmente.<\/p>\n<div class=\"illustration full\"><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2015\/09\/pluralization-js-edit.jpg\" border=\"0\" alt=\"Screenshot dell'intefaccia di L10ns, che mostra le variabili plurali per la frase 'I got X likes.\" width=\"100%\" style=\"border: 0px none;\" \/><\/div>\n<\/div>\n<div class=\"paragrafo\">\n<h2>La pluralizzazione non \u00e8 facile ma ne vale la pena<\/h2>\n<p>S\u00ec, la pluralizzazione ha moltissimi casi limite che non sono risolvibili facilmente, ma il MessageFormat di <abbr title=\"International Components for Unicode\">ICU<\/abbr> mi ha aiutato tantissimo nel mio lavoro, dandomi una flessibilit\u00e0 infinita nel tradurre le stringhe plurali. Muovendoci verso un mondo pi\u00f9 connesso, dobbiamo per forza localizzare le applicazioni in pi\u00f9 lingue. Dobbiamo conoscere i problemi generali di localizzazione e gli strumenti per risolverli. Dobbiamo localizzare le app perch\u00e9 il mondo \u00e8 pi\u00f9 connesso ma possiamo anche localizzare le app per contribuire a <em>rendere<\/em> il mondo pi\u00f9 connesso.<\/p>\n<p>Illustrazioni: {carlok}<\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Formulare i plurali in maniera corretta quando si localizza \u00e8 una prospettiva delicata: ogni lingua ha le sue regole ed eccezioni all&#8217;interno di queste regole. Come possiamo scalare i nostri siti web e le nostre app per rispondere al pubblico globale? Tingan Ho ci mostra come MessageFormat riduce alcune criticit\u00e0 nel processo di traduzione dei plurali.<\/p>\n","protected":false},"author":818,"featured_media":7000772,"comment_status":"open","ping_status":"open","template":"","categories":[245,4,271,133],"tags":[],"coauthors":[455],"class_list":["post-562","article","type-article","status-publish","has-post-thumbnail","hentry","category-accessibilita","category-codice","category-javascript","category-numero-116-15-settembre-2015"],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/article\/562","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/article"}],"about":[{"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/types\/article"}],"author":[{"embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/users\/818"}],"replies":[{"embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/comments?post=562"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/media\/7000772"}],"wp:attachment":[{"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/media?parent=562"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/categories?post=562"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/tags?post=562"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/coauthors?post=562"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}