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

30 亿人说 *有性别的语言*:在这些语言中,语法类别(例如名词、动词、形容词和介词)会根据您谈论的人或物体的性别而发生变化。传统上,许多有性别的语言使用阳性语法性别作为默认或 *通用* 性别。

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

为了帮助您为有性别的语言构建以用户为中心的 UI,Android 14 引入了语法变格 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”)

与英语类似,前两个选项直接称呼用户。但是,如果没有任何机制来适应法语的这个语法特征,您将只有第三个选项,它会改变消息的语气,并且可能不是您想在用户界面中显示的内容。

在这些情况下,语法变格 API 降低了显示与查看者语法性别相关的字符串的工作量——也就是说,是指正在查看 UI 的人,而不是被谈论的人。要在您的应用中向用户显示个性化翻译,添加针对每种语法性别进行变格的翻译,然后使用 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>