# react-native: Stringhe condivise URL: https://generaltranslation.com/it/docs/react-native/guides/shared-strings.mdx --- title: Stringhe condivise description: Come internazionalizzare le stringhe usate in più componenti e in più file --- {/* GENERATO AUTOMATICAMENTE: non modificare direttamente. Modifica invece il modello in content/docs-templates/. */} Le stringhe condivise sono valori testuali utilizzati in più punti dell'applicazione, come etichette di navigazione, messaggi dei moduli o dati di configurazione. Invece di duplicare ovunque la logica di traduzione, usa [`msg`](/docs/react-native/api/strings/msg) per contrassegnare le stringhe da tradurre e [`useMessages`](/docs/react-native/api/strings/use-messages) per decodificarle. ## Il problema dei contenuti condivisi Considera questa configurazione di navigazione utilizzata in tutta l'app: ```tsx // navData.ts export const navData = [ { label: 'Home', description: 'The home page', href: '/' }, { label: 'About', description: 'Information about the company', href: '/about' } ]; ``` Per internazionalizzare questo codice, in genere dovresti: 1. Trasformarlo in una funzione che accetta una funzione di traduzione 2. Aggiornare tutti gli utilizzi in modo che chiamino la funzione con `t` 3. Gestire la complessità nell'intera codebase Questo aumenta il carico di manutenzione e rende il codice più difficile da leggere. La funzione [`msg`](/docs/react-native/api/strings/msg) risolve il problema consentendoti di contrassegnare le stringhe da tradurre direttamente nel codice e poi decodificarle quando necessario. ## Guida rapida Usa [`msg`](/docs/react-native/api/strings/msg) per contrassegnare le stringhe e [`useMessages`](/docs/react-native/api/strings/use-messages) per decodificarle: ```tsx // navData.ts - Contrassegna le stringhe per la traduzione import { msg } from 'gt-react-native'; export const navData = [ { label: msg('Home'), description: msg('The home page'), href: '/' }, { label: msg('About'), description: msg('Information about the company'), href: '/about' } ]; ``` ```tsx // Utilizzo del componente - Decodifica le stringhe contrassegnate import { useMessages } from 'gt-react-native'; import { navData } from './navData'; function Navigation() { const m = useMessages(); return ( ); } ``` ## Come funzionano le stringhe condivise Il sistema di stringhe condivise funziona in due fasi: 1. **Fase di marcatura**: [`msg`](/docs/react-native/api/strings/msg) codifica le stringhe con metadati di traduzione 2. **Fase di decodifica**: [`useMessages`](/docs/react-native/api/strings/use-messages) decodifica e traduce le stringhe ```tsx // msg() codifica la stringa con i metadati const encoded = msg('Hello, world!'); console.log(encoded); // "Hello, world!:eyIkX2hhc2giOiJkMjA3MDliZGExNjNlZmM2In0=" // useMessages() decodifica e traduce const m = useMessages(); const translated = m(encoded); // "Hello, world!" nella lingua dell'utente ``` Le stringhe codificate con [`msg`](/docs/react-native/api/strings/msg) non possono essere usate direttamente: devono essere decodificate con [`useMessages`](/docs/react-native/api/strings/use-messages). ## Componenti Usa l’hook [`useMessages`](/docs/react-native/api/strings/use-messages): ```tsx import { useMessages } from 'gt-react-native'; const encodedString = msg('Hello, world!'); function MyComponent() { const m = useMessages(); return
{m(encodedString)}
; } ``` ## Recuperare le stringhe originali con decodeMsg A volte devi accedere alla stringa originale senza tradurla, ad esempio per il logging, il debug o i confronti. Usa [`decodeMsg`](/docs/react-native/api/strings/msg) per estrarre il testo originale: ```tsx import { decodeMsg } from 'gt-react-native'; const encoded = msg('Hello, world!'); const original = decodeMsg(encoded); // "Hello, world!" (originale) const translated = m(encoded); // "Hello, world!" (nella lingua dell'utente) // Utile per logging o debugging console.log('Stringa originale:', decodeMsg(encoded)); console.log('Stringa tradotta:', m(encoded)); ``` ### Casi d'uso di decodeMsg * **Sviluppo & Debugging**: Registra le stringhe originali per il debug * **Gestione del fallback**: Usa il testo originale quando le traduzioni non vanno a buon fine * **Confronti tra stringhe**: Confronta con valori originali noti * **Analitica**: Monitora l'uso delle stringhe originali ```tsx // Esempio: gestione del fallback function getDisplayText(encodedStr) { const m = useMessages(); try { return m(encodedStr); } catch (error) { console.warn('Traduzione fallita, utilizzo l\'originale:', decodeMsg(encodedStr)); return decodeMsg(encodedStr); } } ``` ## Uso delle variabili Per le stringhe con contenuti dinamici, usa i segnaposto e passa le variabili: ```tsx // Contrassegna la stringa con variabili const items = 100; export const pricing = [ { name: 'Basic', price: 100, description: msg('The basic plan includes {items} items', { items }) } ]; ``` ```tsx // Usa nel componente function PricingCard() { const m = useMessages(); return (

