lib/has_translations.rb in has_translations-0.3.5 vs lib/has_translations.rb in has_translations-1.0.0

- old
+ new

@@ -1,7 +1,6 @@ -class ActiveRecord::Base - # Provides ability to add the translations for the model using delegate pattern. +# Provides ability to add the translations for the model using delegate pattern. # Uses has_many association to the ModelNameTranslation. # # For example you have model Article with attributes title and text. # You want that attributes title and text to be translated. # For this reason you need to generate new model ArticleTranslation. @@ -25,13 +24,10 @@ # * locale presence validation to the ArticleTranslation model. # # Notice: if you want to have validates_presence_of :article, you should use :inverse_of. # Support this by yourself. Better is always to use artile.translations.build() method. # - # For more information please read API. Feel free to write me an email to: - # dmitry.polushkin@gmail.com. - # # === # # You also can pass attributes and options to the translations class method: # # translations :title, :text, :fallback => true, :writer => true, :nil => nil @@ -75,103 +71,12 @@ # # <tt>translation(locale)</tt> method finds translation with specified locale. # # <tt>all_translations</tt> method that returns all possible translations in # ordered hash (useful when creating forms with nested attributes). - def self.translations(*attrs) - new_options = attrs.extract_options! - options = { - :fallback => false, - :reader => true, - :writer => false, - :nil => '', - :autosave => new_options[:writer] - }.merge(new_options) - options.assert_valid_keys([:fallback, :reader, :writer, :nil, :autosave]) +require "has_translations/model_additions" +require "has_translations/railtie" if defined? Rails - translation_class_name = "#{self.model_name}Translation" - translation_class = translation_class_name.constantize - belongs_to = self.model_name.demodulize.underscore.to_sym +module HasTranslations - if ActiveRecord::VERSION::MAJOR < 3 - write_inheritable_attribute :has_translations_options, options - class_inheritable_reader :has_translations_options - - scope_method = :named_scope - else - class_attribute :has_translations_options - self.has_translations_options = options - - scope_method = :scope - end - - # associations, validations and scope definitions - has_many :translations, :class_name => translation_class_name, :dependent => :destroy, :autosave => options[:autosave] - translation_class.belongs_to belongs_to - translation_class.validates_presence_of :locale - translation_class.validates_uniqueness_of :locale, :scope => :"#{belongs_to}_id" - send scope_method, :translated, lambda { |locale| {:conditions => ["#{translation_class.table_name}.locale = ?", locale.to_s], :joins => :translations} } - - public - - def find_or_create_translation(locale) - locale = locale.to_s - (find_translation(locale) || self.translations.new).tap do |t| - t.locale = locale - end - end - - def find_or_build_translation(locale) - locale = locale.to_s - (find_translation(locale) || self.translations.build).tap do |t| - t.locale = locale - end - end - - def translation(locale, fallback=has_translations_options[:fallback]) - locale = locale.to_s - find_translation(locale) || (fallback && !translations.blank? ? translations.detect { |t| t.locale == I18n.default_locale.to_s } || translations.first : nil) - end - - def all_translations - t = I18n.available_locales.map do |locale| - [locale, find_or_create_translation(locale)] - end - ActiveSupport::OrderedHash[t] - end - - def has_translation?(locale) - find_translation(locale).present? - end - - if options[:reader] - attrs.each do |name| - send :define_method, name do - translation = self.translation(I18n.locale) - translation.try(name) || has_translations_options[:nil] - end - end - end - - if options[:writer] - attrs.each do |name| - send :define_method, "#{name}_before_type_cast" do - translation = self.translation(I18n.locale, false) - translation.try(name) - end - - send :define_method, "#{name}=" do |value| - translation = find_or_build_translation(I18n.locale) - translation.send(:"#{name}=", value) - end - end - end - - private - - def find_translation(locale) - locale = locale.to_s - translations.detect { |t| t.locale == locale } - end - end end