Sử dụng đá quý toàn cầu hóa, làm thế nào để chuyển đổi địa điểm chỉ cho đầu vào chứ không phải toàn bộ trang?


10

Bối cảnh: Đối với ứng dụng Ruby on Rails cho thuê xe đạp, tôi đang sử dụng đá quý toàn cầu hóa để xử lý đầu vào :descriptionbằng các ngôn ngữ khác nhau.

Trạng thái tò mò: Việc triển khai toàn cầu hóa hoạt động, tùy thuộc vào địa phương của tôi, tôi có thể lưu trữ descriptionbằng một ngôn ngữ cụ thể. Đầu vào cho :descriptionđược xử lý trên cơ sở ngôn ngữ của toàn bộ trang web.

Điều này có nghĩa là mọi thứ trên trang này phải thay đổi ngôn ngữ để lưu trữ :descriptionđúng ngôn ngữ.

Ngoài ra, tôi cũng có thể hiển thị tất cả các địa điểm có sẵn và hiển thị descriptioncho từng địa điểm đó. (Xem thêm mã nhận xét bên dưới).

Câu hỏi: Tôi đang tìm cách để người dùng chỉ chọn một ngôn ngữ :descriptionvà sau đó lưu :descriptionbằng ngôn ngữ chính xác mà không thay đổi ngôn ngữ của toàn bộ trang web.

hình thức

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

người khởi tạo / toàn cầu hóa.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

Câu trả lời:


3

Bạn có thể sử dụng Globalize.with_localeđể tạm thời đặt ngôn ngữ, điều này cũng hoạt động để xem:

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

Nhưng đối với trường hợp của bạn, cách thân thiện hơn với người dùng sẽ là làm cho biểu mẫu động, để người dùng có thể thêm bản dịch cho một số ngôn ngữ theo ý thích của họ.

Toàn cầu hóa các bản dịch chỉ là một bảng / mô hình bổ sung YourModel::Translationvới các trường cho miền địa phương và các trường được dịch, vì vậy bạn có thể làm việc trực tiếp với các bản dịch này như với bất kỳ biểu mẫu lồng nhau nào khác.

Thêm đá kén vào dự án của bạn, sẽ xử lý các hình thức động (nếu bạn đang sử dụng webpacker thay vì đường dẫn tài sản - có thể yêu cầu các bước bổ sung, để thêm jquery toàn cầu và yêu cầu js từ gem sử dụng phép nội suy erb, xem thêm tại đây ).

Trong mô hình của bạn:

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

trong bộ điều khiển:

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

thông báo:

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

một phần cho các bản dịch như:

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

Cảm ơn Vasfed !! Thực sự hữu ích
techquestion
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.