Rails 4 Active Record Enums are great, but what is the right pattern for translating with i18n?
Starting from Rails 5, all models will inherit from ApplicationRecord
.
class User < ApplicationRecord enum status: [:active, :pending, :archived] end
I use this superclass to implement a generic solution for translating enums:
class ApplicationRecord < ActiveRecord::Base self.abstract_class = true def self.human_enum_name(enum_name, enum_value) I18n.t("activerecord.attributes.#{model_name.i18n_key}.#{enum_name.to_s.pluralize}.#{enum_value}") end end
Then I add the translations in my .yml
file:
en: activerecord: attributes: user: statuses: active: "Active" pending: "Pending" archived: "Archived"
Finally, to get the translation I use:
User.human_enum_name(:status, :pending) => "Pending"
I didn't find any specific pattern either, so I simply added:
en: user_status: active: Active pending: Pending... archived: Archived
to an arbitrary .yml file. Then in my views:
I18n.t :"user_status.#{user.status}"
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With