# gt-react: General Translation React SDK: Internationaliser une mini-boutique URL: https://generaltranslation.com/fr/docs/react/tutorials/mini-shop.mdx --- title: Internationaliser une mini-boutique description: Un tutoriel React pratique pour internationaliser une boutique simple à l’aide des composants React GT, des hooks et de chaînes partagées --- Mettez en place et traduisez une petite « mini-boutique » entièrement en local — sans services externes, sans routage, sans framework d’interface utilisateur. Vous utiliserez les fonctionnalités principales de GT React de bout en bout et verrez comment elles s’intègrent dans une interface simple et réaliste. Prérequis : React, bases de JavaScript/TypeScript Ce que vous allez créer * Une « boutique » monopage avec une grille de produits et un panier simple en mémoire * Un sélecteur de langue et des libellés de navigation partagés * Des nombres, devises et pluriels correctement internationalisés * Facultatif : stockage local des traductions pour les builds de production Liens utilisés dans ce tutoriel * Provider : [``](/docs/react/api/components/gtprovider) * Composants : [``](/docs/react/api/components/t), [``](/docs/react/api/components/var), [``](/docs/react/api/components/num), [``](/docs/react/api/components/currency), [``](/docs/react/api/components/datetime), [``](/docs/react/api/components/branch), [``](/docs/react/api/components/plural), [``](/docs/react/api/components/locale-selector) * Chaînes de caractères et chaînes partagées : [`useGT`](/docs/react/api/strings/use-gt), [`msg`](/docs/react/api/strings/msg), [`useMessages`](/docs/react/api/strings/use-messages) * Guides : [Variables](/docs/react/guides/variables), [Branches conditionnelles](/docs/react/guides/branches), [Chaînes](/docs/react/guides/strings), [Stockage local des traductions](/docs/react/guides/local-tx), [Changer de langue](/docs/react/guides/languages) *** ## Installez et enveloppez votre application Installez les packages et enveloppez votre application avec le provider. ```bash npm i gt-react npm i --save-dev gt ``` ```bash yarn add gt-react yarn add --dev gt ``` ```bash bun add gt-react bun add --dev gt ``` ```bash pnpm add gt-react pnpm add --save-dev gt ``` Facultatif : projet de départ (Vite) Si vous partez de zéro, générez une application React + TypeScript avec Vite, puis installez les packages GT : ```bash copy npm create vite@latest mini-shop -- --template react-ts cd mini-shop npm i gt-react npm i --save-dev gt ``` Ajoutez ensuite les fichiers indiqués dans les sections ci-dessous (par exemple, `src/main.tsx`, `src/App.tsx`, `src/components/*`, `src/data.ts`, `src/nav.ts`). Mettez en place une configuration minimale du provider. ```tsx title="src/main.tsx" copy import { StrictMode } from 'react'; import { createRoot } from 'react-dom/client'; import { GTProvider } from 'gt-react'; // Voir : /docs/react/api/components/gtprovider import App from './App'; createRoot(document.getElementById('root')!).render( {/* Activer l'espagnol et le français */} ); ``` Vous pouvez aussi ajouter un `gt.config.json` dès maintenant (utile plus tard pour l’intégration continue et le stockage local) : ```json title="gt.config.json" copy { "defaultLocale": "en", "locales": ["es", "fr"] } ``` ### Clés API de développement Vous pouvez suivre ce tutoriel sans clés API (l’application affichera la langue par défaut). Pour voir les traductions en direct et tester le changement de langue en développement, ajoutez des clés de développement. Pour en savoir plus, consultez [Production ou développement](/docs/react/concepts/environments). ```bash title=".env.local" copy VITE_GT_API_KEY="your-dev-api-key" VITE_GT_PROJECT_ID="your-project-id" ``` ```bash title=".env.local" copy REACT_APP_GT_API_KEY="your-dev-api-key" REACT_APP_GT_PROJECT_ID="your-project-id" ``` * tableau de bord : https://dash.generaltranslation.com/signup * Ou via la CLI : ```bash copy npx gt auth ``` *** ## Données initiales et structure de l’application Nous allons coder en dur un petit tableau de produits et tout garder côté client. Ni serveur ni routage. ```ts title="src/data.ts" copy export type Product = { id: string; name: string; description: string; price: number; currency: 'USD' | 'EUR'; inStock: boolean; addedAt: string; // chaîne de date ISO }; export const products: Product[] = [ { id: 'p-1', name: 'Wireless Headphones', description: 'Noise-cancelling over-ear design with 30h battery', price: 199.99, currency: 'USD', inStock: true, addedAt: new Date().toISOString() }, { id: 'p-2', name: 'Travel Mug', description: 'Double-wall insulated stainless steel (12oz)', price: 24.5, currency: 'USD', inStock: false, addedAt: new Date().toISOString() } ]; ``` *** ## Libellés de navigation partagés avec msg et useMessages Utilisez [`msg`](/docs/react/api/strings/msg) pour marquer les chaînes partagées dans la configuration, puis décodez-les avec [`useMessages`](/docs/react/api/strings/use-messages) au moment du rendu. ```tsx title="src/nav.ts" copy import { msg } from 'gt-react'; // Voir : /docs/react/api/strings/msg export const nav = [ { label: msg('Home'), href: '#' }, { label: msg('Products'), href: '#products' }, { label: msg('Cart'), href: '#cart' } ]; ``` ```tsx title="src/components/Header.tsx" copy import { LocaleSelector, T } from 'gt-react'; import { useMessages } from 'gt-react'; // Voir : /docs/react/api/strings/use-messages import { nav } from '../nav'; export default function Header() { const m = useMessages(); return (

