En utilisant le gem globaliser, comment changer les paramètres régionaux pour la saisie uniquement et non la page entière?

10

Contexte: Pour une application Ruby on Rails pour la location de vélos, j'utilise le joyau globaliser pour gérer les entrées :descriptiondans différentes langues.

État actuel: L'implémentation de la mondialisation a fonctionné, en fonction de mes paramètres régionaux, je suis en mesure de les stocker descriptiondans une langue spécifique. L'entrée pour :descriptionest traitée sur la base des paramètres régionaux d'une page Web entière.

Cela signifie que tout sur cette page doit changer de langue afin de stocker :descriptiondans la langue correcte.

Alternativement, je suis également en mesure d'afficher tous les paramètres régionaux disponibles et d'afficher descriptionpour chacun d'eux. (Voir aussi le code commenté ci-dessous).

Question: Je recherche un moyen de laisser l'utilisateur sélectionner une langue :descriptionuniquement, puis enregistrer :descriptiondans la langue correcte sans changer la langue de la page Web entière.

Code

forme

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

initialiseurs / mondialisation.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
la source

Réponses:

3

Vous pouvez utiliser Globalize.with_localepour définir temporairement les paramètres régionaux, cela fonctionne également pour les vues:

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

Mais pour votre cas, une manière plus conviviale serait de rendre le formulaire dynamique, afin que l'utilisateur puisse ajouter une traduction pour plusieurs langues de son choix.

Les traductions globalisées ne sont qu'un tableau / modèle supplémentaire YourModel::Translationavec des champs pour les paramètres régionaux et des champs traduits, vous pouvez donc travailler directement avec ceux-ci comme avec tout autre formulaire imbriqué.

Ajoutez gem cocoon à votre projet, qui gérera les formulaires dynamiques (si vous utilisez webpacker au lieu du pipeline d'actifs - cela peut nécessiter des étapes supplémentaires, pour ajouter jquery global et exiger js de gem en utilisant l'interpolation erb, voir plus ici ).

Dans votre modèle:

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

dans le contrôleur:

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

informer:

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

partiel pour les traductions comme:

<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
la source
Merci Vasfed !! Vraiment utile
techquestion