W pewnym momencie gdy piszemy aplikacje na system android spotykamy się z kalendarzem tzn. musimy wyświetlić nazwy dni tygodnia lub miesięcy. Oczywiście możemy wyświetlić takie informacje w postaci liczb co niekoniecznie to estetycznie ładnie wygląda. Innym rozwiązaniem jest przypisanie stringów do dni tygodnia lub miesięcy i na tej podstawie prezentować datę (np: 28 stycznia 2017 roku). Jakieś to rozwiązanie na mniejszą skalę jest, ale też tutaj jest dużo zabawy. Kolejnym problemem jest to, że jeżeli mamy aplikację w kilku językach to te nazwy musimy tłumaczyć… A co powiesz na to aby takie nazwy wygenerować automatycznie i przy tym same się tłumaczyły? Właśnie ten wpis pokaże Ci w jaki sposób możesz to osiągnąć i generować nazwy dni i miesięcy oraz zostanie to automatycznie przetłumaczone na każdy język. Zapraszam do lektory 🙂
1. Formatowanie daty – SimpleDateFormat
SimpleDateFormat to klasa która umożliwia nam formatowanie i analizowanie daty. Formatowanie daty może odbywać się w 2 strony, z tekstu (String) -> do daty (Date) oraz z daty do tekstu. Dodatkowo ta klasa posiada dodatkowy argument gdzie jest to wzorzec za pomocą którego zostanie utworzony nowy sposób zapisu daty. W naszym przypadku interesuję nas tylko 3 wzorce są to litery: E, L, M.
Dla dni (E) reprezentacja wygląda następująco:
- ‚EEEE’ – dzień w postaci nazwy np. „poniedziałek”
- ‚EE’ – dzień w postaci nazwy np. „pon”.
Dla miesiąca (M) reprezentacja wygląda następująco:
- ‚M’ => miesiąc w postaci jednocyfrowej np. 1
- ‚MM’ => miesiąc w postaci dwucyfrowej np. 01
- ‚MMM’ => miesiąc w postaci skróconej nazwy np. „sty”
- ‚MMMM’ => miesiąc w postaci nazwy np. „stycznia”.
„stycznia„, a czemu nie styczeń? Ponieważ wszystkie nazwy są w dopełniaczu. Aby zrobić nazwy w mianowniku „Stycznia” zamiast literki „MMMM” stosujemy „LLLL” i wszystko śmiga. Czy jest możliwość odmiany na inne przypadki np: styczniu? Na chwilą obecną nie (albo ja nie znam sposobu aby to zrobić automatycznie) pewnie dlatego, że mało to się używa… W tym przypadku trzeba by było skorzystać ze stringów.
SimpleDateFormat trochę już poznaliśmy teraz czas na napisanie metody. Przykładowy kod dla generowanie dni tygodnia może wyglądać następująco:
private String getDayNames(String pattern) { StringBuilder dayname = new StringBuilder() SimpleDateFormat dateFormat = new SimpleDateFormat( pattern, Locale.getDefault() ); Calendar day = Calendar.getInstance(); day.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); for (int i = 0; i < 7; i++) { dayname.append("\n"); dayname.append( dateFormat.format(day.getTime()) ); day.add(Calendar.DAY_OF_WEEK, 1); } return dayname.toString(); }
Natomiast metoda dla generowanie nazw miesięcy może być taka:
private String getMonthNames(String pattern) { StringBuilder dayname = new StringBuilder(); SimpleDateFormat dateFormat = new SimpleDateFormat( pattern, Locale.getDefault() ); Calendar day = Calendar.getInstance(); day.set(Calendar.MONTH, Calendar.JANUARY); for (int i = 0; i < 12; i++) { dayname.append("\n"); dayname.append( dateFormat.format(day.getTime()) ); day.add(Calendar.MONTH, 1); } return dayname.toString(); }
Za tłumaczenie odpowiada nam trzeci parametr czyli „Locale.getDefault()”. W androidzie działa to tak, jeżeli użytkownik będzie miał ustawiony polski język interfejsu to dostanie polskie nazwy itd. Jak z tego korzystać? Aby wyświetlić wszystkie nazwy dni piszemy coś takiego:
textView.setText( getMonthNames("LLLL") );
Oczywiście nic nie stoi na przeszkodzie aby modyfikować tą metodę. Zwróć uwagę na to, że powyższe metody zwracają wszystkie nazwy dni i miesięcy.
2.Podsumowanie.
Jak widać w łatwy sposób możemy generować nazwy dni i miesięcy oraz dodatkowo tłumaczyć. Poniżej możesz to zobaczyć jak to wygląda w aplikacji: