Menggunakan gem mengglobal, bagaimana cara beralih lokal hanya untuk input dan bukan seluruh halaman?

10

Konteks: Untuk aplikasi Ruby on Rails untuk persewaan sepeda, saya menggunakan permata mengglobal untuk menangani input :descriptiondalam berbagai bahasa.

Keadaan saat ini: Implementasi global berfungsi, tergantung pada lokal saya, saya dapat menyimpan descriptiondalam bahasa tertentu. Input untuk :descriptionditangani berdasarkan lokal dari seluruh halaman web.

Ini berarti bahwa semua yang ada di halaman ini harus berubah dalam bahasa untuk menyimpan :descriptiondalam bahasa yang benar.

Atau, saya juga dapat menunjukkan semua lokal yang tersedia dan menunjukkan descriptionuntuk masing-masing. (Lihat juga kode komentar di bawah).

Pertanyaan: Saya sedang mencari cara untuk membiarkan pengguna memilih bahasa :descriptionsaja dan kemudian menyimpannya :descriptiondalam bahasa yang benar tanpa mengubah bahasa seluruh halaman web.

Kode

bentuk

<div class="row">
        <%# I18n.available_locales.each do |locale| %>
          <!-- <h1><%#= locale %></h1> -->
          <%= f.globalize_fields_for locale do |ff| %>
          <div class="col-10">
            <div class="form-group">
              <label class="form-control-label text required" for="accommodation_category_description">Description</label>
              <div><%= ff.text_area :description, :rows =>"5", :cols =>"30",  class:"form-control is-valid text required" %></div>
              </div>
            </div>
          <% end %>
        <%# end %>
        </div>
      </div>

initializers / globalisasi.rb

module ActionView
  module Helpers
    class FormBuilder
      #
      # Helper that renders translations fields
      # on a per-locale basis, so you can use them separately
      # in the same form and still saving them all at once
      # in the same request.

      def globalize_fields_for(locale, *args, &proc)
        raise ArgumentError, "Missing block" unless block_given?
        @index = @index ? @index + 1 : 1
        object_name = "#{@object_name}[translations_attributes][#{@index}]"
        object = @object.translations.find_by_locale locale.to_s
        @template.concat @template.hidden_field_tag("#{object_name}[id]", object ? object.id : "")
        @template.concat @template.hidden_field_tag("#{object_name}[locale]", locale)
        @template.fields_for(object_name, object, *args, &proc)
      end
    end
  end
end

pertanyaan teknologi
sumber

Jawaban:

3

Anda dapat menggunakan Globalize.with_localeuntuk sementara mengatur lokal, ini juga berfungsi untuk tampilan:

<% Globalize.with_locale(some_other_locale) do %>
  in this part of the page locale will be <%= locale.inspect %>
<% end %>

Tetapi untuk kasus Anda, cara yang lebih ramah pengguna adalah dengan membuat formulir menjadi dinamis, sehingga pengguna dapat menambahkan terjemahan untuk beberapa bahasa yang mereka sukai.

Globalisasi terjemahan hanyalah tabel / model tambahan YourModel::Translationdengan bidang untuk lokal dan bidang yang diterjemahkan, sehingga Anda dapat bekerja secara langsung dengan ini seperti dengan formulir bersarang lainnya.

Tambahkan kepompong permata ke proyek Anda, yang akan menangani formulir dinamis (jika Anda menggunakan webpacker alih-alih pipa aset - yang mungkin memerlukan langkah-langkah tambahan, untuk menambahkan jquery global dan membutuhkan js dari permata menggunakan interpolasi erb, lihat lebih lanjut di sini ).

Dalam model Anda:

translates :description #, ...
accepts_nested_attributes_for :translations, allow_destroy: true

dalam controller:

def your_some_params
  params.require(:your_model_name).permit(
        ...
        translations_attributes: [
          :id, :_destroy,
          :locale,
          :description,
        ]
      )
end

dalam bentuk:

  <div id='translations'>
    <%= form.fields_for :translations do |t| %>
      <%= render 'translation_fields', f: t %>
    <% end %>

    <div class='links'>
      <%= link_to_add_association 'add translation', form, :translations  %>
    </div>
  </div>

sebagian untuk terjemahan seperti:

<div class='nested-fields'>
  <%= f.hidden_field  :id %>
  <%= f.select :locale, I18n.available_locales %>
  <%= f.text_area :description %>

  <%= link_to_remove_association "remove this translation", f %>
</div>
Vasfed
sumber
Terima kasih Vasfed !! Sangat berguna
techquestion