【问题标题】:How to display all translation's fields in one form with globalize and rails 4如何使用 globalize 和 rails 4 以一种形式显示所有翻译的字段
【发布时间】:2013-10-31 18:48:30
【问题描述】:

我应该如何为我使用 rails 4 和 https://github.com/globalize/globalize 进行翻译的模型编写表单。我想以一种形式显示所有翻译,如下例所示。我在这里找到了解决方案https://github.com/rilla/batch_translations,但我不知道如何实现。这个“批量翻译”是宝石还是什么?以及如何安装它。

<h1>Editing post</h1> 

   <% form_for(@post) do |f| %>
     <%= f.error_messages %>

     <h2>English (default locale)</h2>
     <p><%= f.text_field :title %></p>
     <p><%= f.text_field :teaser %></p>
     <p><%= f.text_field :body %></p>

     <hr/>

     <h2>Spanish translation</h2>
     <% f.globalize_fields_for :es do |g| %>
       <p><%= g.text_field :title %></p>
       <p><%= g.text_field :teaser %></p>
       <p><%= g.text_field :body %></p>
     <% end %>

     <hr/>

     <h2>French translation</h2>
     <% f.globalize_fields_for :fr do |g| %>
       <p><%= g.text_field :title %></p>
       <p><%= g.text_field :teaser %></p>
       <p><%= g.text_field :body %></p>
     <% end %>

   <% end %>

【问题讨论】:

  • 这是一个扩展 FormBuilder 的模块,你应该可以把它放在应用程序的 lib 目录中,然后在需要的地方使用它。
  • 好的,让我检查一下,如果可行,那么您可以将其添加为答案,我会很乐意接受答案
  • 它显示错误“未定义的方法 `globalize_translations' for”
  • 这告诉我该模块被正确包含,因为它正在调用globalize_fields_for,但它找不到''的globalize_translations 方法。这真的是它所说的吗?此外,您的form_for 中缺少= 应该是&lt;%= form_for(@post) do |f| %&gt;,这可能是导致问题的原因。

标签: ruby-on-rails ruby globalize


【解决方案1】:

批量翻译 gem 已经很老了,我在使用新版本的 Rails 时遇到了困难。我偶然发现了另一个名为 globalize-accessors 的 gem,它支持 Rails 4。很棒的是它可以让您访问 title_enteaser_estitle_fr 等方法。

因此,例如,如果您有一个功能模型,其名称应该使用所有语言,您可以如下:

# => Feature Model (feature.rb)
class Feature < ActiveRecord::Base
  translates :name
  globalize_accessors :attributes => [:name]
end

使用Feature.globalize_attribute_names 方法将给出一个[:name_en, :name_es, :name_fr] 数组,可以在form_for 助手中使用:

//New Feature (new.html.haml)
= form_for @feature do |f|
  - Feature.globalize_attribute_names.each do |lang|
    = f.text_field lang
  = f.submit

【讨论】:

  • @Adam Cooper 这对于单个attribute_name 来说很好,但是当您有多个globalize_attribute_names.each do |lang| 时会变成所有属性和所有语言的流。说,5 乘以 7,它看起来像汤。有没有帮手解决问题?
【解决方案2】:

你考虑过这样的事情吗?

<%= form_for(@post) do |f| %>
     <%= f.error_messages %>

    <% [:en, :es, :fr].each do |lang| %>
      <h2><%= lang %> translation</h2>
      <% f.globalize_fields_for lang do |g| %>
        <% [:title, :teaser, :body].each do |field| %>
          <p><%= g.text_field field %></p>
        <% end %>
      <% end %>
      <hr/>
    <% end %>
<% end %>

您应该能够自动获取这些区域和字段列表。然后你只需要一个区域到语言名称的映射,比如{ en: 'English', es: 'Spanish', fr: 'French'},你就可以输出正确的语言名称而不是区域代码。 (这可能已经在某处可用。)

【讨论】:

  • &lt;p&gt;&lt;%= g.text_field :title %&gt;&lt;/p&gt; 应该是&lt;p&gt;&lt;%= g.text_field field %&gt;&lt;/p&gt;
  • 我完全复制了你的代码,但它仍然显示“未定义的方法 `globalize_translations' for”
  • 这是 i18n 的单独解决方案,还是可以与 globalize 结合使用。我只使用两种语言:en 和 :ar,我可以在设置区域设置时轻松翻译帖子,但我希望两种形式都在同一页面上,所以我在我的视图/帖子/new.html.erb 中使用你的代码。抱歉,如果这是个愚蠢的问题。
  • 嗨 Murtza,我所做的只是从上面获取您的代码并删除重复的部分;我不熟悉全球化。
  • &lt;% [:en, :es, :fr].each do |lang| %&gt; 可以是&lt;% {en:'English',es:'Spanish',fr:'French'}.each do |sym,lang| %&gt;,这样映射是在哈希中完成的,可以与您的h2 一起使用,然后是&lt;% f.globalize_fields_for sym do |g| %&gt;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多