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.

Android 14 pomoże Ci tworzyć interfejs zorientowany na użytkownika w przypadku języków różnych płci. wprowadza interfejs Grammatical Inflection API, który umożliwia dodanie płeć gramatyczną bez refaktoryzacji aplikacji.

Przykład odmiany gramatycznej

W językach uwzględniających płeć nie można używać gramatycznej płci w taki sam sposób, jak po angielsku. 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é à...” (Po angielsku: „Jesteś zasubskrybował(a)...”).
  • Formuła z inspiracjami żeńskimi: „Vous êtes abonnée à...” (Po angielsku: „Jesteś zasubskrybował(a)...”).
  • 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, oprócz rzeczowników regularnych, rodzaj gramatyczny odnosi się też do rodzaju gramatycznego. krzywdzenia ludzi. 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ć preferowaną płeć gramatyczną użytkownika na żeński, należy poprosić użytkownika o wybranie preferowanej formy gramatycznej. a następnie wywołaj 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, jak zadeklarować zmiany konfiguracji w tagu manifestu, jeśli chcesz obsługiwać je 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();

Dodaj tłumaczenia dla języków z płcią gramatyczną

Aby dodać przetłumaczony 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

Należy dodawać tylko ciągi tekstowe z gramatyczną zamianą płci w te pliki zasobów. Wszystkie ciągi muszą mieć wartość w zasobie domyślnym który zawiera inne zlokalizowane ciągi znaków. To domyślne tłumaczenie to wyświetla się, gdy tłumaczenie z uwzględnieniem płci jest niedostępne.

W wcześniejszym przykładzie dla języka francuskiego neutralnym sformułowaniem byłoby wartość ciągu w zasobach 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

Uwzględnij ciąg znaków z formą żeńską 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

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

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