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

有 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>