IntlPull
Technical
11 min read

Manejo de género y concordancias gramaticales en i18n: guía para desarrolladores

Domina el género grammatical en internacionalización: formato ICU select, estrategias neutras, y manejo de sistemas de género romances, eslavos y árabes en aplicaciones modernas.

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

Domina el género grammatical en internacionalización: formato ICU select, estrategias neutras, y manejo de sistemas de género romances, eslavos y árabes en aplicaciones modernas.

El género gramatical es uno de los desafíos más complejos de la internacionalización. A diferencia del inglés, que usa el género principalmente para pronombres, muchos idiomas asignan género gramatical a todos los sustantivos y requieren concordancia con adjetivos, artículos y formas verbales. Esta guía cubre todo lo que los desarrolladores necesitan saber sobre el manejo del género en i18n, desde sistemas romance y eslavo hasta estrategias neutras.

Entender los sistemas de género gramatical

El género gramatical es una característica lingüística donde los sustantivos se clasifican en categorías (masculino, femenino, neutro u otros) que afectan a las palabras circundantes. Esta clasificación es a menudo arbitraria y no relacionada con el género biológico.

Sistemas de dos géneros (lenguas romances)

Lenguas como español, francés, italiano y portugués usan géneros masculino y femenino:

Ejemplo español:

  • "El usuario está conectado" (El usuario [masc] está conectado [masc])
  • "La usuaria está conectada" (La usuaria [fem] está conectada [fem])

Ejemplo francés:

  • "Le développeur est expérimenté" (El desarrollador [masc] es experimentado [masc])
  • "La développeuse est expérimentée" (La desarrolladora [fem] es experimentada [fem])

Sistemas de tres géneros (lenguas eslavas)

Ruso, polaco, checo y otras lenguas eslavas añaden género neutro:

Ejemplo ruso:

  • "Пользователь (masc) подключён (masc)" (Usuario está conectado)
  • "Пользовательница (fem) подключена (fem)" (Usuaria está conectada)
  • "Подключение (neutro) завершено (neutro)" (Conexión está completada)

Sistemas de género complejos (árabe)

El árabe tiene masculino y femenino, pero con complejidad adicional:

  • Formas duales para exactamente dos elementos
  • Plurales rotos con género impredecible
  • Reglas de concordancia diferentes para humanos vs. no humanos plurales

Ejemplo árabe:

  • "المستخدم متصل" (El usuario [masc] conectado [masc])
  • "المستخدمة متصلة" (La usuaria [fem] conectada [fem])
  • "المستخدمون متصلون" (Los usuarios [masc pl] conectados [masc pl])
  • "المستخدمات متصلات" (Las usuarias [fem pl] conectadas [fem pl])

La solución ICU MessageFormat Select

La solución estándar de la industria para el género gramatical es el formato select de ICU MessageFormat, que permite texto condicional basado en un valor de variable.

Sintaxis Select básica

JavaScript
1const message = "{gender, select, " +
2  "male {He is connected} " +
3  "female {She is connected} " +
4  "other {They are connected}" +
5"}";
6
7// Uso
8formatMessage(message, { gender: 'female' });
9// Output: "She is connected"

Concordancia multinivel

Las aplicaciones del mundo real a menudo requieren múltiples concordancias en una sola oración:

JavaScript
1// Español: Concordancia en artículo, sustantivo, adjetivo y participio
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 anidado para escenarios complejos

JavaScript
1// Francés: Concordancia diferente para singular vs plural
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"}";

Patrones de implementación

Almacenar la preferencia de género del usuario

TypeScript
1interface UserProfile {
2  id: string;
3  displayName: string;
4  preferredLanguage: string;
5  // Género solo para concordancia gramatical
6  grammaticalGender?: 'male' | 'female' | 'neutral' | 'unspecified';
7}
8
9// Esquema de base de datos
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);

Implementación 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// Archivo de traducción (en.json)
22{
23  "welcome.greeting": "{name}, you are connected"
24}
25
26// Archivo de traducción (es.json)
27{
28  "welcome.greeting": "{gender, select, male {{name}, estás conectado} female {{name}, estás conectada} other {{name}, estás conectado/a}}"
29}

Diseño de API backend

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

Estrategias neutras en género

Muchas aplicaciones están evolucionando hacia lenguaje neutro en género para ser más inclusivas y simplificar la localización.

Patrones neutros en inglés

JavaScript
1// En lugar de: "He/She is connected"
2// Usar: "You are connected" (segunda persona)
3// Usar: "Connected" (estado sin sujeto)
4// Usar: "This user is connected" (demostrativo + sustantivo)
5// Usar: "They are connected" (they singular)

Estrategias para lenguas romances

1. Morfemas inclusivos (español/francés):

Español: "Bienvenido/a" o "Bienvenid@" o "Bienvenidx"
Francés: "Bienvenu·e" o "Bienvenu.e"

