Usando la gema globalizar, ¿cómo cambiar las configuraciones regionales solo para entrada y no para toda la página?

10

Contexto: para una aplicación de Ruby on Rails para alquiler de bicicletas, estoy usando la gema globalize para manejar la entrada :descriptionen diferentes idiomas.

Estado actual: la implementación de globalización funcionó, dependiendo de mi ubicación que pueda almacenar descriptionen un idioma específico. La entrada para :descriptionse trata sobre la base de la configuración regional de una página web completa.

Esto significa que todo en esta página tiene que cambiar de idioma para poder almacenarlo :descriptionen el idioma correcto.

Alternativamente, también puedo mostrar todas las configuraciones regionales disponibles y mostrarlas descriptionpara cada una de ellas. (Ver también el código comentado a continuación).

Pregunta: Estoy buscando una manera de permitir que el usuario seleccione un idioma :descriptionsolo y luego lo guarde :descriptionen el idioma correcto sin cambiar el idioma de toda la página web.

Código

formar

<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 / 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
Techquestion
fuente

Respuestas:

3

Puede usarlo Globalize.with_localepara establecer temporalmente la configuración regional, esto también funciona para las vistas:

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

Pero para su caso, una forma más fácil de usar sería hacer que el formulario sea dinámico, de modo que el usuario pueda agregar traducción para varios idiomas de su agrado.

Las traducciones globalizadas son solo una tabla / modelo adicional YourModel::Translationcon campos para la configuración regional y los campos traducidos, por lo que puede trabajar directamente con estos como con cualquier otra forma anidada.

Agregue gem cocoon a su proyecto, que manejará formas dinámicas (si está usando webpacker en lugar de una canalización de activos, eso puede requerir pasos adicionales, para agregar jquery global y requerir js de gem usando interpolación erb, vea más aquí ).

En su modelo:

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

en el controlador:

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

en forma:

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

parcial para traducciones como:

<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
fuente
Gracias vasfed !! Realmente útil
techquestion