module SerialTranslator::ClassMethods
Attributes
serial_translator_attributes[R]
Public Instance Methods
serial_translator_for(*attributes)
click to toggle source
# File lib/serial_translator.rb, line 23 def serial_translator_for(*attributes) @serial_translator_attributes = attributes attributes.each do |attr_name| attribute :"#{attr_name}_translations", SerialTranslator::TranslationType.new # Define the normal getter, that respects the # current translation locale define_method attr_name do |locale = current_translation_locale| translations = translations_for(attr_name) result = translations[locale] if translations[locale].present? result ||= translations.values.detect(&:present?) if translation_fallback? result end define_method :"#{attr_name}?" do |locale = current_translation_locale| __send__(attr_name.to_sym, locale).present? end # Define the normal setter, that respects the # current translation locale define_method "#{attr_name}=" do |value| unless I18n.available_locales.include?(current_translation_locale) raise InvalidLocaleError, "current_translation_locale #{current_translation_locale.inspect} is not a member of I18n.available_locales: #{I18n.available_locales.inspect}" end __send__(:"#{attr_name}_translations_will_change!") translations = translations_for(attr_name) scrubbed_value = value&.scrub('') if scrubbed_value.present? translations[current_translation_locale] = scrubbed_value else translations.delete(current_translation_locale) end __send__(:"#{attr_name}_translations=", translations) end # Define getters for each specific available locale I18n.available_locales.each do |available_locale| define_method "#{attr_name}_#{available_locale.to_s.underscore}" do begin old_locale = I18n.locale I18n.locale = available_locale __send__(attr_name) ensure I18n.locale = old_locale end end end # Define setters for each specific available locale I18n.available_locales.each do |available_locale| define_method "#{attr_name}_#{available_locale.to_s.underscore}=" do |value| begin old_locale = I18n.locale I18n.locale = available_locale __send__(:"#{attr_name}=", value) ensure I18n.locale = old_locale end end end end end