3 billion people speak gendered languages: languages where grammatical categories—such as nouns, verbs, adjectives, and prepositions—inflect according to the gender of people and objects you talk to or about. Traditionally, many gendered languages use masculine grammatical gender as the default or generic gender.
Addressing users in the wrong grammatical gender, such as addressing women in masculine grammatical gender, can negatively impact their performance and attitude. In contrast, a UI with language that correctly reflects the user's grammatical gender can improve user engagement and provide a more personalized and natural-sounding user experience.
Para ayudarte a compilar una IU centrada en el usuario para idiomas con inflexión de género, Android 14 introduce la API de Grammatical Inflection, que te permite agregar compatibilidad con el género gramatical sin refactorizar la app.
Ejemplo de flexión para el género gramatical
En los idiomas con género gramatical, no se puede evitar el género gramatical de la misma manera que en inglés. Por ejemplo, en inglés, para escribir un mensaje que diga al usuario que está suscrito al servicio de tu app, puedes usar una sola frase: "You are subscribed to…".
Para proporcionar una frase similar en francés, hay varias opciones:
- Forma con influencia masculina: "Vous êtes abonné à..." (inglés: "You are subscribed to…")
- Forma femenina: "Vous êtes abonnée à…" (inglés: "You are subscribed to…")
- Frase neutral que evita la inflexión: "Abonnement à...activé" (Inglés: "Suscripción a ... habilitada")
De manera similar a lo que ocurre en inglés, las dos primeras opciones se dirigen directamente al usuario. Sin embargo, sin ningún mecanismo para adaptarse a esta característica gramatical del francés, solo tendrías la tercera opción, que cambia el tono del mensaje y quizás no sea lo que quieres mostrar en tu interfaz de usuario.
En esos casos, la API de Grammatical Inflection disminuye el esfuerzo de mostrar cadenas relacionadas con el género gramatical del usuario, es decir, la persona que ve la IU, no la persona de la que se habla. Para mostrar a los usuarios traducciones personalizadas en tu app, agrega traducciones adaptadas a cada género gramatical en los idiomas afectados y, luego, usa la API de GrammaticalInflectionManager para ajustar qué traducciones se muestran a cada usuario.
En muchos idiomas, el género gramatical también se aplica a los sustantivos comunes, además de las personas. Por ejemplo, en francés la palabra chaise (silla) es femenina, mientras que oiseau (pájaro) es masculina. En casos en los que no te diriges al usuario, puedes usar la API de ICU SelectFormat existente.
Cómo implementar la API
Después de que el usuario indique su género gramatical (por ejemplo, a través de la sección de configuración de tu app o un flujo de trabajo de configuración del usuario), puedes usar el método setRequestedApplicationGrammaticalGender(int) para almacenar el valor en la configuración de recursos de tu app.
Por ejemplo, si quieres establecer en femenino el género gramatical que prefiere un usuario, le pedirás que seleccione qué género gramatical prefiere y, luego, llamarás a la API:
Kotlin
// Set app's grammatical gender to feminine val gIM = mContext.getSystemService(GrammaticalInflectionManager::class.java) gIM.setRequestedApplicationGrammaticalGender( Configuration.GRAMMATICAL_GENDER_FEMININE)
Java
// Set app's grammatical gender to feminine GrammaticalInflectionManager gIM = mContext.getSystemService(GrammaticalInflectionManager.class); gIM.setRequestedApplicationGrammaticalGender( Configuration.GRAMMATICAL_GENDER_FEMININE);
A continuación, se muestra un ejemplo de cómo declarar los cambios de configuración en el archivo de manifiesto de tu app si deseas controlarlos tú:
<activity android:name=".TestActivity"
android:configChanges="grammaticalGender"
android:exported="true">
</activity>
Si tu app necesita verificar el género gramatical en la configuración actual de los recursos, puedes usar el método getApplicationGrammaticalGender() para recuperarlo:
Kotlin
val gIM = mContext.getSystemService(GrammaticalInflectionManager::class.java) val grammaticalGender = gIM.getApplicationGrammaticalGender()
Java
GrammaticalInflectionManager gIM = mContext.getSystemService(GrammaticalInflectionManager.class); int grammaticalGender = gIM.getApplicationGrammaticalGender();
Cómo agregar traducciones de idiomas con género gramatical
Si quieres proporcionar texto localizado para idiomas con género gramatical, crea un archivo de recursos alternativos y agrega el calificador de género gramatical inmediatamente después del nombre de configuración regional de esos idiomas. En la siguiente tabla, se describen los valores posibles:
| Calificador | Valor de cadena | Ejemplo (francés fr) |
|---|---|---|
| Femenino | feminine |
res/values-fr-feminine/strings.xml |
| Masculino | masculine |
res/values-fr-masculine/strings.xml |
| Neutro | neuter |
res/values-fr-neuter/strings.xml |
Solo debes incluir cadenas que admitan inflexiones de género gramatical en estos archivos de recursos. Todas las cadenas deben tener un valor en el archivo de recursos predeterminados que contiene otras cadenas localizadas. Esta traducción predeterminada se muestra cuando no hay disponible una traducción en función del género.
En el ejemplo anterior para el francés, la expresión neutral sería el valor de la cadena del archivo de recursos predeterminados res/values-fr/strings.xml. En los siguientes fragmentos de código, se muestra cómo se formatearía cada archivo de recursos para adaptarse a todas las variantes gramaticales del ejemplo en francés:
Femenino
Incluye la cadena con inflexión femenina en el archivo de recursos res/values-fr-feminine/strings.xml:
<resources> ... <string name="example_string">Vous êtes abonnée à...</string> </resources>
Masculino
Incluye la cadena con inflexión masculina en el archivo de recursos res/values-fr-masculine/strings.xml:
<resources> ... <string name="example_string">Vous êtes abonné à...</string> </resources>
Neutro
Incluye la cadena predeterminada del archivo de recursos res/values-fr/strings.xml:
<resources> ... <string name="example_string">Abonnement à...activé</string> </resources>