2. Sustantivos colectivos:

En lugar de: "Los usuarios" (los usuarios [masc])
Usar: "Las personas usuarias" (las personas usuarias [fem colectivo])

3. Voz pasiva:

En lugar de: "El usuario ha sido conectado" (requiere género)
Usar: "La conexión ha sido establecida" (conexión establecida, sin género)

Soluciones neutras en alemán

Tradicional: "Benutzer" (masc) / "Benutzerin" (fem)
Neutro: "Benutzende" (forma participio)
Inclusivo: "Benutzer*in" o "Benutzer:in" o "Benutzer_in"

Desafíos de lenguas eslavas

Las lenguas eslavas tienen menos opciones neutras debido a concordancia extensa:

JavaScript
1// Ruso: Opciones limitadas, a menudo requiere selección explícita
2const russianMessage = "{gender, select, " +
3  "male {Вы подключены} " +     // Tú [masc] estás conectado
4  "female {Вы подключены} " +   // Tú [fem] estás conectada
5  "other {Вы подключены}" +     // Forma plural (neutral)
6"}";

Evitar suposiciones de género en la interfaz

Mejores prácticas de configuración de perfil

TypeScript
1// Bueno: Campo de género opcional con propósito claro
2interface ProfileForm {
3  displayName: string;
4  email: string;
5  // Opcional: Solo para propósitos gramaticales
6  grammaticalGender?: {
7    value: 'male' | 'female' | 'neutral' | 'unspecified';
8    label: string; // Explicar por qué preguntas
9  };
10}
11
12// Componente de interfaz
13function GenderField() {
14  return (
15    <fieldset>
16      <legend>
17        Género gramatical (opcional)
18        <Tooltip>
19          Usado solo para mostrar mensajes correctamente en tu idioma.
20          Esto no afecta tu identidad o visibilidad de perfil.
21        </Tooltip>
22      </legend>
23
24      <label>
25        <input type="radio" name="gender" value="male" />
26        Formas masculinas
27      </label>
28
29      <label>
30        <input type="radio" name="gender" value="female" />
31        Formas femeninas
32      </label>
33
34      <label>
35        <input type="radio" name="gender" value="neutral" />
36        Formas neutras/inclusivas
37      </label>
38
39      <label>
40        <input type="radio" name="gender" value="unspecified" checked />
41        Sin preferencia
42      </label>
43    </fieldset>
44  );
45}

Por defecto hacia lenguaje neutro

JavaScript
1// Las claves de traducción deben ser neutras por defecto
2{
3  // Malo: Asume género
4  "profile.greeting": "Bienvenido, {name}! Estás conectado.",
5
6  // Bueno: Neutro por defecto
7  "profile.greeting": "Bienvenido/a, {name}! Tu sesión está activa.",
8
9  // Si se necesita género, hazlo explícito
10  "profile.greeting_gendered": "{gender, select, male {Bienvenido, {name}! Estás conectado.} female {Bienvenida, {name}! Estás conectada.} other {Bienvenido/a, {name}! Tu sesión está activa.}}"
11}

Probar concordancias de género

