React e RTL: La figure de style che il tuo business non può permettersi.
ThinkPink Studio
7 maggio 2026

L'arroganza LTR: quando il tuo software è un colonialista digitale
Parliamoci chiaro. Lanci un prodotto, festeggi con il team, ma da Dubai o Tel Aviv arrivano lamentele: la UI è un disastro. Testo a pezzi, icone che puntano al nulla, layout sventrati. Non è un bug. È una scelta di progettazione. Una scelta arrogante.
Qui in ThinkPink, tra un caffè a Rosignano e una call con Kampala, ne abbiamo viste tante di aziende schiantarsi contro il muro dell'internazionalizzazione. Pensano che basti tradurre qualche stringa. Un errore da dilettanti che costa una fortuna. Ignorare le lingue Right-to-Left (RTL) in React non è una svista. È una dichiarazione: "A quella metà del mondo, non ci interessa vendere". State deliberatamente lasciando sul tavolo fette di mercato colossali e vi state caricando un debito tecnico che marcisce nel tempo, come un vecchio server abbandonato in cantina. Il problema è che quel debito, prima o poi, presenta il conto.
Noi non siamo qui per darvi pacche sulle spalle. Siamo qui per mettervi di fronte alla realtà dei fatti.
Il costo della pigrizia: i numeri che il tuo CEO dovrebbe leggere
Smettiamola con le favole. Internet non parla solo inglese. I dati del 2026 sono brutali: quasi il 50% dei contenuti web è in inglese, ma meno di un quarto degli utenti lo capisce davvero. Questo significa che stai volontariamente ignorando il 75% del pianeta. È una strategia suicida. Ma andiamo oltre le opportunità mancate, parliamo di costi vivi. Una localizzazione fatta male può far esplodere i costi del customer care anche del 40%. Non sono bruscolini. Chiedete a HSBC, a cui un errore di traduzione è costato 10 milioni di dollari. Un singolo bug di localizzazione che arriva in produzione costa fino a 100 volte di più che se fosse stato intercettato in fase di design. Lo chiamano "localization debt", un mutuo che non hai chiesto ma che stai pagando con gli interessi.
E la percezione? Il 65% dei consumatori vede le traduzioni scadenti come un insulto, un segno che all'azienda non frega nulla di loro. Chi, invece, investe seriamente in una localizzazione pensata dall'architettura, si prende una fetta di mercato che gli altri, i pigri, gli hanno gentilmente lasciato. È la differenza tra improvvisare e pianificare. Tra la tenacia di chi lavora a Kampala con una connessione ballerina e la precisione di chi progetta a Rosignano pensando globale.
Smettetela di Infarcire il Codice di Classi Inutili: dir e Proprietà Logiche
La guida all'internazionalizzazione del W3C non è un consiglio, è un ordine: la direzione si imposta nell'HTML. Punto. L'attributo dir è il re. È il segnale che dice al browser come applicare l'Algoritmo Bidirezionale Unicode. La regola, vecchia ma ancora d'oro nel 2026, è semplice: se il documento è RTL, metti dir="rtl" sul tag html.
Eppure, vediamo ancora degli orrori in giro. Il classico anti-pattern React che ci fa venire l'orticaria in agenzia è questo: <div className={locale === "ar" ? "text-right flex-row-reverse" : "text-left"}>. Un accrocchio fragile, ripetitivo, un incubo da mantenere. Invece di mettere pezze ovunque, fate una cosa, fatela bene e fatela una volta sola. Impostate dir e lang a monte, nell'app shell.
// Il modo pulito per dire al browser da che parte leggere.
const rtlLocales = new Set(["ar", "he", "fa", "ur"]);
export function AppShell({ locale, children }) {
const dir = rtlLocales.has(locale) ? "rtl" : "ltr";
return (
<html lang={locale} dir={dir}>
<body>{children}</body>
</html>
);
}
Se siete incastrati in una Single Page Application e non potete toccare l'HTML di base, non ci sono scuse. Usate un useEffect dal componente principale. È un trucco sporco, ma funziona.
import { useEffect } from "react";
const rtlLocales = new Set(["ar", "he", "fa", "ur"]);
// Questa è la pezza da mettere se non controlli l'index.html
// Meglio di niente, ma non vantatevene al bar.
export function DirectionProvider({ locale, children }) {
useEffect(() => {
document.documentElement.lang = locale;
document.documentElement.dir = rtlLocales.has(locale) ? "rtl" : "ltr";
}, [locale]);
return children;
}
Fatto questo, la magia accade. Allineamento del testo, colonne delle tabelle, persino i form si adattano. E il CSS? Abbandonate il pensiero fisico (destra/sinistra) e abbracciate quello logico. Dimenticate margin-left e usate margin-inline-start. In LTR, si mappa a sinistra. In RTL, si mappa a destra. Stesso codice, doppio risultato. Questa è l'efficienza che pretendiamo dai nostri team, da Rosignano a Kampala. Niente duplicazioni, niente codice spazzatura.
Non tutto va specchiato, idiota.
C'è un'idea sbagliata, quasi infantile, che RTL significhi semplicemente "fare lo specchio" a tutta la UI. Sbagliato. La navigazione, le icone che indicano progressione nel tempo (come i controlli play/pausa), i grafici, i loghi... non sempre vanno invertiti. La domanda da farsi davanti al caffè, prima di scrivere una riga di codice, è: "Questa cosa è legata alla direzione di lettura o al mondo fisico?". La freccia "prossima pagina" segue il testo. La lancetta di un tachimetro no. Sembra banale, ma abbiamo visto interfacce andare a gambe all'aria per molto meno.
Poi c'è il caos: il contenuto generato dagli utenti. Un commento in ebraico sotto un post in inglese. Un nome prodotto americano in una pagina in arabo. Qui, non potete sapere la direzione a priori. La soluzione si chiama dir="auto". Mettetelo su ogni contenitore il cui testo arriva da un utente, un'API o un database. Lasciate che sia il browser a fare il lavoro sporco.
// dir="auto" è il vostro paracadute quando il contenuto è selvaggio.
function Comment({ author, text }) {
return (
<article className="comment">
<strong dir="auto">{author}</strong>
<p dir="auto">{text}</p>
</article>
);
}
Per rendere questa pratica un'abitudine e non un'eccezione, create un piccolo componente di utility. Vi salverà da un sacco di grane.
// Un componente stupido che vi eviterà errori stupidi.
export function BidiText({ as: Component = "span", children, dir = "auto" }) {
return <Component dir={dir}>{children}</Component>;
}
I dettagli che separano i professionisti dai ragazzini
Pensate di aver finito? Neanche per sogno. Font diversi, altezze di riga specifiche, stili di enfasi. L'arabo, ad esempio, richiede più spazio verticale. Non risolvete questo problema creando componenti duplicati. Sarebbe un'altra porcheria. Usate il selettore CSS :lang(). È fatto apposta.
:lang(ar) { font-family: "Noto Naskh Arabic", serif; line-height: 1.8; }
È pulito, segue gli standard e rende i componenti React manutenibili. In ThinkPink, abbiamo una regola non scritta: se una soluzione sembra un "accrocchio", probabilmente lo è. Le aziende che dominano il mercato globale, quelle che rientrano nella "1% Rule", non vedono l'internazionalizzazione (i18n) come una feature da aggiungere alla fine. È parte del DNA dell'architettura. Strumenti come react-i18next o react-intl non sono opzionali, sono la base. E per progetti seri, le traduzioni vanno divise in namespace per non appesantire il bundle iniziale. A Kampala ce lo ricordano ogni giorno: un'app pesante su una rete lenta è un'app morta. Per chi usa TypeScript, le chiavi di traduzione type-safe sono obbligatorie. Trovano gli errori in fase di build, non quando il cliente si lamenta.
Infine, il testing. La pseudo-localizzazione è un buon inizio, ma niente batte il feedback di un madrelingua. Sono loro a scovare le sfumature culturali che nessun tool automatico vedrà mai. E non dimentichiamoci dell'accessibilità. Un'implementazione RTL corretta è fondamentale per rendere il web utilizzabile da tutti. Le linee guida WAI del W3C sono ancora un riferimento imprescindibile.
Piccola PMI, grande mondo: la tua app è il tuo ambasciatore
Per una PMI italiana, il mercato globale sembra una bestia spaventosa. Ma è qui che si gioca la partita. Con la giusta strategia, anche una piccola realtà di Rosignano può competere con i colossi. Un'applicazione React con una i18n solida non è solo software. È un ambasciatore. Dice al mondo che rispettate i vostri clienti, chiunque essi siano e qualunque lingua parlino. Dimostra che "fatto in Italia" non significa solo design, ma anche ingegneria del software di prim'ordine, costruita con la testa dura dei toscani e la visione di chi sa guardare lontano, fino all'Uganda e oltre.
Se state ancora usando le classi condizionali per gestire l'RTL, abbiamo un problema. E possiamo risolverlo.
Ultimo aggiornamento: