[ruby-on-rails] gem globalize를 사용하여 전체 페이지가 아닌 입력 전용 로케일을 전환하는 방법은 무엇입니까?

컨텍스트 : 자전거 대여용 Ruby on Rails 앱의 경우 gem을 사용하여 :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>

이니셜 라이저 /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



답변

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를 추가하고 erb 보간을 사용하여 gem의 j를 필요로하는 경우 여기 참조 ).

모델에서 :

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>


답변