Jeżeli ktokowiek budował aplikację w Rails, która opiera się na devise i
aplikacja ta nie była tylko w języku angielskim to na pewno natrafił na
problem lokalizacji tego gema. Autorzy devise nie przyłożyli się do tej kwestii zbyt poważnie.
Mimo, iż istnieje plik devise.en.yml
w którm występuje cześć tekstów
to nie są to wszystkie.
Wiele tekstów wyświetlanych zarówno w widokach jak i w wysyłanych
wiadomościach email są ‚hardcoded’ – czyli na sztywno umieszczone w
miejscach, które utrudniają ich edycję.
Kilka dni temu na światło dzienne wyszła nowa wersja tego gema oznaczona
numerem 1.2, która po części naprawiła powyższe problemy. Jednocześnie
jednak stworzyła kilka kolejnych.
Udało mi się uzupełnić stare tłumaczenia o nowe i umieściłem całość w
tym miejscu.
Nowy problem
Domyślnie w Devise, gdy rejestrujemy się w systemie, to automatycznie
zostajemy do niego zalogowani. Chyba, że w opcjach mamy ustawiony
obowiązek aktywacji konta poprzez email. W takiej sytuacji nowa wersja
wyświetla nam komunikat:
„Rejestracja zakończyła się pomyślnie. Nie zostałeś jednak zalogowany ponieważ konto jest %{reason}.”
No właśnie czym jest ten reason?
Reason jak łatwo się domyśleć jest powodem dlaczego nie zostaliśmy
zalogowani automatycznie. Domyślnie, gdy nie aktywujemy konta to reason
jest równe „unconfirmed”.
Niestety komunikat o treści:
„Rejestracja zakończyła się pomyślnie. Nie zostałeś jednak zalogowany ponieważ konto jest unconfirmed.”
nie brzmi zbyt dobrze. Próbowałem kilku sposobów umieszczenia
tłumaczenia w pliku polonizacyjnym, zawsze w innym miejscu jednak ciągle
kończyło się to fiaskiem.
Jak zatem uzyskać ładne tłumaczenie?
Znalazłem winowajcę w module Confirmable
. Otóż jest tam metoda
inactive_message
, która jest wywoływana gdy musi umieścić coś w treści
podanej wyżej wiadomości jako reason
.
1 2 3 4 |
def inactive_message !confirmed? ? :unconfirmed : super end |
Zwracany symbol jest zamieniany na string i umieszczany w treści
wiadomości.
Jeżeli zatem chcemy cieszyć się ładnym, w pełni polskim komunikatem to
musimy albo skorzystać z monkey patching
tej metody, albo zmienić
komunikat wiadomości w pliku polonizującym tak aby nie używał
%{reason}
.
Ja skorzystałem z pierwszego sposobu i gdzieś w initializatorach
umieściłem kawałek kodu:
1 2 3 4 5 6 7 8 9 10 11 12 |
module Devise module Models module Confirmable def inactive_message !confirmed? ? "niekatywne" : super end end end end |
Działać – działa. Jednak czy monkey patching
jest odpowiednim sposobem
na coś tak prostego?
.