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

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 では、性別で文法が変わる言語に合わせてユーザー中心の 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>