{pricing[0].name}

{m(pricing[0].description)}

); } ``` ### Formato dei messaggi ICU Per la formattazione avanzata, usa la sintassi ICU: ```tsx const count = 10; const message = msg('There are {count, plural, =0 {no items} =1 {one item} other {{count} items}} in the cart', { count }); ``` Scopri di più sul formato dei messaggi ICU nella [documentazione Unicode](https://unicode-org.github.io/icu/userguide/format_parse/messages/). ## Esempi ### Configurazione della navigazione ```tsx // config/navigation.ts import { msg } from 'gt-react-native'; export const mainNav = [ { label: msg('Home'), href: '/', icon: 'home' }, { label: msg('Products'), href: '/products', icon: 'package' }, { label: msg('About Us'), href: '/about', icon: 'info' } ]; export const footerLinks = [ { title: msg('Company'), links: [ { label: msg('About'), href: '/about' }, { label: msg('Careers'), href: '/careers' }, { label: msg('Contact'), href: '/contact' } ] }, { title: msg('Support'), links: [ { label: msg('Help Center'), href: '/help' }, { label: msg('Documentation'), href: '/docs' }, { label: msg('API Reference'), href: '/api' } ] } ]; ``` ```tsx // components/Navigation.tsx import { useMessages } from 'gt-react-native'; import { mainNav } from '../config/navigation'; function Navigation() { const m = useMessages(); return ( ); } ``` ### Configurazione del form ```tsx // config/forms.ts import { msg } from 'gt-react-native'; export const formMessages = { placeholders: { email: msg('Enter your email address'), password: msg('Enter your password'), message: msg('Type your message here...') }, actions: { send: msg('Send Message'), save: msg('Save Changes'), cancel: msg('Cancel') }, validation: { required: msg('This field is required'), email: msg('Please enter a valid email address'), minLength: msg('Must be at least {min} characters', { min: 8 }), maxLength: msg('Cannot exceed {max} characters', { max: 100 }) }, success: { saved: msg('Changes saved successfully'), sent: msg('Message sent successfully'), updated: msg('Profile updated') }, errors: { network: msg('Network error - please try again'), server: msg('Server error - please contact support'), timeout: msg('Request timed out - please try again') } }; ``` ```tsx // components/ContactForm.tsx import { useMessages } from 'gt-react-native'; import { formMessages } from '../config/forms'; function ContactForm() { const m = useMessages(); const [errors, setErrors] = useState({}); return (
{errors.email && {m(formMessages.validation.email)}}
); } ``` ### Generazione dinamica dei contenuti ```tsx // utils/productData.ts import { msg } from 'gt-react-native'; function mockProducts() { return [ { name: 'iPhone 15', company: 'Apple', category: 'Electronics' }, { name: 'Galaxy S24', company: 'Samsung', category: 'Electronics' } ]; } export function getProductData() { const products = mockProducts(); return products.map(product => ({ ...product, description: msg('{name} is a {category} product by {company}', { name: product.name, category: product.category, company: product.company }) })); } ``` ```tsx // components/ProductList.tsx import { useMessages } from 'gt-react-native'; import { getProductData } from '../utils/productData'; function ProductList() { const m = useMessages(); const products = getProductData(); return (
{products.map(product => (

{product.name}

{m(product.description)}

))}
); } ``` ## Problemi comuni ### Uso diretto di stringhe codificate Non usare mai direttamente l'output di [`msg`](/docs/react-native/api/strings/msg): ```tsx // ❌ Errato - la stringa codificata viene usata direttamente const encoded = msg('Hello, world!'); return
{encoded}
; // Mostra la stringa codificata, non la traduzione // ✅ Corretto - decodifica prima la stringa const encoded = msg('Hello, world!'); const m = useMessages(); return
{m(encoded)}
; // Mostra la traduzione corretta ``` ### Contenuto dinamico in msg() Le stringhe devono essere note in fase di build: ```tsx // ❌ Errato - template literal dinamico const name = 'John'; const message = msg(`Hello, ${name}`); // Errore in fase di build // ✅ Corretto - usa le variabili const name = 'John'; const message = msg('Hello, {name}', { name }); ``` ### Mancata decodifica Ogni stringa [`msg`](/docs/react-native/api/strings/msg) deve essere decodificata: ```tsx // ❌ Decodifica mancante const config = { title: msg('Dashboard'), subtitle: msg('Welcome back') }; // Più avanti nel componente - decodifica dimenticata return

{config.title}

; // Mostra la stringa codificata // ✅ Corretto - decodifica al momento dell'utilizzo const m = useMessages(); return

{m(config.title)}

; // Mostra il titolo tradotto ``` ## Passaggi successivi * [Guida ai dizionari](/docs/react-native/guides/dictionaries) - Organizza le traduzioni con dati strutturati * [Guida alle lingue](/docs/react-native/guides/languages) - Configura le lingue supportate * Riferimenti API: * [Funzione `msg`](/docs/react-native/api/strings/msg)