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
JavaScript1const 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:
JavaScript1// 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
JavaScript1// 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
TypeScript1interface 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
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// 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
GO1// 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
JavaScript1// 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:
JavaScript1// 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
TypeScript1// 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
JavaScript1// 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
TypeScript1import { 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:
JavaScript1// 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:
YAML1validation: 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
TypeScript1// 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
TypeScript1// 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
TypeScript1// 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:
- Usar ICU select para idiomas con género gramatical
- Hacer la preferencia de género opcional y explicar su propósito
- Por defecto hacia lenguaje neutro cuando sea posible
- Probar todas las variantes con hablantes nativos
- 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.
