使用文法性別自訂應用程式's UI

30 億人使用性別化語言:即名詞、動詞、形容詞和介系詞會隨著交談或談論對象或目標的性別,而有不同變化形式的文法類別語言。一般來說,許多性別化語言都會使用陽性文法性別做為預設或通用性別。

若以錯誤的文法性別稱呼使用者,例如以陽性文法性別稱呼女性,可能會對其表現及態度產生負面影響。相較之下,如果使用者介面的用語正確反映了使用者的文法性別,便可提高使用者參與度,同時提供更個人化且更自然親切的使用者體驗。

為了協助你針對使用文法性別的語言,建構以使用者為中心的使用者介面,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>