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