Spersonalizuj interfejs aplikacji, uwzględniając rodzaj gramatyczny

3 miliardy ludzi mówią w językach płciowych, czyli w językach, w których kategorie gramatyczne, takie jak rzeczowniki, czasowniki, przymiotniki i przyimki, wpływają na płeć osób i obiektów, o których rozmawiasz lub o których mówisz. Tradycyjnie wiele języków, w których płeć różni się od płci męskiej, jako domyślnej lub ogólnej używa formy gramatycznej.

Zwrócenie się do użytkowników w niewłaściwy sposób gramatyczny, np. zwrócenie się do kobiet w rodzaju męskim, może negatywnie wpłynąć na ich wyniki i nastawienie. Z kolei interfejs z językiem, który poprawnie odzwierciedla płeć użytkownika, może zwiększyć jego zaangażowanie oraz zapewnić bardziej spersonalizowane i naturalne brzmienie.

Aby ułatwić Ci przygotowanie UI w przypadku języków uwzględniających płeć, w Androidzie 14 wprowadzamy interfejs Grammatical Inflection API, który umożliwia dodanie obsługi płci gramatycznej bez refaktoryzacji aplikacji.

Przykład odmiany formy gramatycznej

W przypadku języków, w których rodzaj gramatyczny nie jest jednoznaczny, nie da się go potraktować tak samo jak w języku angielskim. Na przykład, jeśli chcesz napisać wiadomość informującą użytkownika, że subskrybuje usługę Twojej aplikacji, możesz użyć jednego wyrażenia: „Subskrybujesz...”.

Aby podać podobne wyrażenie w języku francuskim, masz kilka opcji:

  • Postać męska: „Vous êtes abonné à...” (angielski: „Subskrybujesz...”)
  • Postać z akcentem żeńskim: „Vous êtes abonnée à...” (angielski: „Subskrybujesz...”)
  • Neutralne sformułowanie z unikaniem odmienności: „Abonnement à...activé” (angielski: „Subscription to ... enabled”)

Podobnie jak w przypadku języka angielskiego pierwsze 2 opcje są skierowane bezpośrednio do użytkownika. Jednak bez mechanizmów gramatycznych, które mogłyby zostać zastosowane do tej funkcji gramatycznej języka francuskiego, byłaby to tylko trzecia opcja, która zmienia ton komunikatu i może nie być tym, co chcesz wyświetlać w swoim interfejsie.

W takich przypadkach interfejs Grammatical Inflection API ogranicza wysiłek związany z wyświetlaniem ciągów w odniesieniu do płci gramatycznej widza, czyli osoby, która przegląda interfejs, a nie tego, o czym się opowiada. Aby wyświetlać użytkownikom spersonalizowane tłumaczenia w aplikacji, dodaj tłumaczenia w przypadku poszczególnych rodzajów gramatycznych w przypadku odpowiednich języków, a następnie za pomocą interfejsu API GrammaticalInflectionManager wybierz, które tłumaczenia mają być wyświetlane użytkownikom.

W wielu językach płeć gramatyczna odnosi się nie tylko do osób, ale też do rzeczowników zwykłych. Na przykład w języku francuskim słowo szezef (krzesło) to żeński, a oiseau (ptak) to rodzaj męski. W sytuacjach innych niż zwrócenie się do użytkownika możesz skorzystać z istniejącego interfejsu API ICU SelectFormat.

Wdrażanie interfejsu API

Gdy użytkownik określi swoją gramatyczną płeć (np. w sekcji ustawień aplikacji lub w procesie konfiguracji przez użytkownika), możesz użyć metody setRequestedApplicationGrammaticalGender(int), aby zapisać wartość w konfiguracji zasobów aplikacji.

Jeśli np. chcesz ustawić preferowaną przez użytkownika płeć gramatyczną na żeński, poproś go o wybranie preferowanej formy gramatycznej i wywołanie interfejsu 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 pliku manifestu aplikacji, jeśli chcesz wprowadzić je samodzielnie:

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

Jeśli Twoja aplikacja wymaga sprawdzenia formy gramatycznej w bieżącej konfiguracji zasobów, możesz ją pobrać za pomocą metody getApplicationGrammaticalGender():

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 w przypadku języków, w których stosowana jest metoda gramatyczna

Aby udostępnić przetłumaczony tekst w przypadku języków, które mają formę gramatyczną, utwórz plik zasobów alternatywnych i dodaj kwalifikator płci gramatycznej tuż po nazwie danego języka. Możliwe wartości znajdziesz w tej tabeli:

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 tekstowe, które obsługują alternatywne formy gramatyczne. Wszystkie ciągi muszą mieć wartość w domyślnym pliku zasobów, który zawiera inne zlokalizowane ciągi znaków. To domyślne tłumaczenie wyświetla się zawsze, gdy nie jest dostępne tłumaczenie z uwzględnieniem płci.

W przykładzie podanym wcześniej dla języka francuskiego wyrażenie neutralne byłoby wartością ciągu tekstowego w pliku res/values-fr/strings.xml zasobów domyślnych. Poniższe fragmenty kodu pokazują format każdego pliku zasobów, aby uwzględnić wszystkie odmiany gramatyczne pochodzące z przykładu w języku francuskim:

Żeński

Umieść ciąg z akcentem w rodzaju żeńskim w pliku zasobów res/values-fr-feminine/strings.xml:

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

Męski

Umieść ciąg z użyciem formy męskiej do 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>