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
Please log in before posting. Registration is free and takes only a minute.
Existing account
(Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
Log in with Google account | Log in with Yahoo account
No account? Register here.