Omówienie rozwiązań w zakresie języka i regionu

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ów es_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:

Tabela 1. Rozpoznawanie zasobów bez dokładnego dopasowania języka.

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:

Tabela 2. Ulepszona strategia rozwiązywania problemów, gdy nie ma dokładnego dopasowania do języka.

Ustawienia użytkownika Zasoby dotyczące aplikacji Rozwiązanie zasobu
  1. fr_CH
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ę.

Tabela 3. rozpoznawanie zasobów, gdy aplikacja pasuje tylko do drugiego preferowanego ustawienia języka użytkownika.

Ustawienia użytkownika Zasoby dotyczące aplikacji Rozwiązanie zasobu
  1. fr_CH
  2. it_CH
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")
    }
}
Ze względu na sposób, w jaki system kompilacji łączy zasoby z Twojej aplikacji i jej zależności, musisz w ten sposób określić obsługiwane języki, aby ustawienia języka użytkownika otrzymywały prawidłowe.

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)