aboutsummaryrefslogtreecommitdiffstats
path: root/activemodel/lib/active_model/translation.rb
diff options
context:
space:
mode:
authorJosé Valim <jose.valim@gmail.com>2009-10-20 22:20:01 -0200
committerCarl Lerche <carllerche@mac.com>2009-10-20 17:52:32 -0700
commite714b499cc1f7ebc84f8d0e96607b79e60f2828d (patch)
treea9725eb2101a56db366603ca849a3ed260b710d6 /activemodel/lib/active_model/translation.rb
parent4f6d6f7031a88b647814fc0154e6b69b636dc912 (diff)
downloadrails-e714b499cc1f7ebc84f8d0e96607b79e60f2828d.tar.gz
rails-e714b499cc1f7ebc84f8d0e96607b79e60f2828d.tar.bz2
rails-e714b499cc1f7ebc84f8d0e96607b79e60f2828d.zip
Move validator, human_name and human_attribute_name to ActiveModel, remove deprecated error messages and add i18n_scope and lookup_ancestors.
Signed-off-by: Carl Lerche <carllerche@mac.com>
Diffstat (limited to 'activemodel/lib/active_model/translation.rb')
-rw-r--r--activemodel/lib/active_model/translation.rb59
1 files changed, 59 insertions, 0 deletions
diff --git a/activemodel/lib/active_model/translation.rb b/activemodel/lib/active_model/translation.rb
new file mode 100644
index 0000000000..dc11198c66
--- /dev/null
+++ b/activemodel/lib/active_model/translation.rb
@@ -0,0 +1,59 @@
+module ActiveModel
+ module Translation
+ include ActiveModel::Naming
+
+ # Returns the i18n_scope for the class. Overwrite if you want custom lookup.
+ def i18n_scope
+ :activemodel
+ end
+
+ # When localizing a string, goes through the lookup returned by this method.
+ # Used in ActiveModel::Name#human, ActiveModel::Errors#full_messages and
+ # ActiveModel::Translation#human_attribute_name.
+ def lookup_ancestors
+ self.ancestors.select { |x| x.respond_to?(:model_name) }
+ end
+
+ # Transforms attributes names into a more human format, such as "First name" instead of "first_name".
+ #
+ # Example:
+ #
+ # Person.human_attribute_name("first_name") # => "First name"
+ #
+ # Specify +options+ with additional translating options.
+ def human_attribute_name(attribute, options = {})
+ defaults = lookup_ancestors.map do |klass|
+ :"#{klass.model_name.underscore}.#{attribute}"
+ end
+
+ defaults << options.delete(:default) if options[:default]
+ defaults << attribute.to_s.humanize
+
+ options.reverse_merge! :scope => [self.i18n_scope, :attributes], :count => 1, :default => defaults
+ I18n.translate(defaults.shift, options)
+ end
+
+ # Model.human_name is deprecated. Use Model.model_name.human instead.
+ def human_name(*args)
+ ActiveSupport::Deprecation.warn("human_name has been deprecated, please use model_name.human instead", caller[0,1])
+ model_name.human(*args)
+ end
+ end
+
+ class Name < String
+ # Transform the model name into a more humane format, using I18n. By default,
+ # it will underscore then humanize the class name (BlogPost.human_name #=> "Blog post").
+ # Specify +options+ with additional translating options.
+ def human(options={})
+ defaults = @klass.lookup_ancestors.map do |klass|
+ klass.model_name.underscore.to_sym
+ end
+
+ defaults << options.delete(:default) if options[:default]
+ defaults << @human
+
+ options.reverse_merge! :scope => [@klass.i18n_scope, :models], :count => 1, :default => defaults
+ I18n.translate(defaults.shift, options)
+ end
+ end
+end