21

你能告訴我什麼是用rails3國際化存儲常量的最佳做法嗎?國際化的常量散列在軌道3

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" 

回答

30

我會建議以下幾點。爲頭髮顏色創建一個字符串列。這通常是枚舉列(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}" %> 

或者你可以寫一個01中的輔助方法:

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 

更新:

使選擇框在那些TRA視圖nslated可以通過兩種方式完成。 第一個選項將使用翻譯的值作爲源。這要求翻譯完整準確。如果並非所有值都被轉換,則缺失值將不會顯示在選擇框中。

<%= 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 %> 

當然,映射可以很容易地提取到一個幫手。

+0

嗯聽起來不錯..!謝謝!但是有沒有更聰明的解決方案?如果賞金沒有帶來更好的東西,將檢查這個答案...! – Lichtamberg 2010-09-04 21:57:42

+0

您能告訴我如何使用此解決方案製作select_boxes嗎?如果你回答......請將你的答案標記爲接受。 – Lichtamberg 2010-09-07 20:46:42

+0

@Lichtamberg:沒問題!答案已更新。 – molf 2010-09-08 06:56:30