Le genre grammatical est l'un des défis les plus complexes de l'internationalisation. Contrairement à l'anglais, qui utilise le genre principalement pour les pronoms, de nombreuses langues attribuent un genre grammatical à tous les noms et exigent un accord avec les adjectifs, les articles et les formes verbales. Ce guide couvre tout ce que les développeurs doivent savoir sur la gestion du genre en i18n, des systèmes roman et slave aux stratégies neutres.
Comprendre les systèmes de genre grammatical
Le genre grammatical est une caractéristique linguistique où les noms sont classés en catégories (masculin, féminin, neutre ou autres) qui affectent les mots environnants. Cette classification est souvent arbitraire et sans rapport avec le genre biologique.
Systèmes à deux genres (langues romanes)
Les langues comme l'espagnol, le français, l'italien et le portugais utilisent les genres masculin et féminin :
Exemple espagnol :
- "El usuario está conectado" (L'utilisateur [masc] est connecté [masc])
- "La usuaria está conectada" (L'utilisatrice [fém] est connectée [fém])
Exemple français :
- "Le développeur est expérimenté" (Le développeur [masc] est expérimenté [masc])
- "La développeuse est expérimentée" (La développeuse [fém] est expérimentée [fém])
Systèmes à trois genres (langues slaves)
Le russe, le polonais, le tchèque et d'autres langues slaves ajoutent le genre neutre :
Exemple russe :
- "Пользователь (masc) подключён (masc)" (Utilisateur est connecté)
- "Пользовательница (fém) подключена (fém)" (Utilisatrice est connectée)
- "Подключение (neutre) завершено (neutre)" (Connexion est terminée)
Systèmes de genre complexes (arabe)
L'arabe a masculin et féminin, mais avec une complexité supplémentaire :
- Formes duelles pour exactement deux éléments
- Pluriels brisés avec genre imprévisible
- Règles d'accord différentes pour humains vs. non-humains pluriels
Exemple arabe :
- "المستخدم متصل" (L'utilisateur [masc] connecté [masc])
- "المستخدمة متصلة" (L'utilisatrice [fém] connectée [fém])
- "المستخدمون متصلون" (Les utilisateurs [masc pl] connectés [masc pl])
- "المستخدمات متصلات" (Les utilisatrices [fém pl] connectées [fém pl])
La solution ICU MessageFormat Select
La solution standard de l'industrie pour le genre grammatical est le format select d'ICU MessageFormat, qui permet du texte conditionnel basé sur une valeur de variable.
Syntaxe Select de base
JavaScript1const message = "{gender, select, " + 2 "male {He is connected} " + 3 "female {She is connected} " + 4 "other {They are connected}" + 5"}"; 6 7// Usage 8formatMessage(message, { gender: 'female' }); 9// Output: "She is connected"
Accord à plusieurs niveaux
Les applications réelles nécessitent souvent plusieurs accords dans une seule phrase :
JavaScript1// Espagnol : Accord sur l'article, le nom, l'adjectif et le participe 2const welcomeMessage = "{gender, select, " + 3 "male {Bienvenido al sistema. Tu cuenta ha sido activada.} " + 4 "female {Bienvenida al sistema. Tu cuenta ha sido activada.} " + 5 "other {Bienvenido/a al sistema. Tu cuenta ha sido activada.}" + 6"}";
Select imbriqué pour scénarios complexes
JavaScript1// Français : Accord différent pour singulier vs pluriel 2const statusMessage = "{count, plural, " + 3 "one {{gender, select, " + 4 "male {L'utilisateur est connecté} " + 5 "female {L'utilisatrice est connectée} " + 6 "other {L'utilisateur·rice est connecté·e}" + 7 "}} " + 8 "other {{gender, select, " + 9 "male {Les utilisateurs sont connectés} " + 10 "female {Les utilisatrices sont connectées} " + 11 "other {Les utilisateur·rice·s sont connecté·e·s}" + 12 "}}" + 13"}";
Modèles d'implémentation
Stockage de la préférence de genre de l'utilisateur
TypeScript1interface UserProfile { 2 id: string; 3 displayName: string; 4 preferredLanguage: string; 5 // Genre uniquement pour accord grammatical 6 grammaticalGender?: 'male' | 'female' | 'neutral' | 'unspecified'; 7} 8 9// Schéma de base de données 10CREATE TABLE user_profiles ( 11 id UUID PRIMARY KEY, 12 display_name TEXT NOT NULL, 13 preferred_language TEXT NOT NULL, 14 grammatical_gender TEXT CHECK ( 15 grammatical_gender IN ('male', 'female', 'neutral', 'unspecified') 16 ), 17 created_at TIMESTAMP DEFAULT NOW() 18);
Implémentation React
TypeScript1import { useIntl } from 'react-intl'; 2 3interface WelcomeProps { 4 user: UserProfile; 5} 6 7function WelcomeMessage({ user }: WelcomeProps) { 8 const intl = useIntl(); 9 10 const message = intl.formatMessage( 11 { id: 'welcome.greeting' }, 12 { 13 gender: user.grammaticalGender || 'other', 14 name: user.displayName 15 } 16 ); 17 18 return <h1>{message}</h1>; 19} 20 21// Fichier de traduction (en.json) 22{ 23 "welcome.greeting": "{name}, you are connected" 24} 25 26// Fichier de traduction (fr.json) 27{ 28 "welcome.greeting": "{gender, select, male {{name}, vous êtes connecté} female {{name}, vous êtes connectée} other {{name}, vous êtes connecté·e}}" 29}
Conception d'API Backend
GO1// Exemple backend Go 2type UserPreferences struct { 3 LanguageCode string `json:"language_code"` 4 GrammaticalGender *string `json:"grammatical_gender,omitempty"` 5} 6 7func (h *Handler) GetLocalizedMessage(w http.ResponseWriter, r *http.Request) { 8 user := getUserFromContext(r.Context()) 9 10 params := map[string]interface{}{ 11 "gender": getGenderOrDefault(user.Preferences.GrammaticalGender), 12 "name": user.DisplayName, 13 } 14 15 message := h.i18n.Localize(user.Preferences.LanguageCode, "welcome.greeting", params) 16 17 json.NewEncoder(w).Write(map[string]string{ 18 "message": message, 19 }) 20} 21 22func getGenderOrDefault(gender *string) string { 23 if gender == nil { 24 return "other" 25 } 26 return *gender 27}
Stratégies neutres en genre
De nombreuses applications évoluent vers un langage neutre en genre pour être plus inclusives et simplifier la localisation.
Modèles neutres en anglais
JavaScript1// Au lieu de : "He/She is connected" 2// Utiliser : "You are connected" (deuxième personne) 3// Utiliser : "Connected" (statut sans sujet) 4// Utiliser : "This user is connected" (démonstratif + nom) 5// Utiliser : "They are connected" (singulier they)
Stratégies pour langues romanes
1. Morphèmes inclusifs (espagnol/français) :
Espagnol : "Bienvenido/a" ou "Bienvenid@" ou "Bienvenidx"
Français : "Bienvenu·e" ou "Bienvenu.e"
2. Noms collectifs :
Au lieu de : "Los usuarios" (les utilisateurs [masc])
Utiliser : "Las personas usuarias" (les personnes utilisatrices [fém collectif])
3. Voix passive :
Au lieu de : "El usuario ha sido conectado" (nécessite genre)
Utiliser : "La conexión ha sido establecida" (connexion établie, pas de genre)
Solutions neutres en allemand
Traditionnel : "Benutzer" (masc) / "Benutzerin" (fém)
Neutre : "Benutzende" (forme participe)
Inclusif : "Benutzer*in" ou "Benutzer:in" ou "Benutzer_in"
Défis des langues slaves
Les langues slaves ont moins d'options neutres en raison d'un accord étendu :
JavaScript1// Russe : Options limitées, nécessite souvent une sélection explicite 2const russianMessage = "{gender, select, " + 3 "male {Вы подключены} " + // Vous [masc] êtes connecté 4 "female {Вы подключены} " + // Vous [fém] êtes connectée 5 "other {Вы подключены}" + // Forme plurielle (neutre) 6"}";
Éviter les présomptions de genre dans l'interface
Bonnes pratiques de configuration de profil
TypeScript1// Bon : Champ de genre optionnel avec objectif clair 2interface ProfileForm { 3 displayName: string; 4 email: string; 5 // Optionnel : Uniquement à des fins grammaticales 6 grammaticalGender?: { 7 value: 'male' | 'female' | 'neutral' | 'unspecified'; 8 label: string; // Expliquer pourquoi vous posez la question 9 }; 10} 11 12// Composant d'interface 13function GenderField() { 14 return ( 15 <fieldset> 16 <legend> 17 Genre grammatical (optionnel) 18 <Tooltip> 19 Utilisé uniquement pour afficher correctement les messages dans votre langue. 20 Cela n'affecte pas votre identité ou la visibilité de votre profil. 21 </Tooltip> 22 </legend> 23 24 <label> 25 <input type="radio" name="gender" value="male" /> 26 Formes masculines 27 </label> 28 29 <label> 30 <input type="radio" name="gender" value="female" /> 31 Formes féminines 32 </label> 33 34 <label> 35 <input type="radio" name="gender" value="neutral" /> 36 Formes neutres/inclusives 37 </label> 38 39 <label> 40 <input type="radio" name="gender" value="unspecified" checked /> 41 Pas de préférence 42 </label> 43 </fieldset> 44 ); 45}
Par défaut vers un langage neutre
JavaScript1// Les clés de traduction doivent être neutres par défaut 2{ 3 // Mauvais : Suppose le genre 4 "profile.greeting": "Bienvenue, {name} ! Vous êtes connecté.", 5 6 // Bon : Neutre par défaut 7 "profile.greeting": "Bienvenue, {name} ! Votre session est active.", 8 9 // Si le genre est nécessaire, le rendre explicite 10 "profile.greeting_gendered": "{gender, select, male {Bienvenue, {name} ! Vous êtes connecté.} female {Bienvenue, {name} ! Vous êtes connectée.} other {Bienvenue, {name} ! Votre session est active.}}" 11}
Tester les accords de genre
TypeScript1import { render, screen } from '@testing-library/react'; 2import { IntlProvider } from 'react-intl'; 3 4describe('Tests d'accord de genre', () => { 5 it('devrait afficher l'accord espagnol correct (masculin)', () => { 6 const messages = { 7 'welcome.message': '{gender, select, male {Bienvenido} female {Bienvenida} other {Bienvenido/a}}' 8 }; 9 10 render( 11 <IntlProvider locale="es" messages={messages}> 12 <WelcomeMessage user={{ grammaticalGender: 'male' }} /> 13 </IntlProvider> 14 ); 15 16 expect(screen.getByText(/Bienvenido$/)).toBeInTheDocument(); 17 }); 18 19 it('devrait afficher l'accord espagnol correct (féminin)', () => { 20 const messages = { 21 'welcome.message': '{gender, select, male {Bienvenido} female {Bienvenida} other {Bienvenido/a}}' 22 }; 23 24 render( 25 <IntlProvider locale="es" messages={messages}> 26 <WelcomeMessage user={{ grammaticalGender: 'female' }} /> 27 </IntlProvider> 28 ); 29 30 expect(screen.getByText(/Bienvenida$/)).toBeInTheDocument(); 31 }); 32 33 it('devrait gérer le genre non spécifié avec forme neutre', () => { 34 const messages = { 35 'welcome.message': '{gender, select, male {Bienvenido} female {Bienvenida} other {Bienvenido/a}}' 36 }; 37 38 render( 39 <IntlProvider locale="es" messages={messages}> 40 <WelcomeMessage user={{ grammaticalGender: undefined }} /> 41 </IntlProvider> 42 ); 43 44 expect(screen.getByText(/Bienvenido/a$/)).toBeInTheDocument(); 45 }); 46});
Fonctionnalités de gestion du genre d'IntlPull
IntlPull fournit un support spécialisé pour la gestion du genre grammatical :
1. Support du format ICU MessageFormat
Tous les formats ICU select sont entièrement supportés avec aperçu visuel :
JavaScript1// L'éditeur IntlPull montre un aperçu en direct pour chaque variante 2{ 3 "user.status": "{gender, select, male {Connecté} female {Connectée} other {Connecté·e}}" 4}
2. Test des variantes de genre
L'interface de traduction IntlPull permet aux testeurs de prévisualiser toutes les variantes de genre :
- Basculer instantanément entre les variantes masculin/féminin/autre
- Voir tous les accords en contexte
- Signaler les incohérences entre les clés liées
3. Mémoire de traduction avec contexte de genre
Le système de mémoire de traduction d'IntlPull comprend le contexte de genre :
Source : "You are connected"
Espagnol (masculin) : "Estás conectado"
Espagnol (féminin) : "Estás conectada"
Espagnol (neutre) : "Estás conectado/a"
// La MT suggère la variante appropriée selon le paramètre de genre
4. Règles de validation
Définir des règles de validation pour assurer les accords de genre :
YAML1validation: 2 - rule: gender_consistency 3 description: "Toutes les variantes de genre doivent être présentes" 4 applies_to: ["es", "fr", "de", "ru"] 5 severity: error
Exemples d'implémentation réels
Exemple 1 : Système de notifications
TypeScript1// Notification avec plusieurs accords de genre 2const notificationMessages = { 3 en: { 4 'notification.comment': '{commenterName} commented on your post' 5 }, 6 fr: { 7 'notification.comment': '{gender, select, ' + 8 'male {{commenterName} a commenté votre publication} ' + 9 'female {{commenterName} a commenté votre publication} ' + 10 'other {{commenterName} a commenté votre publication}' + 11 '}' 12 } 13}; 14 15// Usage 16function sendNotification(recipient: User, commenter: User) { 17 const message = formatMessage( 18 'notification.comment', 19 { 20 commenterName: commenter.displayName, 21 gender: commenter.grammaticalGender || 'other' 22 }, 23 recipient.preferredLanguage 24 ); 25 26 // Envoyer la notification 27}
Exemple 2 : Modèles d'e-mail
TypeScript1// Objet d'e-mail avec accord de genre 2const emailSubjects = { 3 en: { 4 'email.welcome.subject': 'Welcome to our platform, {name}!' 5 }, 6 fr: { 7 'email.welcome.subject': '{gender, select, ' + 8 'male {Bienvenu sur notre plateforme, {name} !} ' + 9 'female {Bienvenue sur notre plateforme, {name} !} ' + 10 'other {Bienvenue sur notre plateforme, {name} !}' + 11 '}' 12 } 13}; 14 15// Corps d'e-mail avec plusieurs accords 16const emailBodies = { 17 fr: { 18 'email.welcome.body': '{gender, select, ' + 19 'male {Cher {name}, 20 21Vous avez été enregistré en tant qu'utilisateur.} ' + 22 'female {Chère {name}, 23 24Vous avez été enregistrée en tant qu'utilisatrice.} ' + 25 'other {Bonjour {name}, 26 27Vous avez été enregistré·e.}' + 28 '}' 29 } 30};
Exemple 3 : Messages de statut
TypeScript1// Affichage de statut avec accord 2const statusMessages = { 3 fr: { 4 'status.online': '{gender, select, ' + 5 'male {Vous êtes en ligne} ' + 6 'female {Vous êtes en ligne} ' + 7 'other {Vous êtes en ligne}' + 8 '}', 9 'status.verified': '{gender, select, ' + 10 'male {Vous êtes vérifié} ' + 11 'female {Vous êtes vérifiée} ' + 12 'other {Vous êtes vérifié·e}' + 13 '}' 14 } 15};
Questions fréquemment posées
Q : Dois-je demander le genre aux utilisateurs ?
Seulement si nécessaire à des fins grammaticales dans les langues avec accord de genre. Rendez toujours cela optionnel, expliquez pourquoi vous demandez, et fournissez des options neutres. De nombreuses applications évitent cela en utilisant des modèles de langage neutre.
Q : Quelle est la différence entre genre grammatical et identité de genre ?
Le genre grammatical est une caractéristique linguistique pour une construction de phrase appropriée. L'identité de genre est l'identité personnelle. Ils peuvent ne pas correspondre. Clarifiez toujours que vous demandez la préférence linguistique, pas l'identité.
Q : Comment gérer le genre dans les langues que je ne parle pas ?
Utilisez le format ICU MessageFormat select et travaillez avec des locuteurs natifs ou des traducteurs professionnels. Ne devinez pas les accords de genre—ils sont complexes et les erreurs sont visibles pour les locuteurs natifs.
Q : Puis-je utiliser la traduction automatique pour les variantes de genre ?
La traduction automatique a souvent du mal avec l'accord de genre dans des phrases entières. Utilisez-la uniquement pour les brouillons, puis faites réviser toutes les variantes par des locuteurs natifs.
Q : Et si une langue n'a pas de genre ?
Les langues comme le turc, le finnois, le hongrois et le chinois n'ont pas de genre grammatical. Vos messages ICU select renverront simplement le même texte pour toutes les variantes, ce qui est bien—la surcharge est minime.
Q : Comment tester les bugs d'accord de genre ?
Créez des utilisateurs de test avec différentes préférences de genre grammatical. Testez toutes les chaînes d'interface qui font référence à l'utilisateur. Utilisez des tests automatisés pour vérifier que chaque variante s'affiche correctement.
Q : Dois-je supporter plus que masculin/féminin/autre ?
À des fins grammaticales, la plupart des langues ont 2-3 genres. Le support de other comme solution neutre couvre les cas inclusifs. Ne créez pas de catégories de genre au-delà de ce que la langue nécessite grammaticalement.
Q : Comment IntlPull aide-t-il avec l'accord de genre ?
IntlPull fournit un support ICU MessageFormat, un aperçu des variantes, une mémoire de traduction avec contexte de genre, et des règles de validation pour s'assurer que toutes les variantes de genre sont complètes et cohérentes.
Conclusion
La gestion du genre grammatical en i18n nécessite de comprendre les systèmes linguistiques, d'utiliser le select ICU MessageFormat et d'implémenter des modèles inclusifs. Points clés :
- Utiliser ICU select pour les langues avec genre grammatical
- Rendre la préférence de genre optionnelle et expliquer son objectif
- Par défaut vers un langage neutre quand possible
- Tester toutes les variantes avec des locuteurs natifs
- Valider la cohérence entre les chaînes liées
Des outils comme IntlPull simplifient la gestion du genre avec un support ICU intégré, des tests de variantes et des règles de validation—vous aidant à construire des applications multilingues inclusives et grammaticalement correctes.
