gpt4 book ai didi

ruby-on-rails - 使用 gem globalize,如何只为输入而不是整个页面切换语言环境?

转载 作者:行者123 更新时间:2023-12-03 15:47:27 25 4
gpt4 key购买 nike

上下文:对于用于自行车租赁的 Ruby on Rails 应用程序,我使用 gem globalize 来处理输入 :description用不同的语言。

当前状态: 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>

初始化程序/全局化.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临时设置语言环境,这也适用于 View :

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

但是对于您的情况,更用户友好的方法是使表单动态化,以便用户可以添加他们喜欢的几种语言的翻译。

全局化翻译只是一个额外的表/模型 YourModel::Translation带有用于区域设置和翻译字段的字段,因此您可以像处理任何其他嵌套表单一样直接使用这些字段。

添加 gem cocoon到您的项目,它将处理动态表单(如果您使用 webpacker 而不是 Assets 管道 - 这可能需要额外的步骤,添加全局 jquery 并使用 erb 插值从 gem 中要求 js, see more here )。

在您的模型中:

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

在 Controller 中:

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>

关于ruby-on-rails - 使用 gem globalize,如何只为输入而不是整个页面切换语言环境?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60225194/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com