# 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 (
);
}
```
### 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)