0.05
Low commit activity in last 3 years
No release in over a year
Simple, zero-dependant enum translation gem for Rails
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Development

Runtime

 Project Readme

CI Code Climate gem version

TranslateEnum

Simple, zero-dependant enum translation gem for Rails

Installation

gem install translate_enum

Usage

Here is a regular use case. ActiveRecord model:

class Post < ActiveRecord::Base
  include TranslateEnum
  
  enum status: { published: 0, archive: 1 }
  translate_enum :status
end

Localization file

en:
  activerecord:
    attributes:
      post:
        status_list:
          published: Was published
          archive: Was archived

Or if you wish your locales to be available across all models

en:
  attributes:
    status_list:
      published: Was published
      archive: Was archived
Post.translated_status(:published) #=> "Was published"
Post.translated_statuses => [["Was published", :published, 0], ["Was archived", :archive, 1]]

@post = Post.new(status: :published)
@post.translated_status #=> "Was published"

# Each `translated` method supports 
# I18n.translate attributes:

Post.translated_status(:published, raise: true, throw: true, locale: :en, count: 10)

Use in a Form

= form_for @post do |f|
  = f.select :status, options_for_select(f.object.class.translated_statuses.map { |translation, k, _v| [translation, k] })

Extending ActiveRecord

Be default you should extend each ActiveRecord model manually by including TranslateEnum module in it. You can extend ActiveRecord by requiring translate_enum/active_record in initializer or inside yout Gemfile:

Gemfile:

gem 'translate_enum', require: 'translate_enum/active_record'

Initializer:

# config/initializers/translate_enum.rb
require 'translate_enum/active_record'

Advanced options

class User < ActiveRecord::Base
  enum gender: [:male, :female]
  
  translate_enum :gender do |tr|
    tr.i18n_scope = 'activerecord.attributes'
    tr.i18n_key = 'gender_list'
    tr.enum_klass_method_name = 'genders'
    tr.enum_instance_method_name = 'gender'
    tr.method_name_singular = 'translated_gender'
    tr.method_name_plural = 'translated_genders'
  end
  
  # Or even provide your own logic
  def self.translated_gender(key)
    I18n.t(key, scope: 'global.gender_list')
  end
end

How To?

How to use pluralization

en:
  activerecord:
    attributes:
      person:
        gender_list:
          male: 
            zero: No males
            one: One male
            other: %{count} males
            
Person.translated_gender(:make, count: 0) #=> "No males"
Person.translated_genders => [["One male", :male, 0]] # and others
Person.translated_genders(count: 0) => [["No males", :male, 0]] # and others

@person = Person.new(gender: :male)
@person.translated_gender #=> "One male"
@person.translated_gender(count: 10) #=> "10 Males"

How use translate enum in serializer

Example for Grape:

class Feedback < ApplicationRecord
  include TranslateEnum
  
  enum topic: {
    question: 'question', issue: 'issue', complaint: 'complaint', offer: 'offer',
    investment: 'investment'
  }

  translate_enum :topic
end
class FeedbacksApi < Grape::API
  resource :feedbacks do
    get 'enums' do
      present Feedback.method(:translated_topics), with: TranslateEnumSerializer
    end
  end
end
class TranslateEnumSerializer < Grape::Entity
  expose :enum, as: ->(method) { method.name[/translated_(.*)/, 1] } do |method|
    method.call.map do |translation, key, _value|
      { value: key, translation: translation }
    end
  end
end
curl http://localhost:3000/feedbacks/enums
{
  "topics": [
    {
      "value": "question",
      "translation": "Vopros"
    },
    {
      "value": "issue",
      "translation": "Problema"
    },
    {
      "value": "complaint",
      "translation": "Zhaloba"
    },
    {
      "value": "offer",
      "translation": "Predlozhenie"
    },
    {
      "value": "investment",
      "translation": "Invisticii"
    }
  ]
}