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ć.

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>