Począwszy od Androida 7.0 (poziom interfejsu API 24) Android zapewnia rozszerzoną obsługę użytkowników wielojęzycznych, umożliwiając im wybranie wielu języków w ustawieniach. Android zapewnia tę możliwość przez znaczne zwiększenie liczby obsługiwanych języków i zmianę sposobu rozwiązywania zasobów przez system.
Na początku tego dokumentu objaśniamy strategię rozstrzygania zasobów na urządzeniach z Androidem w wersjach starszych niż 7.0 (poziom interfejsu API 24). Następnie opisujemy udoskonaloną strategię rozwiązywania zasobów zasobów w Androidzie 7.0. Na koniec wyjaśniamy, jak wykorzystać zwiększoną liczbę języków, by obsługiwać większą liczbę użytkowników wielojęzycznych.
Wyzwania związane z rozwiązywaniem problemów językowych
Przed Androidem 7.0 Android nie zawsze mógł być zgodny z językami aplikacji i systemu.
Załóżmy na przykład, że zachodzi taka sytuacja:
- Domyślnym językiem Twojej aplikacji jest
en_US
(angielski – amerykański). Ponadto aplikacja zawiera ciągi hiszpańskie zlokalizowane w plikach zasobówes_ES
. - Urządzenie jest ustawione na
es_MX
Gdy kod Java odwołuje się do ciągów tekstowych, system będzie je wczytywać z domyślnego pliku zasobów (en_US
), nawet jeśli aplikacja zawiera zasoby w języku hiszpańskim zlokalizowane w języku es_ES
. Dzieje się tak, gdy system nie może znaleźć dokładnego dopasowania, a następnie szuka zasobów, usuwając kod kraju z języka. Jeśli nie uda się znaleźć dopasowania, system przywraca wartość domyślną, czyli en_US
.
System domyślnie ustawiłby też język en_US
, jeśli użytkownik wybrał język, którego aplikacja w ogóle nie obsługuje (np. francuski). Na przykład:
Ustawienia użytkownika | Zasoby dotyczące aplikacji | Rozwiązanie zasobu |
---|---|---|
fr_CH |
default (en) de_DE es_ES fr_FR it_IT |
Spróbuj fr_CH => Fail Try fr => Fail Use default (en) (Użyj wartości domyślnej (pl) |
W tym przykładzie system wyświetla ciągi angielskie, nie wiedząc, czy użytkownik rozumie język angielski. Takie zachowanie jest obecnie dość powszechne.
Ulepszenia strategii wykorzystywania zasobów
Android 7.0 (poziom interfejsu API 24) umożliwia sprawniejsze rozpoznawanie zasobów i automatyczne znajdowanie lepszych kreacji zastępczych.
Jednak aby przyspieszyć rozwiązanie problemu i ułatwić utrzymanie, należy przechowywać zasoby w najpowszechniejszym dialekcie nadrzędnym.
Jeśli na przykład w poprzednim katalogu values-es-rUS
miały być przechowywane zasoby po hiszpańsku, przenieś je do katalogu values-b+es+419
, który zawiera hiszpański latynoamerykański.
Podobnie, jeśli masz ciągi zasobów w katalogu o nazwie values-en-rGB
, zmień nazwę katalogu na values-b+en+001
(angielski międzynarodowy), ponieważ najczęstszym elementem nadrzędnym w przypadku ciągów en-GB
jest en-001
.
Z przykładów poniżej dowiesz się, dlaczego te praktyki poprawiają wydajność i niezawodność rozwiązywania zasobów.
Przykłady rozpoznawania zasobów
W wersjach Androida nowszych niż 7.0 problem opisany w tabeli 1 przebiega inaczej:
Ustawienia użytkownika | Zasoby dotyczące aplikacji | Rozwiązanie zasobu |
---|---|---|
|
default (en) de_DE es_ES fr_FR it_IT |
Spróbuj fr_CH => Niepowodzenie Spróbuj fr => Niepowodzenie Spróbuj użyć elementów podrzędnych fr => fr_FR Użyj fr_FR |
Teraz użytkownik korzysta z zasobów w języku francuskim, a nie w języku angielskim. Ten przykład pokazuje też, dlaczego w przypadku Androida w wersji 7.0 lub nowszej należy przechowywać ciągi francuskie w usłudze fr
, a nie fr_FR
. W tym przypadku działanie to dopasowanie do najbliższego dialektu nadrzędnego, dzięki czemu rozwiązanie będzie szybsze i bardziej przewidywalne.
Poza udoskonaloną logiką rozdzielczości Android oferuje teraz więcej języków do wyboru. Powtórzmy powyższy przykład z językiem włoskim wybranym jako dodatkowy język użytkownika, ale bez obsługi języka francuskiego przez aplikację.
Ustawienia użytkownika | Zasoby dotyczące aplikacji | Rozwiązanie zasobu |
---|---|---|
|
default (pl) de_DE es_ES it_IT |
Spróbuj fr_CH => Niepowodzenie Spróbuj fr => Niepowodzenie Spróbuj dzieci z fr => Niepowodzenie Wypróbuj_CH => Nieudana Wypróbuj => Niepowodzenie Spróbuj tego dzieci => it_IT Używaj tego_IT |
Mimo że aplikacja nie obsługuje języka francuskiego, użytkownik nadal zna język, który zna.
Przygotowanie aplikacji pod kątem obsługi innych języków
Android udostępnia narzędzia, które ułatwiają zlokalizowanie treści aplikacji i angażowanie użytkowników w preferowanych językach. Zalecamy skonfigurowanie aplikacji w taki sposób, aby była zgodna z różnymi językami i konwencjami formatowania w skalowalny sposób.
Określ języki, które obsługuje aplikacja
Aby mieć pewność, że języki będą obsługiwane prawidłowo, określ je za pomocą właściwości resConfigs
w pliku build.gradle
na poziomie modułu.
Poniższy przykładowy kod pokazuje, jak za pomocą pola resConfigs
oznaczać obsługiwane języki.
W tym przykładzie aplikacja obsługuje język angielski i hiszpański.
Odlotowy
android { defaultConfig { ... resConfigs "en", "es" } }
Kotlin
android { defaultConfig { ... resConfigs("en", "es") } }
Interfejs API LocaleList
Od Androida 7.0 (poziom interfejsu API 24) Android ujawnia interfejs API LocaleList.getDefault()
, który umożliwia aplikacjom bezpośrednie wysyłanie zapytań o listę języków na liście języków określonych przez użytkownika. Umożliwia on tworzenie bardziej skomplikowanych sposobów działania aplikacji i lepiej zoptymalizowanego wyświetlania treści. Na przykład wyszukiwarka może wyświetlać wyniki w wielu językach na podstawie ustawień użytkownika. Aplikacje przeglądarki mogą uniknąć proponowania tłumaczenia stron w języku, który użytkownik zna, a aplikacje klawiatury mogą automatycznie włączyć wszystkie odpowiednie układy.
Formaty
Do Androida od wersji 6.0 (poziom interfejsu API 23) Android obsługiwał tylko 1 lub 2 lokalne języki (en, es, ar, fr, ru). Ponieważ istniało tylko kilka wariantów każdego języka, aplikacje mogły nie być w stanie zapisać niektórych liczb i dat jako zakodowanych na stałe ciągów w plikach zasobów. Jednak w przypadku rozbudowanego zestawu obsługiwanych ustawień regionalnych na Androidzie mogą występować znaczne różnice w formatach dat, godzin, walut i podobnych informacji nawet w obrębie jednego języka. Kodowanie na stałe formatów może być mylące dla użytkowników. Dlatego podczas tworzenia aplikacji na Androida w wersji 7.0 lub nowszej należy korzystać z formatów, a nie z kodowania na stałe i ciągów dat.
Na przykład Android 7.0 i nowsze wersje obsługują 27 języków arabskich. Te języki mogą współdzielić większość zasobów, ale niektóre preferują cyfry ASCII, a inne – cyfry natywne. Jeśli na przykład chcesz utworzyć zdanie ze zmienną cyfrową, taką jak „Wybierz 4-cyfrową pinezkę”, użyj narzędzi formatujących, jak pokazano poniżej:
format(locale, "Choose a %d-digit PIN", 4)