通过语法性别个性化您的应用界面

全球有 30 亿人使用有性别区分的语言:在这种语言中,名词、动词、形容词和介词等语法类别会根据您所谈论的人物和事物的性别进行变体。传统上,许多有性别区分的语言使用阳性语法性别作为默认或泛指性别。

如果使用错误的语法性别称呼用户(例如,使用阳性语法性别称呼女性),可能会其表现和态度产生负面影响。相反,如果界面的语言能够正确反映用户的语法性别,则可以提高用户参与度,并提供更个性化、更自然的用户体验。

为了帮助您为有性别区分的语言构建以用户为中心的界面,Android 14 引入了 Grammatical Inflection API,让您无需重构应用即可添加语法性别支持。

语法性别变体示例

在有性别区分的语言中,语法性别不能像在英语中那样被规避。例如,在英语中,要编写一条消息告诉用户他们已订阅您的应用服务,您可以使用一个短语:“You are subscribed to...”(您已订阅……)。

要在法语中提供类似的短语,有以下几种选择

  • 阳性变体形式:“Vous êtes abonné à...” (英语:“You are subscribed to...”)(您已订阅……)
  • 阴性变体形式:“Vous êtes abonnée à...” (英语:“You are subscribed to...”)(您已订阅……)
  • 避免变体的中性措辞:“Abonnement à...activé” (英语:“Subscription to ... enabled”)(已启用……订阅)

与英语类似,前两种选择直接称呼用户。但是,如果没有支持法语此语法特征的机制,您将只能使用第三种选择,这会改变消息的语气,并且可能不是您希望在用户界面中显示的内容。

在这种情况下,Grammatical Inflection API 降低了根据查看者的语法性别(即查看界面的人,而不是被谈论的人)显示字符串的工作量。要在您的应用中向用户显示个性化翻译,请为受影响的语言添加针对每种语法性别变体的翻译,然后使用 GrammaticalInflectionManager API 调整向每个用户显示的翻译。

在许多语言中,语法性别除了适用于人之外,也适用于普通名词。例如,在法语中,单词 chaise(椅子)是阴性的,而 oiseau(鸟)是阳性的。对于除了称呼用户之外的情况,您可以使用现有的 ICU SelectFormat API。

实现 API

用户指示其语法性别后(例如,通过您应用的设置部分或用户设置工作流),您可以使用 setRequestedApplicationGrammaticalGender(int) 方法将值存储在您应用的资源配置中。

例如,如果您想将用户的首选语法性别设置为阴性,您可以要求用户选择他们偏好的语法性别,然后调用 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);

如果您想自行处理配置更改,以下是如何在应用清单文件中声明配置更改的示例

<activity android:name=".TestActivity"
              android:configChanges="grammaticalGender"
              android:exported="true">
</activity>

如果您的应用需要检查当前资源配置中的语法性别,您可以使用 getApplicationGrammaticalGender() 方法进行检索

Kotlin

val gIM = mContext.getSystemService(GrammaticalInflectionManager::class.java)
val grammaticalGender = gIM.getApplicationGrammaticalGender()

Java

GrammaticalInflectionManager gIM =
    mContext.getSystemService(GrammaticalInflectionManager.class);
int grammaticalGender = gIM.getApplicationGrammaticalGender();

为有语法性别的语言添加翻译

要为有语法性别的语言提供本地化文本,请创建备用资源文件,并在这些语言的区域设置名称后立即附加语法性别限定符。下表列出了可能的值

限定符 字符串值 示例(法语 fr
阴性 feminine res/values-fr-feminine/strings.xml
阳性 masculine res/values-fr-masculine/strings.xml
中性 neuter res/values-fr-neuter/strings.xml

您应该只在这些资源文件中包含支持语法性别变体的字符串。所有字符串都必须在包含其他本地化字符串的默认资源文件中有一个值。当性别变体翻译不可用时,将显示此默认翻译。

前面提供的法语示例中,中性措辞将是默认资源 res/values-fr/strings.xml 文件中字符串的值。以下代码片段显示了每个资源文件如何格式化以适应法语示例中的所有语法变体

阴性

将阴性变体字符串包含在 res/values-fr-feminine/strings.xml 资源文件中

<resources>
    ...
    <string name="example_string">Vous êtes abonnée à...</string>
</resources>

阳性

将阳性变体字符串包含在 res/values-fr-masculine/strings.xml 资源文件中

<resources>
    ...
    <string name="example_string">Vous êtes abonné à...</string>
</resources>

中性

将默认字符串包含在 res/values-fr/strings.xml 资源文件中

<resources>
    ...
    <string name="example_string">Abonnement à...activé</string>
</resources>