Jak obsłużyć kilka języków w aplikacji na Androida?

8 minut czytania
Komentarze

Dzisiaj zajmiemy się dość lekkim tematem. Pewnie rzadko zmieniacie język w swoim telefonie i nie macie okazji zauważyć, jak na taką zmianę reagują aplikacje. Jednak nie martwcie się, opowiem Wam o wszystkim, co jest związane z tym tematem.

Co się wiąże ze zmianą języka?

Pamiętacie odcinek o tworzeniu interfejsów użytkownika? Wspominałem tam, że nasza aplikacja zostaje zrestartowana podczas obrotu ekranu. Dokładnie to samo dzieje się w przypadku zmiany języka przez użytkownika. Podobnie jak w tamtym przypadku, system daje nam szansę na dostosowanie interfejsu do nowo wybranego języka (pamiętajmy, że są języki czytane od prawej do lewej). Aplikacja wszystkie teksty trzyma w pamięci urządzenia. Nie ma więc potrzeby pobierania niczego z internetu — chociaż Google pracuje nad tym, aby to zmienić tak, aby zmniejszyć wagę plików apk. Z perspektywy użytkownika wszystko jest proste. Po zmianie języka nagle większość aplikacji obsługuje nowo wybrany język, bez potrzeby pobierania żadnych dodatkowych danych.

Jak stworzyć aplikację wielojęzykową?

W standardowych przypadkach programiście nie robi różnicy, czy ma stworzyć aplikację obsługującą jeden lub wiele języków. Tworząc aplikację na Androida w wersji 4.2 lub wyższej, nie musimy się nawet martwić językami czytanymi od prawej do lewej, ponieważ Android w tej właśnie w wersji wprowadził narzędzia umożliwiające tworzenie interfejsów niezależnych od kierunku czytania. Przejdźmy jednak do konkretów. Najlepiej proces tworzenia aplikacji wielojęzykowej będzie przedstawić na konkretnym przykładzie. Wyobraź sobie, że chcesz stworzyć aplikację, która posiada przycisk „Zamów pizzę”. Dodatkowo chciałbyś wprowadzić do sklepu wersję w języku angielskim. Podczas tworzenia interfejsu dodając przycisk, nie ustawiasz mu bezpośrednio tekstu „Zamów pizzę”, zamiast tego podajesz tam nazwę klucza ze specjalnego pliku zawierającego wszystkie Twoje teksty.

Jak to wygląda w praktyce?

Pewnie ostatnie zdanie z poprzedniego akapitu zabrzmiało nieco skomplikowanie, dlatego postaram się pokazać wszystko w praktyce. Zamiast dodawać tekst bezpośrednio do kontrolki tak jak na screenie poniżej, zwróć uwagę przede wszystkim na atrybut „android:text”.

Dodajemy odnośnik do tego samego tekstu, ale zapisanego w osobnym pliku:

Tak wygląda zawartość pliku z polskimi tekstami:

Poszczególne pliki z odpowiednimi językami musimy przypisać do odpowiednich folderów — pewnie pamiętacie z poprzednich odcinków. Folder values trzyma atrybuty domyślne, więc jeśli nasza aplikacja nie będzie wspierać jakiegoś języka, zostaną pokazane teksty z pliku strings.xml, znajdującego się w tym właśnie folderze. Tworząc aplikacje, jako domyślny język ustawia się zazwyczaj angielski, reszta języków jest językami dodatkowymi (znajdującymi się w osobnych katalogach values, na przykład values-pl).

Tak więc chyba zaczynacie rozumieć, o co w tym wszystkim chodzi. W każdym pliku strings.xml znajdują się dokładnie te same klucze, ale ich wartość jest tekstem przetłumaczonym do odpowiedniego języka. W przypadku zmiany języka system zaczyna korzystać z pliku dla odpowiedniego języka i na tym kończy się cała magia.

Jakie są komplikacje?

Sama implementacja tłumaczeń jest dość prosta, ponieważ programista definiuje jedynie teksty w jednym języku i odnosi się do nich za pomocą wspomnianych już kluczy. Jeśli chcemy dodać do naszej aplikacji kolejny język, wysyłamy nasz domyślny plik strings.xml do firmy tłumaczeniowej, a oni po jakimś czasie odsyłają nam już nasze teksty przetłumaczone do wybranego języka.

Jednak bardzo często pojawiają się pewne komplikacje. Szczególnie jeśli zamierzamy obsługiwać język naszych zachodnich sąsiadów. Powszechnie wiadomo, że w języku niemieckim jest sporo długich słów. Czasami może to nieco skomplikować tworzenie interfejsu użytkownika. Wyobraźcie sobie sytuację, że tworzycie aplikacje, w której na jakimś wąskim przycisku wyświetlacie słowo „motyl”. Pewnego razu przychodzi do Was klient i mówi, że chciałby przetłumaczyć aplikację na język niemiecki — wtedy dociera do Was, że motyl to po niemiecku „Schmetterling”. W takiej sytuacji musicie przerabiać swój interfejs, tak aby na przycisku zmieściło się słowo dłuższe aż o 8 znaków.

