# react-native: Chaînes de caractères partagées URL: https://generaltranslation.com/fr/docs/react-native/guides/shared-strings.mdx --- title: Chaînes de caractères partagées description: Comment internationaliser des chaînes de caractères utilisées dans plusieurs composants et fichiers --- {/* GÉNÉRÉ AUTOMATIQUEMENT : ne modifiez pas directement. Modifiez plutôt le template dans content/docs-templates/. */} Les chaînes de caractères partagées sont des valeurs textuelles utilisées à plusieurs endroits de votre application, comme des libellés de navigation, des messages de formulaire ou des données de configuration. Au lieu de dupliquer la logique de traduction partout, utilisez [`msg`](/docs/react-native/api/strings/msg) pour marquer les chaînes de caractères à traduire et [`useMessages`](/docs/react-native/api/strings/use-messages) pour les décoder. ## Le problème du contenu partagé Prenez cette configuration de navigation utilisée dans toute votre application : ```tsx // navData.ts export const navData = [ { label: 'Home', description: 'The home page', href: '/' }, { label: 'About', description: 'Information about the company', href: '/about' } ]; ``` Pour l’internationaliser, vous devez généralement : 1. Le transformer en fonction qui accepte une fonction de traduction 2. Mettre à jour chaque utilisation pour appeler cette fonction avec `t` 3. Gérer cette complexité dans l’ensemble de votre base de code Cela alourdit la maintenance et rend votre code plus difficile à lire. La fonction [`msg`](/docs/react-native/api/strings/msg) résout ce problème en vous permettant de marquer les chaînes de caractères à traduire directement là où elles se trouvent, puis de les décoder au moment voulu. ## Démarrage rapide Utilisez [`msg`](/docs/react-native/api/strings/msg) pour marquer les chaînes de caractères et [`useMessages`](/docs/react-native/api/strings/use-messages) pour les décoder : ```tsx // navData.ts - Marquer les chaînes de caractères pour la traduction 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 // Utilisation du composant - Décoder les chaînes de caractères marquées import { useMessages } from 'gt-react-native'; import { navData } from './navData'; function Navigation() { const m = useMessages(); return ( ); } ``` ## Fonctionnement des chaînes de caractères partagées Le système de chaînes de caractères partagées fonctionne en deux phases : 1. **Phase de marquage** : [`msg`](/docs/react-native/api/strings/msg) encode les chaînes avec des métadonnées de traduction 2. **Phase de décodage** : [`useMessages`](/docs/react-native/api/strings/use-messages) décode et traduit les chaînes ```tsx // msg() encode la chaîne de caractères 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 de caractères encodées par [`msg`](/docs/react-native/api/strings/msg) ne peuvent pas être utilisées directement : elles doivent être décodées avec [`useMessages`](/docs/react-native/api/strings/use-messages). ## Composants Utilisez le 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)}
; } ``` ## Récupérer les chaînes source avec decodeMsg Vous pouvez parfois avoir besoin d’accéder à la chaîne source sans traduction, par exemple pour la journalisation, le débogage ou des comparaisons. Utilisez [`decodeMsg`](/docs/react-native/api/strings/msg) pour extraire le texte source : ```tsx import { decodeMsg } from 'gt-react-native'; 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('Original string:', decodeMsg(encoded)); console.log('Translated string:', m(encoded)); ``` ### Cas d’utilisation de decodeMsg * **Développement & débogage** : Consigner les chaînes d’origine pour faciliter le dépannage * **Gestion du repli** : Utiliser le texte d’origine lorsque les traductions échouent * **Comparaisons de chaînes de caractères** : Comparer à des valeurs d’origine connues * **Analyse d’utilisation** : Suivre l’utilisation des chaînes d’origine ```tsx // Exemple : gestion du repli 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 de caractères contenant du contenu dynamique, utilisez des placeholders et passez des variables : ```tsx // Marquer la chaîne de caractères 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 des messages 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 des messages ICU, consultez la [documentation 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-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 ( ); } ``` ### Configuration du formulaire ```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)}}
); } ``` ### Génération dynamique de contenu ```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)}

))}
); } ``` ## Problèmes fréquents ### Utiliser directement des chaînes de caractères encodées N'utilisez jamais directement le résultat de [`msg`](/docs/react-native/api/strings/msg) : ```tsx // ❌ Incorrect - chaîne de caractères encodée utilisée directement const encoded = msg('Hello, world!'); return
{encoded}
; // Affiche la chaîne de caractères encodée, pas la traduction // ✅ Correct - décoder d'abord la chaîne de caractères const encoded = msg('Hello, world!'); const m = useMessages(); return
{m(encoded)}
; // Affiche la traduction correcte ``` ### Contenu dynamique dans msg() Les chaînes de caractères doivent être connues dès le build : ```tsx // ❌ Incorrect - littéral de template 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 }); ``` ### Oubli du décodage Chaque chaîne de caractères [`msg`](/docs/react-native/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 de caractères 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-native/guides/dictionaries) - Organisez les traductions avec des données structurées * [Guide des langues](/docs/react-native/guides/languages) - Configurez les langues prises en charge * Références d’API : * [Fonction `msg`](/docs/react-native/api/strings/msg)