Personaliza la IU de tu app con un género gramatical

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 presenta la API de Grammatical Inflection, que te permite agregar compatibilidad con el género gramatical sin refactorizar tu app.

Ejemplo de flexión para el género gramatical

En los idiomas con género, no se puede trabajar con 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 inflexión masculina: "Vous êtes abonné à..." (inglés: "You are subscribed to…")
  • Forma con influencia femenina: "Vous êtes abonnée à..." (inglés: "You are subscribed to…")
  • Frases neutrales que evitan la inflexión: "Abonnement à...activé" (inglés: "Subscription to ... enabled")

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 string con influencia 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 influencia 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>