Kolejnym problemem są wspomniane wcześniej języki, w których czytamy od prawej strony. Wspominałem wyżej, że dla Androida nie stanowi to żadnego problemu, jednak czasami korzystamy z jakiś niestandardowych kontrolek i musimy się nieźle napocić, żeby wszystko ładnie ze sobą współpracowało. Warto już w momencie tworzenia interfejsu mieć na uwadze takie różnice językowe. Jeśli będziecie pracować w firmach, gdzie są zatrudnieni testerzy, to oni będą zwracać szczególną uwagę na to, czy interfejs wygląda dobrze we wszystkich wersjach językowych.

Różne podejścia do kwestii tłumaczeń

Przeważnie zmianą języka zarządza system Android. Każdy użytkownik może zmienić swój język w ustawieniach. Jednak niektórzy klienci chcą mieć zmianę języka wewnątrz aplikacji. Sam obecnie pracuję nad takim projektem. Niestety takie rozwiązanie nie jest do końca dobre i stwarza wiele problemów. System też słabo radzi sobie ze zmianą języka wewnątrz aplikacji, bez wpływania na cały system, najbezpieczniej jest wyłączyć i włączyć aplikację jeszcze raz, tak aby wszystkie teksty zostały przeładowane. Tutaj mogę podać ciekawostkę — Android nie udostępnia skutecznego narzędzia do zrestartowania aplikacji. Aby to zrobić, musimy ją wyłączyć, poprzednio ustawiając alarm, który uruchomi ją ponownie za 5 sekund — takie tam androidowe smaczki.

Jak obsłużyć kilka platform?

Większość platform ma podobny system tłumaczeń co Android. Czyli w interfejsie podajemy tylko nazwy kluczy, a same teksty znajdują się w osobnych plikach. Łatwo wyobrazić sobie sytuację, w której będziemy mieć te same teksty na kilku platformach, lecz zapisane w kluczach o różnej nazwie. Z perspektywy klienta jest to spore marnotrawstwo, ponieważ podczas tłumaczenia będzie musiał płacić kilka razy za to samo. Dlatego w takich systemach już od początkowych faz dba się, o uspójnienie kluczy. Służą do tego odpowiednie narzędzia, w których wygląda to tak, że każdy wiersz odpowiada za daną frazę, a w kolejnych kolumnach są nazwy kluczy dla danej platformy. Dobre narzędzia umożliwiają później eksport takich danych do odpowiednich plików na każdą z platform.

Niestety każda zmiana tekstów wymaga wydania aktualizacji aplikacji. Dlatego niektórzy klienci wymagają systemu tłumaczeń, który pozwalałby edytować teksty online, bez potrzeby przeprowadzania aktualizacji aplikacji. Jest to dość ciężka sprawa, ponieważ Google nie udostępnia do tego żadnego narzędzia. Przeważnie rozwiązuje się to w ten sposób, że podczas uruchomienia aplikacji wykonujemy zapytanie na serwer i pobieramy wszystkie klucze używane w aplikacji. Następnie nadpisujemy systemowe rozwiązanie i zamiast kluczy systemowych, używamy tych naszych, które pobraliśmy z serwera. Jest to dość skomplikowany i pracochłonny proces i często powoduje jakieś błędy. Każdy programista, którego znam, będzie próbował namówić klienta do zrezygnowania z takiego pomysłu.

Czy obsługa języków jest trudna?

Tak jak wspominałem na początku, samo zagadnienie nie jest czymś trudnym, o ile nie chcemy wprowadzać jakiś niestandardowych rozwiązań, takich jak przykładowo tłumaczenia online. Nie jest to na pewno temat, którym musisz się jakoś strasznie martwić podczas nauki tworzenia aplikacji androidowych. Wystarczy, żebyś pamiętał, aby zawsze używać kluczy z pliku strings.xml.To już koniec na dziś, tak jak zapowiadałem, dzisiejszy artykuł był dość lekki. W kolejnym odcinku pokażę Wam ciekawe funkcjonalności androida, które mało kto wspiera. Do zobaczenia!

Zapraszam również na największe w Polsce forum dla programistów Android. Jeśli macie pytania odnośnie do kariery programisty — zapraszam do działu Kariera programowanie. Zachęcam również do przejrzenia działu Praca oraz zlecenia dla programistów — być może to właśnie tam znajdziesz swoją pierwszą pracę.

Poprzednie odcinki:

  1. Typowy dzień pracy programisty
  2. Wady pracy programisty
  3. Zalety pracy programisty
  4. [FAQ] Wszystko, co powinieneś wiedzieć, jeśli interesuje Cię praca programisty
  5. Co mnie zdziwiło w programowaniu?
  6. Motywacje – w jaki sposób nie stracić zapału do programowania?
  7. Jaką firmę wybrać na początku kariery programisty?
  8. Jak wygląda rozmowa o pracę na stanowisko programisty?
  9. Jak zacząć programować?
  10. Skąd czerpać wiedzę o programowaniu?
  11. Początki programowania — jaką technologię wybrać?
  12. Cykl życia aplikacji na Androida — co to takiego?
  13. Jak tworzymy interfejs użytkownika w aplikacjach na Androida?
  14. Jak system Android oszczędza energię?
  15. Jak działają i czym są powiadomienia push w Androidzie?
  16. W jaki sposób aplikacje pobierają dane z zewnętrznych serwisów i czym jest API?
  17. Jak działają pozwolenia w systemie Android?
  18. Śledzenie użytkowników — co wiedzą o nas aplikacje?
  19. Dlaczego aplikacje na Androida zajmują coraz więcej miejsca?
  20. Frameworki crossplatform – jak stworzyć aplikację na iOS i Androida jednocześnie?

Motyw