Personalizowanie interfejsu aplikacji za pomocą gramatycznego rodzaju

3 miliardy ludzi mówi językami z płcią: językami, w których kategorie gramatyczne (np. rzeczowniki, czasowniki, przymiotniki i przyimki) odmieniają się w zależności od płci osób i rzeczy, do których się zwracamy lub o których mówimy. Tradycyjnie wiele języków z płcią gramatyczną używa męskiej formy gramatycznej jako domyślnej lub uniwersalnej.

Zwracanie się do użytkowników w niewłaściwym rodzaju gramatycznym, np. do kobiet w męskim rodzaju gramatycznym, może negatywne wpłynąć na ich wyniki i postawę. Z kolei interfejs z językiem, który poprawnie odzwierciedla płeć gramatyczną użytkownika, może zwiększyć zaangażowanie użytkowników i zapewnić bardziej spersonalizowane i naturalne wrażenia.

Aby ułatwić Ci tworzenie interfejsu użytkownika w językach z rodzajami gramatycznymi, Android 14 wprowadza interfejs API do odmiany przez przypadki, który umożliwia dodanie obsługi rodzaju gramatycznego bez konieczności refaktoryzacji aplikacji.

Przykład odmiany gramatycznej

W językach, w których występuje podział na płeć, nie można obejść gramatycznego rodzaju. Na przykład po angielsku możesz napisać wiadomość informującą użytkownika o tym, że subskrybują usługę w Twojej aplikacji, możesz użyć jednego wyrażenia: „Subskrybujesz...”.

Aby wyświetlić podobne wyrażenie w języku francuskim, możesz użyć kilku opcji:

  • Postać z tekstem męskim: „Vous êtes abonné à...” (English: „You are subscribed to...")
  • Formuła z inspiracjami żeńskimi: „Vous êtes abonnée à...” (English: „You are subscribed to...")
  • Neutralne sformułowanie, które pozwala uniknąć odmiany: „Abonnement à...activé” (Angielski: „Subskrypcja ... włączona”)

Podobnie jak w przypadku języka angielskiego, pierwsze 2 opcje zwracają się bezpośrednio do użytkownika. Pamiętaj jednak: bez żadnego mechanizmu uwzględniania tej funkcji gramatycznej języka francuskiego, może wybrać tylko 3 opcję, która zmienia ton przekazu mogą nie być to, co chcesz widzieć w interfejsie.

W takich przypadkach interfejs Grammatical Inflection API pozwala zmniejszyć nakład pracy od rodzaju gramatycznej płci odbiorcy, czyli osoby, która wyświetlanie interfejsu, a nie interfejsu użytkownika. Aby wyświetlać użytkownikom spersonalizowane treści tłumaczeń w aplikacji, dodaj takie, które będą się wyświetlać rodzaj gramatycznej języka, którego dotyczy problem, a następnie użyć operatora GrammaticalInflectionManager API do określania, które tłumaczenia są wyświetlane do każdego użytkownika.

W wielu językach rodzaj gramatyczny dotyczy nie tylko ludzi, ale też zwykłych rzeczowników. Na przykład po francusku słowo szezlong (krzesło) jest żeńskie, a oiseau (ptak) jest męskie. W sytuacjach innych niż zwrócenie się do użytkownika może użyć dotychczasowego interfejsu API ICU SelectFormat.

Wdrażanie interfejsu API

Gdy użytkownik określi swoją płeć gramatyczną (np. w sekcji ustawień aplikacji lub podczas procesu konfiguracji użytkownika), możesz użyć funkcji metody setRequestedApplicationGrammaticalGender(int) do przechowywania w konfiguracji zasobów aplikacji.

Jeśli na przykład chcesz ustawić preferowany rodzaj gramatyczny użytkownika na żeński, poproś go o wybranie preferowanego rodzaju gramatycznego, a potem wywołaj interfejs 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);

Oto przykład deklarowania zmian konfiguracji w pliku manifestu aplikacji, jeśli chcesz je wprowadzać samodzielnie:

<activity android:name=".TestActivity"
              android:configChanges="grammaticalGender"
              android:exported="true">
</activity>

Jeśli aplikacja musi sprawdzić płeć gramatyczną w bieżącym zasobie konfiguracji, możesz użyć metody getApplicationGrammaticalGender() , aby go pobrać:

Kotlin

val gIM = mContext.getSystemService(GrammaticalInflectionManager::class.java)
val grammaticalGender = gIM.getApplicationGrammaticalGender()

Java

GrammaticalInflectionManager gIM =
    mContext.getSystemService(GrammaticalInflectionManager.class);
int grammaticalGender = gIM.getApplicationGrammaticalGender();

Dodawanie tłumaczeń w językach z rodzajem gramatycznym

Aby dodać zlokalizowany tekst dla języków ze względu na rodzaj gramatyczny, utwórz plik zasobów alternatywnych i dołącz kwalifikator płci gramatycznej. bezpośrednio po nazwie regionu dla tych języków. Tabela poniżej przedstawia możliwe wartości:

Kwalifikator Wartość ciągu znaków Przykład (francuski fr)
Żeński feminine res/values-fr-feminine/strings.xml
Męski masculine res/values-fr-masculine/strings.xml
Nijaki neuter res/values-fr-neuter/strings.xml

W tych plikach zasobów należy uwzględnić tylko ciągi znaków, które obsługują odmiany gramatyczne rodzaju. Wszystkie ciągi tekstowe muszą mieć wartość w pliku zasobu domyślnego, który zawiera inne zlokalizowane ciągi tekstowe. Ten domyślny przekład jest wyświetlany, gdy nie można znaleźć przekładu uwzględniającego płeć.

W przykładzie podanym wcześniej dla języka francuskiego neutralne sformułowanie to wartość ciągu znaków w pliku zasobów domyślnych res/values-fr/strings.xml. Poniższe fragmenty kodu pokazują formatowanie każdego pliku zasobów uwzględnij wszystkie odmiany gramatyczne z przykładu w języku francuskim:

Żeński

Umieść łamany przez przypadki żeński ciąg znaków w pliku zasobów res/values-fr-feminine/strings.xml:

<resources>
    ...
    <string name="example_string">Vous êtes abonnée à...</string>
</resources>

Męski

Uwzględnij ciąg znaków z formą męską w pliku zasobów res/values-fr-masculine/strings.xml:

<resources>
    ...
    <string name="example_string">Vous êtes abonné à...</string>
</resources>

Nijaki

Uwzględnij domyślny ciąg znaków w pliku zasobów res/values-fr/strings.xml:

<resources>
    ...
    <string name="example_string">Abonnement à...activé</string>
</resources>