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>