Just right now I’m solving definitely this kind of task.
I choose an approach where each content having to be translated, is String or Text.
Then I created two STI+polymorphic tables (models): MetaText and MetaString. Each of them has columns “value” and “locale” to specify language.
class MetaString < ActiveRecord::Base
attr_accessible :value, :locale
belongs_to :resource, :polymorphic => true
end
class MetaText < ActiveRecord::Base
attr_accessible :value, :locale
belongs_to :resource, :polymorphic => true
end
For each model I’ve created STI models for whatever string/text content to be translated. STI is needed to specify model behavior, such as validation or etc…
Example:
class ArticleTitle < MetaString
validates_lenght_of :value, :maximum => 200
end
class ArticleContent < MetaText
validates_lenght_of :value, :minimum => 200
end
class Article < ActiveRecord::Base
has_many :titles, :class_name => “ArticleTitle”, :as => :resource, :dependent => :delete_all
has_many :contents, :class_name => “ArticleTitle”, :as => :resource, :dependent => :delete_all
def title(locale=nil)
items = titles.to_a
items.find {|i| i.locale == locale || I18n.locale} || items.first
end
def content(locale=nil)
items = contents.to_a
items.find {|i| i.locale == locale || I18n.locale} || items.first
end
end
I18n.locale - application-level locale accessor.
I choose an approach (subdomain = locale):
http://railscasts.com/episodes/221-subdomains-in-rails-3