मणि का उपयोग करते हुए वैश्वीकरण, केवल इनपुट के लिए स्थानों को कैसे स्विच करें और पूरे पृष्ठ को नहीं?


10

संदर्भ: बाइक किराए पर लेने के लिए पटरियों पर एक रूबी ऐप के लिए, मैं :descriptionविभिन्न भाषाओं में इनपुट से निपटने के लिए रत्न वैश्वीकरण का उपयोग कर रहा हूं ।

क्यूरेंट स्टेट: वैश्वीकरण कार्यान्वयन ने काम किया, मेरे लोकेल के आधार पर मैं descriptionएक विशिष्ट भाषा में स्टोर करने में सक्षम हूं । :descriptionसंपूर्ण वेबपृष्ठ के स्थान के आधार पर इनपुट से निपटा जाता है।

इसका मतलब यह है कि इस पृष्ठ पर सब कुछ :descriptionसही भाषा में संग्रहीत करने के लिए भाषा में बदलना है ।

वैकल्पिक रूप से, मैं सभी उपलब्ध स्थानों को दिखाने और descriptionउनमें से प्रत्येक के लिए दिखाने में सक्षम हूं। (नीचे टिप्पणी कोड भी देखें)।

प्रश्न: मैं एक ऐसा तरीका खोज रहा हूँ जिससे उपयोगकर्ता :descriptionकेवल एक भाषा का चयन कर सके और फिर :descriptionपूरे वेबपेज की भाषा को बदले बिना सही भाषा में सहेज सके ।

कोड

प्रपत्र

<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

जवाबों:


3

आप Globalize.with_localeअस्थायी रूप से लोकेल सेट करने के लिए उपयोग कर सकते हैं , यह विचारों के लिए भी काम करता है:

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

लेकिन आपके मामले के लिए अधिक उपयोगकर्ता-अनुकूल तरीका फ़ॉर्म को गतिशील बनाना होगा, ताकि उपयोगकर्ता अपनी पसंद की कई भाषाओं के लिए अनुवाद जोड़ सके।

वैश्वीकरण के अनुवाद YourModel::Translationस्थानीय और अनुवादित क्षेत्रों के लिए खेतों के साथ सिर्फ एक अतिरिक्त तालिका / मॉडल हैं, इसलिए आप किसी अन्य शून्य रूपों के साथ सीधे इन पर काम कर सकते हैं।

मणि कोकून को अपनी परियोजना में जोड़ें , जो गतिशील रूपों को संभालेगा (यदि आप एसेट पाइप लाइन के बजाय वेबपैकर का उपयोग कर रहे हैं - जिसके लिए अतिरिक्त कदमों की आवश्यकता हो सकती है, वैश्विक jquery जोड़ने के लिए और erb प्रक्षेप का उपयोग करके मणि से js की आवश्यकता होती है, यहाँ और देखें )।

आपके मॉडल में:

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

नियंत्रक में:

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

सूचित करना:

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

अनुवाद के लिए आंशिक:

<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 !! वास्तव में उपयोगी
techquestion
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.