W formularzu mam pole select (parametr edit_locale), które wyświetla wszystkie języki dostępne w aplikacji. Mam też pola, które występują w odpowiednim języku. Chciałbym, aby po wybraniu języka zmieniał się parametr edit_locale i dzięki temu możnaby załadować pola w odpowiednim języku. Jak to zrobić?
i kod odpowiadający za zmianę tłumaczenia aktualnie edytowanej strony:
<%= javascript_tag do %>
function reload() {
edit_locale = $("#page_edit_locale").val();
url = '<%= edit_page_path(@page.id, locale: @locale) %>';
window.location.href = url + "?edit_locale=" + edit_locale; }
<% end %>
I wyświetlane tłumaczenia są zależne od parametru edit_locale. Jeżeli go nie ma to przyjmowany jest język aktualnie używany. Czy można to zrobić lepiej?
EDIT:
A czy jest możliwe, aby wykonać to bez użycia JS/jQuery?
Widzę trzy możliwe “usprawnienia” działania Twojego formularza:
Załadować wszystkie pola i ukryć przez CSS/JS te które nie odpowiadają aktualnie wybranemu językowi. Dzięki temu unikniesz konieczności przeładowywania strony przy zmianie języka (wszystkie zmiany w tłumaczeniach zostaną przesłane razem z formularzem)
Przeładowywać tylko fragment formularza zawierający tłumaczenia za pomocą AJAXa, po wybraniu przez użytkownika języka (tylko aktualnie widoczne zmiany zostaną wysłane razem z formularzem, chyba że jakoś sprytnie zapiszesz wszystkie nieaktywne tłumaczenia np. w ukrytych polach)
BEZ JS. Zrób oddzielny formularz zawierający tylko pole select z językiem i przycisk “zmień”. Po wybraniu języka i wciśnięciu zmień przekieruj na podstawie wybranego języka na odpowiedni formularz.
Po wybraniu języka wczytuje się odpowiedni adres. Jest tylko jeden problem, ponieważ w routes ustaliłem sobie adres np. (/:locale)/admin(/:edit_locale)/pages/:id/edit(.:format), a po tym jak zmieni się język w formularzu otrzymuje adres np. http://localhost:3000/pl/admin/pages/new?utf8=✓&edit_locale=en, a chciałbym uzyskać http://localhost:3000/pl/admin/en/pages/new Jak można to naprawić? Oczywiście jest to wersja bez JavaScript’u, więc rozwiązanie z pierwszego postu nie będzie dobre.