# gt-react: General Translation React SDK: Chaînes partagées
URL: https://generaltranslation.com/fr/docs/react/guides/shared-strings.mdx
---
title: Chaînes partagées
description: Comment internationaliser les chaînes utilisées dans plusieurs composants et fichiers
---
{/* GÉNÉRÉ AUTOMATIQUEMENT : ne modifiez pas ce fichier directement. Modifiez plutôt le modèle dans content/docs-templates/. */}
Les chaînes partagées sont des valeurs textuelles utilisées à plusieurs endroits de votre application, comme les libellés de navigation, les messages de formulaire ou les données de configuration. Au lieu de dupliquer la logique de traduction partout, utilisez [`msg`](/docs/react/api/strings/msg) pour marquer les chaînes à traduire et [`useMessages`](/docs/react/api/strings/use-messages) pour les décoder.
## Le problème des contenus partagés
Prenons cette configuration de navigation utilisée dans toute l’application :
```tsx
// navData.ts
export const navData = [
{
label: 'Home',
description: 'The home page',
href: '/'
},
{
label: 'About',
description: 'Information about the company',
href: '/about'
}
];
```
Pour internationaliser cela, il faut généralement :
1. Le convertir en fonction qui accepte une fonction de traduction
2. Mettre à jour chaque utilisation pour appeler la fonction avec `t`
3. Gérer cette complexité dans l’ensemble de votre base de code
Cela ajoute une charge de maintenance et rend votre code plus difficile à lire. La fonction [`msg`](/docs/react/api/strings/msg) résout ce problème en vous permettant de marquer les chaînes à traduire directement à l’endroit voulu, puis de les décoder au moment nécessaire.
## Démarrage rapide
Utilisez [`msg`](/docs/react/api/strings/msg) pour marquer les chaînes et [`useMessages`](/docs/react/api/strings/use-messages) pour les décoder :
```tsx
// navData.ts - Marquer les chaînes pour la traduction
import { msg } from 'gt-react';
export const navData = [
{
label: msg('Home'),
description: msg('The home page'),
href: '/'
},
{
label: msg('About'),
description: msg('Information about the company'),
href: '/about'
}
];
```
```tsx
// Utilisation du composant - Décodage des chaînes marquées
import { useMessages } from 'gt-react';
import { navData } from './navData';
function Navigation() {
const m = useMessages();
return (
);
}
```
## Fonctionnement des chaînes partagées
Le système de chaînes partagées fonctionne en deux phases :
1. **Phase de marquage** : [`msg`](/docs/react/api/strings/msg) encode les chaînes avec des métadonnées de traduction
2. **Phase de décodage** : [`useMessages`](/docs/react/api/strings/use-messages) décode et traduit les chaînes
```tsx
// msg() encode la chaîne avec les métadonnées
const encoded = msg('Hello, world!');
console.log(encoded); // "Hello, world!:eyIkX2hhc2giOiJkMjA3MDliZGExNjNlZmM2In0="
// useMessages() décode et traduit
const m = useMessages();
const translated = m(encoded); // "Hello, world!" dans la langue de l'utilisateur
```
Les chaînes encodées issues de [`msg`](/docs/react/api/strings/msg) ne peuvent pas être utilisées directement ; elles doivent être décodées avec [`useMessages`](/docs/react/api/strings/use-messages).
## Composants
Utilisez le hook [`useMessages`](/docs/react/api/strings/use-messages) :
```tsx
import { useMessages } from 'gt-react';
const encodedString = msg('Hello, world!');
function MyComponent() {
const m = useMessages();
return
{m(encodedString)}
;
}
```
## Obtenir les chaînes source avec decodeMsg
Vous devez parfois accéder à la chaîne source sans traduction, par exemple pour la journalisation, le débogage ou des comparaisons. Utilisez [`decodeMsg`](/docs/react/api/strings/msg) pour extraire le texte d’origine :
```tsx
import { decodeMsg } from 'gt-react';
const encoded = msg('Hello, world!');
const original = decodeMsg(encoded); // "Hello, world!" (original)
const translated = m(encoded); // "Hello, world!" (dans la langue de l'utilisateur)
// Utile pour la journalisation ou le débogage
console.log('Chaîne source :', decodeMsg(encoded));
console.log('Chaîne traduite :', m(encoded));
```
### Cas d'utilisation de decodeMsg
* **Développement & débogage** : Journaliser les chaînes source pour faciliter le dépannage
* **Gestion des solutions de repli** : Utiliser le texte d'origine lorsque les traductions échouent
* **Comparaisons de chaînes** : Comparer avec des valeurs d'origine connues
* **Analyse** : Suivre l'utilisation des chaînes source
```tsx
// Exemple : gestion des replis
function getDisplayText(encodedStr) {
const m = useMessages();
try {
return m(encodedStr);
} catch (error) {
console.warn('Échec de la traduction, utilisation de l\'original :', decodeMsg(encodedStr));
return decodeMsg(encodedStr);
}
}
```
## Utiliser des variables
Pour les chaînes contenant du contenu dynamique, utilisez des placeholders et passez des variables :
```tsx
// Marquer la chaîne avec des variables
const items = 100;
export const pricing = [
{
name: 'Basic',
price: 100,
description: msg('The basic plan includes {items} items', { items })
}
];
```
```tsx
// Utilisation dans le composant
function PricingCard() {
const m = useMessages();
return (
{pricing[0].name}
{m(pricing[0].description)}
);
}
```
### Format de message ICU
Pour un formatage avancé, utilisez la syntaxe 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 });
```
Pour en savoir plus sur le format de message ICU, consultez la [documentation d’Unicode](https://unicode-org.github.io/icu/userguide/format_parse/messages/).
## Exemples
### Configuration de la navigation
```tsx
// config/navigation.ts
import { msg } from 'gt-react';
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';
import { mainNav } from '../config/navigation';
function Navigation() {
const m = useMessages();
return (
);
}
```
### Configuration du formulaire
```tsx
// config/forms.ts
import { msg } from 'gt-react';
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';
import { formMessages } from '../config/forms';
function ContactForm() {
const m = useMessages();
const [errors, setErrors] = useState({});
return (
);
}
```
### Génération dynamique de contenu
```tsx
// utils/productData.ts
import { msg } from 'gt-react';
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';
import { getProductData } from '../utils/productData';
function ProductList() {
const m = useMessages();
const products = getProductData();
return (
{products.map(product => (
{product.name}
{m(product.description)}
))}
);
}
```
## Problèmes courants
### Utiliser directement des chaînes encodées
N’utilisez jamais directement le résultat de [`msg`](/docs/react/api/strings/msg) :
```tsx
// ❌ Incorrect - chaîne encodée utilisée directement
const encoded = msg('Hello, world!');
return
{encoded}
; // Affiche la chaîne encodée, pas la traduction
// ✅ Correct - décoder d'abord la chaîne
const encoded = msg('Hello, world!');
const m = useMessages();
return
{m(encoded)}
; // Affiche la traduction correcte
```
### Contenu dynamique dans msg()
Les chaînes doivent être connues au build :
```tsx
// ❌ Incorrect - littéral de gabarit dynamique
const name = 'John';
const message = msg(`Hello, ${name}`); // Erreur au build
// ✅ Correct - utiliser des variables
const name = 'John';
const message = msg('Hello, {name}', { name });
```
### Oublier de décoder
Chaque chaîne [`msg`](/docs/react/api/strings/msg) doit être décodée :
```tsx
// ❌ Décodage manquant
const config = {
title: msg('Dashboard'),
subtitle: msg('Welcome back')
};
// Plus tard dans le composant - décodage oublié
return
{config.title}
; // Affiche la chaîne encodée
// ✅ Correct - décoder au moment de l'utilisation
const m = useMessages();
return
{m(config.title)}
; // Affiche le titre traduit
```
## Étapes suivantes
* [Guide des dictionnaires](/docs/react/guides/dictionaries) - Organisez les traductions à l’aide de données structurées
* [Guide des langues](/docs/react/guides/languages) - Configurez les langues prises en charge
* Références de l’API :
* [Fonction `msg`](/docs/react/api/strings/msg)