21

Radarlarda uluslararasılaşma ile sabitleri saklamak için en iyi uygulamanın neyden olduğunu söyleyebilir misiniz?Raylarda sabit-karışmalar için uluslararasılaştırma 3

f.e. benim kullanıcı modeli için haircolours için sabit karması sahip olmak istiyorum:

# 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" 

cevap

30

ben aşağıdakileri öneririz. Saç rengi için bir dize sütunu oluşturun. Bu normalde bir numaralandırma sütunu olur (ENUM), ancak geçişlerinizde bazı SQL'le tamam değilseniz, bu Rails tarafından desteklenmez.

Modelinizde, renkleri birkaç geçerli değerle sınırlayın.

Sonra
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 içinde:

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

Ve config/locales/de.yml yılında:

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

Yoksa yazabilirsiniz:

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

Herhangi bir görünümde, yapabileceğiniz 01'de yardımcı metodu:

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

Ben çeviri sunumun bir endişe prensipte olduğuna inanıyoruz Çünkü, User modeline bir yöntem yaratmak olmaz ama prensipte durdurma şey yapmaktan vardır:

class User 
    # ... 

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

Güncelleme:

tra olan bir görünümde seçme kutuları yapma nslated iki şekilde yapılabilir. ilk seçenek, çevrilmiş değerleri kaynak olarak kullanmaktır. Bu, çevirilerin eksiksiz ve doğru olmasını gerektirir. Tüm değerler tercüme edilmezse, eksik değerler seçim kutusunda gösterilmeyecektir.

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

İkinci seçenek modelinizden doğrulama değerlerini kullanmaktır. Bu "doğru" yoldur, ancak doğrulama ayarlarında hafif bir ayarlama gerektirir. senin görüşlerinde

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

Şimdi

,: Elbette

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

, haritalama kolayca yardımcı ekstre edilebilir.

+0

Hmmm sesi güzel ..! Teşekkürler! ama belki daha akıllı bir çözüm var mı? Eğer ödül daha iyi bir şey getirmezse, bunu cevap olarak kontrol edecek ...! – Lichtamberg

+0

Bu çözümle select_box'ları nasıl yapacağınızı söyleyebilir misiniz? Cevap verirseniz cevabınızı kabul edilir olarak işaretleyiniz ... Thx! – Lichtamberg

+0

@Lichtamberg: Sorun değil! Cevap güncellendi. – molf

İlgili konular