TypeScript
1import { render, screen } from '@testing-library/react';
2import { IntlProvider } from 'react-intl';
3
4describe('Pruebas de concordancia de género', () => {
5  it('debería mostrar concordancia española correcta (masculino)', () => {
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('debería mostrar concordancia española correcta (femenino)', () => {
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('debería manejar género no especificado con forma neutra', () => {
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});

Características de manejo de género de IntlPull

IntlPull proporciona soporte especializado para gestión de género gramatical:

1. Soporte de formato ICU MessageFormat

Todos los formatos ICU select están completamente soportados con vista previa visual:

JavaScript
1// El editor IntlPull muestra vista previa en vivo para cada variante
2{
3  "user.status": "{gender, select, male {Conectado} female {Conectada} other {Conectado/a}}"
4}

2. Prueba de variantes de género

La interfaz de traducción de IntlPull permite a los probadores previsualizar todas las variantes de género:

  • Cambiar instantáneamente entre variantes masculino/femenino/otro
  • Ver todas las concordancias en contexto
  • Marcar inconsistencias entre claves relacionadas

3. Memoria de traducción con contexto de género

El sistema de memoria de traducción de IntlPull entiende el contexto de género:

Fuente: "You are connected"
Español (masculino): "Estás conectado"
Español (femenino): "Estás conectada"
Español (neutro): "Estás conectado/a"

// La MT sugiere la variante apropiada según el parámetro de género

4. Reglas de validación

Establecer reglas de validación para asegurar concordancias de género:

YAML
1validation:
2  - rule: gender_consistency
3    description: "Todas las variantes de género deben estar presentes"
4    applies_to: ["es", "fr", "de", "ru"]
5    severity: error

Ejemplos de implementación del mundo real

Ejemplo 1: Sistema de notificaciones

TypeScript
1// Notificación con múltiples concordancias de género
2const notificationMessages = {
3  en: {
4    'notification.comment': '{commenterName} commented on your post'
5  },
6  es: {
7    'notification.comment': '{gender, select, ' +
8      'male {{commenterName} comentó en tu publicación} ' +
9      'female {{commenterName} comentó en tu publicación} ' +
10      'other {{commenterName} comentó en tu publicación}' +
11    '}'
12  }
13};
14
15// Uso
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  // Enviar notificación
27}

Ejemplo 2: Plantillas de correo

TypeScript
1// Asunto de correo con concordancia de género
2const emailSubjects = {
3  en: {
4    'email.welcome.subject': 'Welcome to our platform, {name}!'
5  },
6  es: {
7    'email.welcome.subject': '{gender, select, ' +
8      'male {Bienvenido a nuestra plataforma, {name}!} ' +
9      'female {Bienvenida a nuestra plataforma, {name}!} ' +
10      'other {Bienvenido/a a nuestra plataforma, {name}!}' +
11    '}'
12  }
13};
14
15// Cuerpo de correo con múltiples concordancias
16const emailBodies = {
17  es: {
18    'email.welcome.body': '{gender, select, ' +
19      'male {Estimado {name},
20
21Has sido registrado como usuario.} ' +
22      'female {Estimada {name},
23
24Has sido registrada como usuaria.} ' +
25      'other {Hola {name},
26
27Has sido registrado/a.}' +
28    '}'
29  }
30};

Ejemplo 3: Mensajes de estado

TypeScript
1// Visualización de estado con concordancia
2const statusMessages = {
3  es: {
4    'status.online': '{gender, select, ' +
5      'male {Estás en línea} ' +
6      'female {Estás en línea} ' +
7      'other {Estás en línea}' +
8    '}',
9    'status.verified': '{gender, select, ' +
10      'male {Estás verificado} ' +
11      'female {Estás verificada} ' +
12      'other {Estás verificado/a}' +
13    '}'
14  }
15};

Preguntas frecuentes

P: ¿Debo preguntar el género a los usuarios?

Solo si es necesario para propósitos gramaticales en idiomas con concordancia de género. Hazlo siempre opcional, explica por qué preguntas y proporciona opciones neutras. Muchas aplicaciones evitan esto usando patrones de lenguaje neutro.

P: ¿Cuál es la diferencia entre género gramatical e identidad de género?

El género gramatical es una característica lingüística para construcción de oraciones apropiada. La identidad de género es identidad personal. Pueden no coincidir. Siempre aclara que preguntas por preferencia lingüística, no identidad.

P: ¿Cómo manejo el género en idiomas que no hablo?

Usa el formato ICU MessageFormat select y trabaja con hablantes nativos o traductores profesionales. No adivines concordancias de género—son complejas y los errores son notables para hablantes nativos.

P: ¿Puedo usar traducción automática para variantes de género?

La traducción automática a menudo tiene problemas con concordancia de género en oraciones completas. Úsala solo para borradores, luego haz que hablantes nativos revisen todas las variantes.

P: ¿Qué pasa si un idioma no tiene género?

Idiomas como turco, finlandés, húngaro y chino no tienen género gramatical. Tus mensajes ICU select simplemente devolverán el mismo texto para todas las variantes, lo cual está bien—la sobrecarga es mínima.

P: ¿Cómo pruebo bugs de concordancia de género?

Crea usuarios de prueba con diferentes preferencias de género gramatical. Prueba todas las cadenas de interfaz que hacen referencia al usuario. Usa pruebas automatizadas para verificar que cada variante se renderiza correctamente.

P: ¿Debo soportar más que masculino/femenino/otro?

Para propósitos gramaticales, la mayoría de los idiomas tienen 2-3 géneros. Soportar other como opción neutra cubre casos inclusivos. No crees categorías de género más allá de lo que el idioma requiere gramaticalmente.

P: ¿Cómo ayuda IntlPull con concordancia de género?

IntlPull proporciona soporte ICU MessageFormat, vista previa de variantes, memoria de traducción con contexto de género, y reglas de validación para asegurar que todas las variantes de género estén completas y consistentes.

Conclusión

Manejar el género gramatical en i18n requiere entender sistemas lingüísticos, usar el select ICU MessageFormat e implementar patrones inclusivos. Puntos clave:

  1. Usar ICU select para idiomas con género gramatical
  2. Hacer la preferencia de género opcional y explicar su propósito
  3. Por defecto hacia lenguaje neutro cuando sea posible
  4. Probar todas las variantes con hablantes nativos
  5. Validar consistencia entre cadenas relacionadas

Herramientas como IntlPull simplifican la gestión de género con soporte ICU incorporado, prueba de variantes y reglas de validación—ayudándote a construir aplicaciones multilingües inclusivas y gramaticalmente correctas.

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.