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 crear una IU centrada en los usuarios para idiomas con género, Android 14 presenta la API de Grammatical Inflection, que 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, el género gramatical no puede tratarse 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 con influencia 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 gramaticales de género 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>