Home
Softono

Translate Enum

Open source MIT Ruby
124
Stars
5
Forks
4
Issues
4
Watchers
3 years
Last Commit

 About Translate Enum

Easily Translate Enums in Rails

Platforms

Web Self-hosted

Languages

Ruby

Links

Need Help Installing Translate Enum?

We provide expert installation service for this software. Our team will install, configure, and secure Translate Enum on your server. plans start at just $30.

Translate Enum

View on GitHub

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"
    }
  ]
}