Rails 4 Active Record Enum 은 훌륭하지만 i18n으로 번역하는 데 적합한 패턴은 무엇입니까?
답변
특정 패턴도 찾지 못했기 때문에 간단히 추가했습니다.
en:
user_status:
active: Active
pending: Pending...
archived: Archived
임의의 .yml 파일에. 그런 다음 내 견해 :
I18n.t :"user_status.#{user.status}"
답변
Rails 5부터 모든 모델은 ApplicationRecord
.
class User < ApplicationRecord
enum status: [:active, :pending, :archived]
end
이 수퍼 클래스를 사용하여 열거 형 번역을위한 일반 솔루션을 구현합니다.
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
그런 다음 .yml
파일에 번역을 추가 합니다.
en:
activerecord:
attributes:
user:
statuses:
active: "Active"
pending: "Pending"
archived: "Archived"
마지막으로 번역을 얻으려면 다음을 사용합니다.
User.human_enum_name(:status, :pending)
=> "Pending"
답변
다음은보기입니다.
select_tag :gender, options_for_select(Profile.gender_attributes_for_select)
여기 모델이 있습니다 (실제로이 코드를 도우미 또는 데코레이터로 이동할 수 있습니다)
class Profile < ActiveRecord::Base
enum gender: {male: 1, female: 2, trans: 3}
# @return [Array<Array>]
def self.gender_attributes_for_select
genders.map do |gender, _|
[I18n.t("activerecord.attributes.#{model_name.i18n_key}.genders.#{gender}"), gender]
end
end
end
다음은 로케일 파일입니다.
en:
activerecord:
attributes:
profile:
genders:
male: Male
female: Female
trans: Trans
답변
국제화를 다른 속성과 유사하게 유지하기 위해 여기에서 볼 수 있듯이 중첩 속성 방식을 따랐 습니다 .
수업이있는 경우 User
:
class User < ActiveRecord::Base
enum role: [ :teacher, :coordinator ]
end
그리고 다음 yml
과 같이 :
pt-BR:
activerecord:
attributes:
user/role: # You need to nest the values under model_name/attribute_name
coordinator: Coordenador
teacher: Professor
당신이 사용할 수있는:
User.human_attribute_name("role.#{@user.role}")
답변
모델:
enum stage: { starting: 1, course: 2, ending: 3 }
def self.i18n_stages(hash = {})
stages.keys.each { |key| hash[I18n.t("checkpoint_stages.#{key}")] = key }
hash
end
장소:
checkpoint_stages:
starting: Saída
course: Percurso
ending: Chegada
그리고보기 (.slim)에서 :
= f.input_field :stage, collection: Checkpoint.i18n_stages, as: :radio_buttons
답변
user3647358의 답변을 자세히 설명하면 속성 이름을 번역 할 때 익숙한 것과 매우 유사하게 수행 할 수 있습니다.
로케일 파일 :
en:
activerecord:
attributes:
profile:
genders:
male: Male
female: Female
trans: Trans
I18n # t를 호출하여 번역 :
profile = Profile.first
I18n.t(profile.gender, scope: [:activerecord, :attributes, :profile, :genders])
답변
이러한 목적으로 TranslateEnum gem을 사용해보십시오.
class Post < ActiveRecord::Base
enum status: { published: 0, archive: 1 }
translate_enum :status
end
Post.translated_status(:published)
Post.translated_statuses
@post = Post.new(status: :published)
@post.translated_status