Stringhe
Come internazionalizzare semplici stringhe di testo con useGT
La traduzione delle stringhe offre accesso diretto alle traduzioni di testo senza JSX, ideale per attributi, proprietà degli oggetti e valori di testo semplice. Usa useGT nei componenti React per tradurre le stringhe.
Guida rapida
import { useGT } from 'gt-react';
function MyComponent() {
const t = useGT();
return (
<input
placeholder={t('Inserisci il tuo indirizzo email')}
title={t('Campo indirizzo email')}
/>
);
}Quando usare la traduzione delle stringhe
La traduzione delle stringhe è ideale quando ti serve testo semplice invece di JSX:
Attributi HTML
const t = useGT();
<input
placeholder={t('Cerca prodotti...')}
aria-label={t('Campo di ricerca dei prodotti')}
title={t('Digita per cercare nel nostro catalogo')}
/>Proprietà dell’oggetto
const t = useGT();
const user = {
name: 'John',
role: 'admin',
bio: t('Sviluppatore software con 5 anni di esperienza in React'),
status: t('Attualmente disponibile per nuovi progetti')
};Configurazione e costanti
const t = useGT();
const navigationItems = [
{ label: t('Home'), href: '/' },
{ label: t('Prodotti'), href: '/products' },
{ label: t('Contatti'), href: '/contact' }
];Quando usare <T> invece
Usa il componente <T> per i contenuti JSX:
// ✅ Usa <T> per i contenuti JSX
<T><p>Benvenuto nel <strong>nostro negozio</strong>!</p></T>
// ✅ Usa la traduzione di stringhe per il testo semplice
<input placeholder={t('Cerca prodotti')} />Uso delle variabili
Variabili di base
Sostituisci i placeholder con valori dinamici:
const t = useGT();
const itemCount = 5;
// String with placeholder
const message = t('Hai {count} articoli nel carrello', { count: itemCount });
// Risultato: "Hai 5 articoli nel carrello"Più variabili
const t = useGT();
const order = { id: 'ORD-123', total: 99.99, date: '2024-01-15' };
const confirmation = t(
'Ordine {orderId} di ${total} effettuato il {date}',
{
orderId: order.id,
total: order.total,
date: order.date
}
);Formato dei messaggi ICU
Per la formattazione avanzata, utilizza la sintassi ICU:
const t = useGT();
translate('Nel carrello {count, plural, =0 {non ci sono articoli} =1 {c’è un articolo} other {ci sono {count} articoli}}', { count: 10 });Scopri di più sul formato dei messaggi ICU nella documentazione di Unicode.
Esempi
Campi del form
import { useGT } from 'gt-react';
function ContactForm() {
const t = useGT();
return (
<form>
<input
type="email"
placeholder={t('Inserisci il tuo indirizzo email')}
aria-label={t('Campo email')}
/>
<textarea
placeholder={t('Raccontaci del tuo progetto...')}
aria-label={t('Descrizione del progetto')}
/>
<button type="submit">
{t('Invia messaggio')}
</button>
</form>
);
}Menu di navigazione
import { useGT } from 'gt-react';
function Navigation() {
const t = useGT();
const menuItems = [
{ label: t('Home'), href: '/', icon: 'home' },
{ label: t('Chi Siamo'), href: '/about', icon: 'info' },
{ label: t('Servizi'), href: '/services', icon: 'briefcase' },
{ label: t('Contatti'), href: '/contact', icon: 'mail' }
];
return (
<nav>
{menuItems.map((item) => (
<a key={item.href} href={item.href} title={item.label}>
<Icon name={item.icon} />
{item.label}
</a>
))}
</nav>
);
}Fabbrica di contenuti dinamici
// utils/productData.js
export function getProductMessages(t) {
return {
categories: [
{ id: 'electronics', name: t('Elettronica') },
{ id: 'clothing', name: t('Abbigliamento') },
{ id: 'books', name: t('Libri') }
],
statusMessages: {
available: t('Disponibile e pronto per la spedizione'),
backordered: t('Attualmente in preordine - spedizione in 2-3 settimane'),
discontinued: t('Questo articolo è stato interrotto')
},
errors: {
notFound: t('Prodotto non trovato'),
outOfStock: t('Siamo spiacenti, questo articolo è attualmente esaurito')
}
};
}
// components/ProductCard.jsx
import { useGT } from 'gt-react';
import { getProductMessages } from '../utils/productData';
function ProductCard({ product }) {
const t = useGT();
const messages = getProductMessages(t);
return (
<div>
<h3>{product.name}</h3>
<p>{messages.statusMessages[product.status]}</p>
<span>{messages.categories.find(c => c.id === product.categoryId)?.name}</span>
</div>
);
}Componente con titolo del documento
import { useGT } from 'gt-react';
import { useEffect } from 'react';
function ProductPage() {
const t = useGT();
useEffect(() => {
document.title = t('Catalogo prodotti - Trova quello che ti serve');
// Aggiorna la meta description
const metaDescription = document.querySelector('meta[name="description"]');
if (metaDescription) {
metaDescription.setAttribute('content', t('Esplora la nostra ampia selezione di prodotti di alta qualità'));
}
}, [t]);
return (
<div>
<h1>{t('Prodotti in evidenza')}</h1>
<p>{t('Scopri i nostri articoli più recenti e popolari')}</p>
</div>
);
}Problemi comuni
Contenuti dinamici a runtime
Le stringhe devono essere note in fase di build: non è possibile tradurre contenuti dinamici.
// ❌ I contenuti dinamici non funzioneranno
function MyComponent() {
const [userMessage, setUserMessage] = useState('');
const t = useGT();
return <p>{t(userMessage)}</p>; // Questo non funzionerà
}
// ✅ Usa stringhe predefinite
function MyComponent() {
const [messageType, setMessageType] = useState('welcome');
const t = useGT();
const messages = {
welcome: t('Benvenuto nella nostra app!'),
goodbye: t('Grazie per la visita!')
};
return <p>{messages[messageType]}</p>;
}Violazioni delle regole dei hook
Segui le regole dei hook di React quando usi useGT:
// ❌ Non chiamare gli hook in modo condizionale
function MyComponent({ showMessage }) {
if (showMessage) {
const t = useGT(); // Violazione delle regole sugli hook
return <p>{t('Ciao!')}</p>;
}
return null;
}
// ✅ Chiama sempre gli hook al livello superiore
function MyComponent({ showMessage }) {
const t = useGT();
if (showMessage) {
return <p>{t('Ciao!')}</p>;
}
return null;
}Per contenuti veramente dinamici che richiedono la traduzione a runtime, consulta la Guida ai contenuti dinamici.
Prossimi passi
- Guida ai contenuti dinamici - Gestione delle traduzioni a runtime
- Guida alle stringhe condivise - Organizzazione delle traduzioni riutilizzabili
- Riferimenti API:
Come valuti questa guida?