Module: BuddyTranslatable::Core

Defined in:
lib/buddy_translatable/core.rb

Instance Method Summary collapse

Instance Method Details

#define_translatable_getters(attr) ⇒ Object



43
44
45
46
47
48
49
50
51
52
53
# File 'lib/buddy_translatable/core.rb', line 43

def define_translatable_getters(attr)
  define_method("#{attr}_data") do
    res = self[attr]
    res = new_record? ? { I18n.locale => '' } : {} unless res.present?
    res.symbolize_keys.with_indifferent_access
  end

  define_method(attr) do |**_args|
    send("#{attr}_data_for", I18n.locale)
  end
end

#define_translatable_key_getters(attr, default_key) ⇒ Object



30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/buddy_translatable/core.rb', line 30

def define_translatable_key_getters(attr, default_key)
  define_method("#{attr}_data_for") do |key|
    value = send("#{attr}_data")
    value[key] ||
      value[default_key].presence ||
      value.values.find(&:present?)
  end

  define_method("#{attr}_for") do |key|
    send("#{attr}_data_for", key)
  end
end

#define_translatable_key_methods(attr, keys) ⇒ Object



55
56
57
58
59
60
61
# File 'lib/buddy_translatable/core.rb', line 55

def define_translatable_key_methods(attr, keys)
  keys.each do |key|
    define_method("#{attr}_#{key}") do
      send("#{attr}_data_for", key)
    end
  end
end

#define_translatable_methods(attr, default_key) ⇒ Object



13
14
15
16
17
# File 'lib/buddy_translatable/core.rb', line 13

def define_translatable_methods(attr, default_key)
  define_translatable_setters(attr)
  define_translatable_key_getters(attr, default_key)
  define_translatable_getters(attr)
end

#define_translatable_setters(attr) ⇒ Object



19
20
21
22
23
24
25
26
27
28
# File 'lib/buddy_translatable/core.rb', line 19

def define_translatable_setters(attr)
  define_method("#{attr}_data=") do |arg|
    data = send("#{attr}_data")
    self[attr] = arg.is_a?(Hash) ? arg : data.merge(I18n.locale => arg)
  end

  define_method("#{attr}=") do |arg|
    send("#{attr}_data=", arg)
  end
end

#translatable(*attrs, default_key: :en, available_keys: nil) ⇒ Object



5
6
7
8
9
10
11
# File 'lib/buddy_translatable/core.rb', line 5

def translatable(*attrs, default_key: :en, available_keys: nil)
  available_keys ||= I18n.available_locales
  attrs.each do |attr|
    define_translatable_methods(attr, default_key)
    define_translatable_key_methods(attr, available_keys)
  end
end