代码之家  ›  专栏  ›  技术社区  ›  BvuRVKyUVlViVIc7

Rails3中常量哈希的国际化

  •  21
  • BvuRVKyUVlViVIc7  · 技术社区  · 14 年前

    f、 e.我想为我的用户模型的发型设置一个常量哈希:

    # btw: how can I store such hashes in the locales.yml-files?
    # en.yml
    HAIR_COLOURS = { "brown" => 0, "white" => 1, "red" => 2, "dark-brown" => 3...}
    
    # de.yml
    HAIR_COLOURS = { "braun" => 0, "weiss" => 1, "rot" => 2, "dunkel-braun" => 3...}
    
    # i18n.default_locale = :de
    User.find(1).haircolour
    => 0
    User.find(1).haircolour_str
    => "brown"
    
    # i18n.default_locale = :de
    User.find(1).haircolour
    => 0
    User.find(1).haircolour_str
    => "braun"
    
    1 回复  |  直到 14 年前
        1
  •  30
  •   monteirobrena Konrad Janczyk    10 年前

    我建议如下。为头发颜色创建一个字符串列。这通常是一个枚举列( ENUM ),但Rails不支持这一点,除非您对迁移中的一些SQL没有意见。

    在您的模型中,将颜色限制为几个有效值。

    class User < ActiveRecord::Base
      # Store the colours in the database as string identifiers (my preference
      # would be English, lower case, with underscores). Only accept known values.
    
      validates_inclusion_of :hair_colour, :in => %w{brown white red dark_brown}
    end
    

    然后,在 config/locales/en.yml :

    en:
      user:
        hair_colours:
          brown: brown
          white: white
          red: red
          dark_brown: dark brown
    

    而且在 config/locales/de.yml :

    de:
      user:
        hair_colours:
          brown: braun
          white: weiss
          red: rot
          dark_brown: dunkelbraun
    

    <%= t "user.hair_colours.#{@user.hair_colour}" %>
    

    也可以在中编写助手方法 app/helpers/users_helper.rb :

    def translated_hair_colour(user)
      t "user.hair_colours.#{user.hair_colour}"
    end
    

    User 但原则上没有什么能阻止你:

    class User
      # ...
    
      def hair_colour_name
        I18n.t "user.hair_colours.#{hair_colour}"
      end
    end
    

    更新:

    第一购股权 将转换后的值用作源。这就要求译文完整准确。如果未转换所有值,则缺少的值将不会显示在选择框中。

    <%= form_for @user do |user| %>
      <%= user.select :hair_colour, t("user.hair_colours").invert %>
      <%= user.submit %>
    <% end %>
    

    这个 使用模型中的验证值。这是“正确”的方法,但它需要对验证的设置稍作调整。

    class User < ActiveRecord::Base
      HAIR_COLOURS = %w{brown white red dark_brown}
      validates_inclusion_of :hair_colour, :in => HAIR_COLOURS
    end
    

    现在,在你看来:

    <%= form_for @user do |user| %>
      <%= user.select :hair_colour,
        User::HAIR_COLOURS.map { |c| [t("user.hair_colours.#{c}"), c] } %>
      <%= user.submit %>
    <% end %>
    

    当然,可以很容易地将映射提取到助手中。