使用文法性別自訂應用程式的使用者介面

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.

為了協助你針對使用文法性別的語言,建構以使用者為中心的使用者介面,Android 14 採用了文法轉變 API,可讓你新增對文法性別的支援,而不必重構應用程式。

文法性別轉變範例

在使用文法性別的語言中,文法性別的運作方式與英文不同。舉例來說,如要使用英文撰寫訊息,通知使用者他們已訂閱應用程式的服務,你可以使用以下短句:「您已訂閱...」。

如要提供法文的類似短句,以下有幾個選項:

  • 陽性變化格式:「Vous êtes abonné à...」(英文:「您已訂閱...」)
  • 陰性變化格式:「Vous êtes abonnée à...」(英文:「您已訂閱...」)
  • 可避免詞形變化的中性短句:「Abonnement à...activé」(英文:「已啟用 ... 訂閱」)

與英文類似,前兩個選項可直接指稱使用者。不過,如果沒有任何機制來適應法語的這種文法特徵,則只能提供第三種選項,這會改變訊息內容的語氣,而且可能不適合顯示在使用者介面中。

在這些情況下,文法轉變 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>