-
Notifications
You must be signed in to change notification settings - Fork 0
/
locale.rb
80 lines (71 loc) · 2.19 KB
/
locale.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
require 'ostruct'
module Mayl
# Public: A Locale is the representation of a YAML translation file, but
# traversable as an OpenStruct, and with some convenience methods to set and
# get keys.
#
# Example
#
# locale = Locale.new(:ca, {'ca' => {'activerecord' => ... }})
# locale.activerecord.models.post
# # => 'Article'
# locale.set('activerecord.models.comment', 'Comentari')
# locale.get('activerecord.models.comment')
# # => 'Comentari
#
class Locale
attr_reader :name
# Anonymous function used to generate a deep-openstruct from a deep Hash
# object. Meant to use with #inject on a Hash.
Iterator = lambda do |acc, elem|
attr = Array(elem).first
element = elem.last
# Deep-generate an OpenStruct if it's not the leaf of the tree
element = element.inject(OpenStruct.new, &Iterator) unless element.is_a?(String)
acc.send(:"#{attr}=", element)
acc
end
# Public: Initializes a new Locale.
#
# name - the Symbol ISO for the locale (:ca, :es)
# hash - the Hash outputted by the YAML parser
def initialize(name, hash)
@name = name
@data = hash[name.to_s].inject(OpenStruct.new, &Iterator)
end
# Public: Sets a key to a given value.
#
# key - the String key to be set, fully qualified
# value - the new value to give to that key
#
# Returns nothing.
def set(key, value)
ary = key.split('.')
qualifier = ary[0..-2]
name = ary.last
path = qualifier.inject(@data) do |acc, name|
acc.send(:"#{name}=", OpenStruct.new) unless acc.respond_to?(name)
acc.send(name)
end
path.send("#{name}=", value)
end
# Public: Gets the value for a given key.
#
# key - the String key to be set, fully qualified
#
# Returns the String value.
def get(key)
key.split('.').inject(@data) do |acc, name|
acc.send(name)
end
end
# Public: Convenience DSL to traverse the OpenStruct more comfortably.
#
# m - the property to get
#
# Returns the String value of that property.
def method_missing(m, *args, &block)
@data.send(m) || super
end
end
end