Rails i18n - 如何翻译模型的枚举

时间:2017-03-30 11:09:04

标签: ruby-on-rails enums localization internationalization ruby-on-rails-5

我有以下型号:

class Person < ActiveRecord::Base
  enum gender: [:female, :male]
  ...
end

然后我将性别选择添加到其表单中,如下所示:

<%= form_for ([@person]) do |f| %>
  ...
  <div class="form-group">
    <%= f.collection_radio_buttons :gender, Person.genders, :first, :first %>
  </div>
  ...
<% end %>

但是我没有将常量显示为字符串,而是将其翻译为葡萄牙语。

我已经尝试将其添加到人们的pt.yml文件中,但是没有用。

pt:
 activerecord:
   attributes:
     female: Feminino
     male: Mascúlino

我知道这个问题与How to use i18n with Rails 4 enums非常相似,但这个问题已经标记为已回答,我正在寻找更好,更简单的解决方案...

感谢您抽出宝贵时间帮助我:)

1 个答案:

答案 0 :(得分:7)

在仔细阅读How to use i18n with Rails 4 enums个答案之后,我找到了这个解决方案:

  1. 根据rails guides - &#34;如果您需要访问给定模型中的嵌套属性,则应将这些属性嵌套在转换文件的模型级别的模型/属性下。 -
  2. yml文件应如下所示:

    pt:
     activerecord:
       attributes:
         person/gender:
           female: Feminino
           male: Mascúlino
    
    1. 我们需要创建一个方法来返回已翻译的enum,因为没有任何方法可以同时翻译整个enum。 Rails只有一种方法来转换给定密钥的值,即People.human_attribute_name(&#34; gender.female&#34;)。
    2. 好的,我们会创建一个新方法,但我们应该把它放在哪里?

      我认为Helpers是放置它的最佳位置,因为我正在更改枚举值以便轻松地将它们附加到form collection,尽管大多数答案都建议使用它在Models

      现在我的person_helper.rb看起来像这样:

      def human_attribute_genders
        Hash[Person.genders.map { |k,v| [k, Person.human_attribute_name("gender.#{k}")] }]
      end
      

      我的view

      <%= f.collection_radio_buttons :gender, human_attribute_genders, :first, :second %>
      

      非常简单,效果很好!

      如果有人有任何改进我的解决方案的建议,我很乐意听取您的意见:)

      例如,我可以将方法提取到application_helper.rb,如下所示:

      def human_attribute_enum(model_name, enum_attr, attr_name)
        Hash[enum_attr.map { |k,v| [k, I18n.t("activerecord.attributes.#{model_name}/#{attr_name}.#{k}")] }]
      end
      

      但它需要在view ...

      中传递大量参数