Mini Shop

{/* Voir : /docs/react/api/components/t */}
{/* Voir : /docs/react/api/components/locale-selector */}
); } ``` *** ## Cartes produit avec T, des composants variables, Branch et Currency Utilisez [``](/docs/react/api/components/t) pour traduire du JSX. Encapsulez le contenu dynamique avec des composants variables comme [``](/docs/react/api/components/var), [``](/docs/react/api/components/num), [``](/docs/react/api/components/currency) et [``](/docs/react/api/components/datetime). Gérez l’état du stock avec [``](/docs/react/api/components/branch). ```tsx title="src/components/ProductCard.tsx" copy import { T, Var, Num, Currency, DateTime, Branch } from 'gt-react'; import type { Product } from '../data'; export default function ProductCard({ product, onAdd }: { product: Product; onAdd: () => void; }) { return (

{product.name}

{product.description}

Price: {product.price}

Added: {new Date(product.addedAt)}

In stock

} false={

Out of stock

} />
); } ``` *** ## Panier avec gestion du pluriel et totaux Utilisez [``](/docs/react/api/components/plural) pour exprimer « X articles dans le panier » et [``](/docs/react/api/components/currency) pour les totaux. Combinez-les avec [``](/docs/react/api/components/t), [``](/docs/react/api/components/var) et [``](/docs/react/api/components/num). ```tsx title="src/components/Cart.tsx" copy import { T, Plural, Var, Num, Currency } from 'gt-react'; import type { Product } from '../data'; export default function Cart({ items, onClear }: { items: Product[]; onClear: () => void; }) { const total = items.reduce((sum, p) => sum + p.price, 0); const itemCount = items.length; return (

Cart

Your cart is empty

} one={

You have {itemCount} item

} other={

You have {itemCount} items

} />
{items.map((p) => (

{p.name}{p.price}

))}

Total: {total}

); } ``` *** ## Attributs et placeholders avec `useGT` Utilisez [`useGT`](/docs/react/api/strings/use-gt) pour traduire des chaînes simples, comme les placeholders des champs de saisie et les libellés ARIA. ```tsx title="src/components/Search.tsx" copy import { useGT } from 'gt-react'; export default function Search({ onQuery }: { onQuery: (q: string) => void; }) { const gt = useGT(); return ( onQuery(e.target.value)} style={{ padding: 8, width: '100%', maxWidth: 320 }} /> ); } ``` *** ## Assembler l’ensemble Une application monopage avec un panier en mémoire et un filtre de recherche simple. ```tsx title="src/App.tsx" copy import { useMemo, useState } from 'react'; import Header from './components/Header'; import Search from './components/Search'; import ProductCard from './components/ProductCard'; import Cart from './components/Cart'; import { products } from './data'; export default function App() { const [query, setQuery] = useState(''); const [cart, setCart] = useState([]); const filtered = useMemo(() => { const q = query.toLowerCase(); return products.filter(p => p.name.toLowerCase().includes(q) || p.description.toLowerCase().includes(q) ); }, [query]); const items = products.filter(p => cart.includes(p.id)); return (
{filtered.map(p => ( setCart(c => (p.inStock ? [...new Set([...c, p.id])] : c))} /> ))}
setCart([])} />
); } ``` *** ## Exécutez en local Ajoutez un script de développement simple à votre `package.json`, puis démarrez l’application. ```json title="package.json" copy { "scripts": { "dev": "vite" } } ``` Exécutez : ```bash npm run dev ``` ```json title="package.json" copy { "scripts": { "start": "react-scripts start" } } ``` Exécutez : ```bash npm start ``` *** ## Ce que vous avez appris * Traduire du JSX avec [``](/docs/react/api/components/t) et gérer le contenu dynamique à l’aide de [``](/docs/react/api/components/var), [``](/docs/react/api/components/num), [``](/docs/react/api/components/currency), [``](/docs/react/api/components/datetime) * Exprimer du contenu conditionnel avec [``](/docs/react/api/components/branch) et des quantités avec [``](/docs/react/api/components/plural) * Traduire des attributs avec [`useGT`](/docs/react/api/strings/use-gt) * Partager des chaînes de navigation et de configuration avec [`msg`](/docs/react/api/strings/msg) et les décoder avec [`useMessages`](/docs/react/api/strings/use-messages) * Changer de langue avec [``](/docs/react/api/components/locale-selector) ## Étapes suivantes * Explorez : [Guide des variables](/docs/react/guides/variables), [Guide des branches conditionnelles](/docs/react/guides/branches), [Guide des chaînes](/docs/react/guides/strings), [Changer de langue](/docs/react/guides/languages)