文法上の性別でアプリの UI をパーソナライズする

有 30 亿人在使用区分性别的语言,此类语言的语法类别(例如名词、动词、形容词和介词)会根据您交谈所涉及的人或物的性别而变化。传统上,许多区分性别的语言使用阳性语法性别作为默认或通用性别。

以错误的语法性别来称呼用户,例如以阳性语法性别来称呼女性,可能会对她们的表现和态度产生负面影响。相比之下,界面语言如果能正确反映用户的语法性别,就可以提高用户互动度,并提供更个性化、更自然的用户体验。

Android 14 では、性別で文法が変わる言語に合わせてユーザー中心の UI を構築するため、アプリをリファクタリングせずに文法上の性別への対応を追加できる Grammatical Inflection API が導入されています。

性別に応じて文法が変わる例

性別で文法が変わる言語の場合、文法上の性別を英語の場合と同じように使用することはできません。たとえば、アプリのサービスに登録されていることをユーザーに知らせるメッセージを記述する場合、英語では次のような 1 つのフレーズだけで対応できます。 「You are subscribed to...」

同様のフレーズをフランス語で記述する場合は、性別によって変わります。

  • 男性向け: 「Vous êtes abonné à...」 (英語: 「You are subscribed to...」)
  • 女性向け: 「Vous êtes abonnée à...」(英語: 「You are subscribed to...」)
  • 変化させない中立的なフレーズ: 「Abonnement à...activé」(英語: 「Subscription to ... enabled」)

英語と同様に、最初の 2 つのオプションはユーザーに応じて自動的に変わります。ただし、このフランス語の文法上の特徴に対応するメカニズムがなければ 3 つ目のオプションしかないため、メッセージのトーンが変わってしまい、ユーザー インターフェースに表示できなくなる可能性があります。

このようなケースでは、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>