Edycja tłumaczeń w formularzu

Witam,

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ć?

EDIT:

Narazie wykombinowałem coś takiego:
select wyświetlający języki:

<%= f.collection_select :edit_locale, @languages, :locale, :title, {:selected => params[:edit_locale] }, :class => "form-control", onchange: "reload()" %>

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?

Pozdrawiam,
brando.

Widzę trzy możliwe “usprawnienia” działania Twojego formularza:

  1. 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)
  2. 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)
  3. 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.
1 Like

Dzięki za odpowiedź. Aktualnie mam taki formularz:

<%= form_tag edit_page_path, method: :get do %>
<%= select_tag 'edit_locale', options_for_select(LANGUAGES, 
  params[:edit_locale].nil? ? I18n.locale.to_s : params[:edit_locale]), onchange: 'this.form.submit()' %>
  <%= submit_tag 'submit' %>
  <%= javascript_tag "$('.locale input').hide()" %>
<% end %>

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.

EDIT:

Już sobie poradziłem. Użyłem metody put:

form_tag(change_edit_locale_path, :method => "put", :class => "locale")

i zdefiniowałem odpowiednią metodę, która przekierowuje na odpowiednią stronę.