Le Problème de Nommage à 1 Millions de Dollars
Nommer des variables est difficile. Nommer des clés de traduction est encore plus difficile car vous le faites pour deux publics différents :
- Développeurs qui doivent les trouver et les utiliser dans le code.
- Traducteurs (ou IA) qui ont besoin de contexte pour traduire correctement.
Faites-le mal, et vous vous retrouvez avec common.button.save_final_v2_new et une base de code que tout le monde a peur de toucher.
Voici comment nommer et gérer vos clés de traduction en 2026.
1. Sémantique vs Descriptif
L'erreur la plus courante est de nommer les clés en fonction de leur contenu en anglais plutôt que de leur signification dans l'application.
❌ Mauvais : Basé sur le Contenu
JSON1{ 2 "Hello_World": "Hello World", 3 "Click_Here": "Click Here", 4 "Save_Button_Blue": "Save Changes" 5}
Pourquoi ça échoue : "Click Here" pour quoi ? "Save Button" où ? Si vous changez le texte de "Save Changes" à "Update", la clé Save_Button_Blue est maintenant un mensonge.
✅ Bon : Basé sur la Sémantique (Contextuel)
JSON1{ 2 "onboarding.welcome_title": "Hello World", 3 "auth.login.submit_button": "Log In", 4 "settings.profile.save_button": "Save Changes" 5}
Pourquoi ça gagne : La clé décrit où et quoi, pas la valeur du texte. Vous pouvez changer "Log In" par "Sign In" sans renommer la clé.
2. Imbrication vs Plat
La guerre sainte du JSON.
Clés Imbriquées (Jadis Populaires)
JSON1{ 2 "auth": { 3 "login": { 4 "title": "Login", 5 "button": "Submit" 6 }, 7 "signup": { 8 "title": "Sign Up" 9 } 10 } 11}
Utilisation : t('auth.login.title')
Pour : Organisé visuellement dans le fichier. Contre : Difficile à rechercher (grep). Si vous déplacez des objets, les chemins changent. Fusion git cauchemardesque.
Clés Plates (Le Standard Moderne)
JSON1{ 2 "auth.login.title": "Login", 3 "auth.login.button": "Submit", 4 "auth.signup.title": "Sign Up" 5}
Utilisation : t('auth.login.title')
Pour : Facile à rechercher ("auth.login.title" est unique). Fusions git faciles (ligne par ligne). Meilleur pour les TMS. Contre : Répétition des préfixes.
Verdict 2026 : Utilisez des clés plates pour la source (DX), laissez votre bibliothèque i18n gérer l'analyse. La plupart des outils modernes fonctionnent mieux avec des structures plates.
3. La Hiérarchie de Nommage
Utilisez une structure cohérente. Nous recommandons :
DOMAIN.COMPONENT.ELEMENT_VARIANT
Exemples :
marketing.pricing_card.cta_buttondashboard.user_table.column_header_nameerrors.api.404_message
Cela regroupe naturellement les clés connexes lorsqu'elles sont triées par ordre alphabétique.
4. Gérer la Duplication
Devriez-vous réutiliser common.save ou créer profile.save_button et settings.save_button ?
La Règle d'Or : Réutiliser pour les Actions, Dupliquer pour le Contenu
Réutiliser (Communs) : Des actions simples et universelles qui ne changeront probablement jamais de sens.
actions.saveactions.cancelactions.deletecommon.loading
Dupliquer (Spécifiques) : Même si le texte est le même maintenant, le contexte diffère.
profile.bio_placeholder("Parlez-nous de vous")project.description_placeholder("Décrivez votre projet")
En anglais, c'est peut-être "Enter text here" pour les deux. En allemand, le genre ou le ton pourrait différer. Si vous les liez à une seule clé, vous ne pouvez pas les changer indépendamment plus tard.
5. Espaces Réservés et Variables
N'utilisez jamais de concaténation de chaînes. Utilisez toujours l'interpolation.
❌ Mauvais
JavaScriptt('welcome_message') + ' ' + userName
En français, l'adjectif pourrait venir avant ou après. La grammaire diffère.
✅ Bon (Style ICU)
JSON"welcome_message": "Welcome back, {name}!"
JavaScriptt('welcome_message', { name: userName })
Laisse le traducteur décider de l'ordre des mots.
6. Pluralisation
La pluralisation est complexe. N'essayez pas de la faire avec if/else.
❌ Mauvais
JavaScriptconst key = count === 1 ? 'item_singular' : 'item_plural'; t(key)
Certaines langues ont 6 formes de pluriel (Arabe). Votre logique if/else échouera.
✅ Bon (Format ICU)
JSON"cart.item_count": "{count, plural, =0 {No items} one {# item} other {# items}}"
Laissez la bibliothèque i18n (comme react-intl ou i18next) gérer la logique complexe.
7. Espaces de Noms
Ne mettez pas 5000 clés dans un seul fichier common.json. Divisez par fonctionnalité ou page.
Structure Recommandée :
common.json(Boutons, étiquettes universelles)auth.json(Login, Signup, Récupération de mot de passe)dashboard.jsonsettings.jsonlanding_page.json
Pourquoi ?
- Chargement différé : Chargez seulement les traductions nécessaires pour la page courante. (Performance web vitale).
- Conflits git réduits.
- Propriété plus claire : L'équipe "Auth" possède
auth.json.
8. Clés Dynamiques
Évitez de générer des clés dynamiquement si vous le pouvez.
⚠️ Risqué
JavaScriptconst status = 'active'; t(`status.${status}`) // Cherche 'status.active'
Les scanners de code (extracteurs) ne peuvent pas trouver ces clés. Vous devrez les ajouter manuellement à une liste d'autorisation, sinon elles seront signalées comme inutilisées ou manquantes.
✅ Meilleur (Mappage)
JavaScript1const statusMap = { 2 active: 'status.active', 3 pending: 'status.pending', 4}; 5t(statusMap[status]);
Maintenant les clés sont explicites et trouvables par grep/extracteurs.
9. Supprimer les Clés (Le Cimetière)
Les clés inutilisées s'accumulent. Personne ne les supprime de peur de casser quelque chose.
La Solution 2026 : Outils Automatisés
Utilisez des outils comme IntlPull CLI ou i18n-unused pour scanner votre base de code.
- Scannez le code source pour tous les appels
t('key'). - Comparez avec votre fichier JSON.
- Signalez les clés dans JSON qui ne sont pas dans le code.
Faites-le dans votre CI. Ne laissez pas le cimetière grandir.
10. Contexte pour l'IA
Les traducteurs IA (comme GPT/Claude) ont besoin de contexte. Les noms de clés ne suffisent pas toujours.
Si vous utilisez un format qui supporte les métadonnées (comme JSON avec des clés imbriquées ou des commentaires), ajoutez-le.
JSON1{ 2 "search_button": { 3 "value": "Search", 4 "description": "Button in the top navigation bar", 5 "limit": 20 6 } 7}
Ou utilisez des conventions de nommage qui aident l'IA :
header.nav.search_cta est meilleur que btn_src.
Résumé : La Checklist de la Clé Parfaite
- Minuscule avec tirets bas (
user_profile) - Plat avec notation par points (
auth.login.title) - Sémantique (
submit_button) pas contenu (click_here) - Interpolation utilisée (
{name}) pas concaténation - Appartient à un espace de noms spécifique (
settings.) sauf si vraiment global - Supprimée si inutilisée (automatiquement)
Adoptez ces règles, et votre futur vous (et vos traducteurs) vous remerciera.
