IntlPull
Technical
11 min read

Gestion du genre et des accords grammaticaux en i18n : guide développeur

Maîtrisez le genre grammatical dans l'internationalisation : format ICU select, stratégies neutres, et gestion des systèmes de genre roman, slave et arabe dans les applications modernes.

IntlPull Team
IntlPull Team
20 Feb 2026, 01:39 PM [PST]
On this page
Summary

Maîtrisez le genre grammatical dans l'internationalisation : format ICU select, stratégies neutres, et gestion des systèmes de genre roman, slave et arabe dans les applications modernes.

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

JavaScript
1const 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 :

JavaScript
1// 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

JavaScript
1// 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

TypeScript
1interface 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

TypeScript
1import { 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

GO
1// 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

JavaScript
1// 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 :

JavaScript
1// 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

TypeScript
1// 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

JavaScript
1// 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

TypeScript
1import { 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 :

JavaScript
1// 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 :

YAML
1validation:
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

TypeScript
1// 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

TypeScript
1// 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

TypeScript
1// 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 :

  1. Utiliser ICU select pour les langues avec genre grammatical
  2. Rendre la préférence de genre optionnelle et expliquer son objectif
  3. Par défaut vers un langage neutre quand possible
  4. Tester toutes les variantes avec des locuteurs natifs
  5. 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.

Tags
gender
grammar
i18n
inclusive
localization
icu
select
IntlPull Team
IntlPull Team
Engineering

Building tools to help teams ship products globally. Follow us for more insights on localization and i18n.