看看它的来源,你就会明白:
# File activemodel/lib/active_model/translation.rb, line 45
def human_attribute_name(attribute, options = {})
defaults = []
parts = attribute.to_s.split(".", 2)
attribute = parts.pop
namespace = parts.pop
if namespace
lookup_ancestors.each do |klass|
defaults << :"#{self.i18n_scope}.attributes.#{klass.model_name.i18n_key}/#{namespace}.#{attribute}"
end
defaults << :"#{self.i18n_scope}.attributes.#{namespace}.#{attribute}"
else
lookup_ancestors.each do |klass|
defaults << :"#{self.i18n_scope}.attributes.#{klass.model_name.i18n_key}.#{attribute}"
end
end
defaults << :"attributes.#{attribute}"
defaults << options.delete(:default) if options[:default]
defaults << attribute.humanize
options.reverse_merge! :count => 1, :default => defaults
I18n.translate(defaults.shift, options)
end
human_attribute_name
在本地化属性名称方面做得很好。即使您正在构建仅使用英语的应用程序——谁知道呢,也许您的收件箱已经收到了一封来自您的客户的电子邮件,关于他扩展业务的计划,并且这种扩展将包括人们从右到左书写的国家。
这个怎么运作
假设您有具有属性的Product
模型。title
这样调用human_attribute_name
:
Product.human_attribute_name 'title'
I18n.t
将使用以下参数调用(参见上面代码段中的最后一行):
I18.t 'activerecord.attributes.product.title', {
:count=>1,
:default=>[:"attributes.title", "Title"]
}
因此,您可以提供特定于某些模型和特定于某些属性名称的翻译。除非您提供任何这些翻译,否则您将获得通过humanize
方法创建的属性的英文版本。