Module: ActiveModel::Translation

Includes:
Naming
Included in:
ActiveRecord::Translation
Defined in:
activemodel/lib/active_model/translation.rb

Overview

Active Model Translation

Provides integration between your object and the Rails internationalization (i18n) framework.

A minimal implementation could be:

class TranslatedPerson
  extend ActiveModel::Translation
end

TranslatedPerson.human_attribute_name('my_attribute')
# => "My attribute"

This also provides the required class methods for hooking into the Rails internationalization API, including being able to define a class-based i18n_scope and lookup_ancestors to find translations in parent classes.

Constant Summary collapse

MISSING_TRANSLATION =

:nodoc:

Object.new

Instance Method Summary collapse

Methods included from Naming

extended, #model_name, param_key, plural, route_key, singular, singular_route_key, uncountable?

Instance Method Details

#human_attribute_name(attribute, options = {}) ⇒ Object

Transforms attribute names into a more human format, such as “First name” instead of “first_name”.

Person.human_attribute_name("first_name") # => "First name"

Specify options with additional translating options.


46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'activemodel/lib/active_model/translation.rb', line 46

def human_attribute_name(attribute, options = {})
  attribute = attribute.to_s

  if attribute.include?(".")
    namespace, _, attribute = attribute.rpartition(".")
    namespace.tr!(".", "/")

    defaults = lookup_ancestors.map do |klass|
      :"#{i18n_scope}.attributes.#{klass.model_name.i18n_key}/#{namespace}.#{attribute}"
    end
    defaults << :"#{i18n_scope}.attributes.#{namespace}.#{attribute}"
  else
    defaults = lookup_ancestors.map do |klass|
      :"#{i18n_scope}.attributes.#{klass.model_name.i18n_key}.#{attribute}"
    end
  end

  defaults << :"attributes.#{attribute}"
  defaults << options[:default] if options[:default]
  defaults << MISSING_TRANSLATION

  translation = I18n.translate(defaults.shift, count: 1, **options, default: defaults)
  translation = attribute.humanize if translation == MISSING_TRANSLATION
  translation
end

#i18n_scopeObject

Returns the i18n_scope for the class. Override if you want custom lookup.


26
27
28
# File 'activemodel/lib/active_model/translation.rb', line 26

def i18n_scope
  :activemodel
end

#lookup_ancestorsObject

When localizing a string, it goes through the lookup returned by this method, which is used in ActiveModel::Name#human, ActiveModel::Errors#full_messages and ActiveModel::Translation#human_attribute_name.


34
35
36
# File 'activemodel/lib/active_model/translation.rb', line 34

def lookup_ancestors
  ancestors.select { |x| x.respond_to?(:model_name) }
end