การใช้โลกาภิวัตน์เป็นอัญมณีวิธีการเปลี่ยนตำแหน่งที่ตั้งสำหรับอินพุตเท่านั้นและไม่ใช่ทั้งหน้า?


10

บริบท:สำหรับแอป Ruby on Rails สำหรับการเช่าจักรยานฉันใช้ gem globalize เพื่อจัดการกับการป้อนข้อมูล:descriptionในภาษาต่างๆ

รัฐ Curent:การดำเนิน globalize ทำงานขึ้นอยู่กับสถานที่ของฉันฉันสามารถที่จะเก็บ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มีฟิลด์สำหรับฟิลด์โลแคลและฟิลด์ที่แปลดังนั้นคุณสามารถทำงานกับสิ่งเหล่านี้ได้โดยตรงเช่นเดียวกับแบบฟอร์มซ้อนอื่น ๆ

เพิ่มgem cocoonให้กับโครงการของคุณที่จะจัดการรูปแบบไดนามิก (ถ้าคุณใช้ webpacker แทนที่จะเป็นไปป์ไลน์สินทรัพย์ - ซึ่งอาจต้องใช้ขั้นตอนเพิ่มเติมเพื่อเพิ่ม jquery ทั่วโลกและต้องการ js จาก gem โดยใช้การแก้ไข erb ดูเพิ่มเติมที่นี่ )

ในรูปแบบของคุณ:

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 !! มีประโยชน์จริง ๆ
คำถามเทคโนโลยี
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.