Utilizzando la gemma globalizzare, come cambiare le impostazioni locali solo per l'input e non per l'intera pagina?


10

Contesto: per un'app Ruby on Rails per il noleggio di biciclette, sto usando la gemma globalizzare per gestire l'input :descriptionin diverse lingue.

Stato attuale: l'implementazione della globalizzazione ha funzionato, a seconda delle impostazioni internazionali che sono in grado di memorizzare descriptionin una lingua specifica. L'input per :descriptionviene gestito sulla base delle impostazioni internazionali di un'intera pagina Web.

Ciò significa che tutto in questa pagina deve cambiare nella lingua per poterlo memorizzare :descriptionnella lingua corretta.

In alternativa, sono anche in grado di mostrare tutti i locali disponibili e mostrare descriptionper ciascuno di essi. (Vedi anche il codice commentato di seguito).

Domanda: sto cercando un modo per consentire all'utente di selezionare solo una lingua :descriptione quindi salvarla :descriptionnella lingua corretta senza cambiare la lingua dell'intera pagina Web.

Codice

modulo

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

inizializzatori / globalization.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

Risposte:


3

È possibile utilizzare Globalize.with_localeper impostare temporaneamente le impostazioni internazionali, questo funziona anche per le viste:

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

Ma nel tuo caso un modo più user friendly sarebbe quello di rendere dinamico il modulo, in modo che l'utente possa aggiungere la traduzione per diverse lingue di suo gradimento.

Le traduzioni della globalizzazione sono solo una tabella / modello aggiuntivo YourModel::Translationcon campi per impostazioni locali e campi tradotti, quindi puoi lavorare direttamente con questi come con qualsiasi altro modulo nidificato.

Aggiungi gem bozzolo al tuo progetto, che gestirà i moduli dinamici (se stai usando webpacker invece della pipeline di risorse - che potrebbe richiedere passaggi aggiuntivi, per aggiungere jquery globale e richiedere js da gem usando l'interpolazione erb, vedi di più qui ).

Nel tuo modello:

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

nel controller:

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

far sapere:

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

parziale per traduzioni come:

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

Grazie Vasfed !! Davvero utile
techquestion il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.