hi, I've been asked to design a multiple language application for an architectural firm and I need advice with which is the best approach to it with Rails. Basically all the tables have some common fields that doesn't need to be translated and some others that need translation. At first it seems the application will be quite changing since not all the targets are clearly defined so, ease of change will make a good point. best regards, indi
on 2011-09-17 09:12

on 2012-11-05 15:22

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): - en.mysite.com - locale is 'en' - ru.mysite.com - locale is 'ru' etc http://railscasts.com/episodes/221-subdomains-in-rails-3