문법적 성별로 앱 UI 맞춤설정

30억 명의 사용자가 성별이 지정된 언어를 사용합니다. 이 언어는 이야기하는 사람과 사물의 성별에 따라 문법적 카테고리(예: 명사, 동사, 형용사, 전치사)가 영향을 받는 언어입니다. 일반적으로 성별이 지정된 많은 언어에서 남성형 문법적 성별을 기본 성별이나 일반 성별로 사용합니다.

여성을 남성형 문법적 성별로 언급하는 등 잘못된 문법적 성별로 사용자를 언급하면 사용자의 실적과 태도에 부정적인 영향을 미칠 수 있습니다. 반면 사용자의 문법적 성별을 올바르게 반영하는 언어로 된 UI는 사용자 참여를 개선하고 보다 맞춤설정되고 자연스러운 사용자 환경을 제공할 수 있습니다.

성별이 지정된 언어의 사용자 중심 UI를 빌드할 수 있도록 Android 14에서는 앱 리팩터링 없이 문법적 성별에 관한 지원을 추가할 수 있는 Grammatical Inflection API를 도입합니다.

문법적 성별의 굴절 예

성별이 지정된 언어에서는 문법적 성별을 영어와 동일한 방식으로 처리할 수 없습니다. 예를 들어 사용자가 앱의 서비스를 구독하고 있음을 알리는 메시지를 영어로 작성하려면 '...을(를) 구독하고 있습니다'라는 단일 문구를 사용할 수 있습니다.

프랑스어로 비슷한 문구를 제공하려면 몇 가지 옵션이 있습니다.

  • 남성형 형식: 'Vous êtes abonné à...' (영어: '...을(를) 구독하고 있습니다.')
  • 여성형 형식: 'Vous êtes abonnée à...' (영어: '...을(를) 구독하고 있습니다.')
  • 굴절이 나타나지 않는 중성적 문구: 'Abonnement à...activé' (영어: '... 구독 사용 설정됨')

영어와 마찬가지로 처음 두 가지 옵션은 사용자를 직접 대상으로 합니다. 하지만 프랑스어의 이 문법적 기능을 수용하는 메커니즘이 없다면 세 번째 옵션만 사용할 수 있습니다. 이는 메시지의 어조를 변경하고, 사용자 인터페이스에 표시하려는 것이 아닐 수도 있습니다.

이 경우 Grammatical Inflection 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>