1
1
class CustomMessageSetting < Setting
2
- validate :add_errors , : convertible_to_yaml,
2
+ validate :convertible_to_yaml ,
3
3
:custom_message_languages_are_available , :custom_message_keys_are_available
4
4
5
5
def self . find_or_default
@@ -11,30 +11,23 @@ def enabled?
11
11
end
12
12
13
13
def custom_messages ( lang = nil , check_enabled = false )
14
- messages = self . value [ :custom_messages ] || self . value [ 'custom_messages' ]
15
- if lang . present?
16
- messages = messages [ self . class . find_language ( lang ) ]
17
- end
14
+ return { } if check_enabled && !self . enabled?
18
15
19
- if messages . blank? || ( check_enabled && !self . enabled? )
20
- { }
21
- else
22
- messages
23
- end
16
+ messages = raw_custom_messages
17
+ messages = messages [ lang . to_s ] if lang . present?
18
+ messages || { }
24
19
end
25
20
26
21
def custom_messages_to_flatten_hash ( lang = nil )
27
22
self . class . flatten_hash ( custom_messages ( lang ) )
28
23
end
29
24
30
25
def custom_messages_to_yaml
31
- messages = self . custom_messages
32
- if messages . blank?
33
- ''
34
- elsif messages . is_a? ( Hash )
35
- YAML . dump ( messages )
26
+ messages = custom_messages
27
+ if messages . is_a? ( Hash )
28
+ messages . present? ? YAML . dump ( messages ) : ''
36
29
else
37
- messages
30
+ raw_custom_messages
38
31
end
39
32
end
40
33
@@ -49,27 +42,20 @@ def update_with_custom_messages(custom_messages, lang)
49
42
original_custom_messages
50
43
end
51
44
52
- self . value = { custom_messages : ( messages . present? ? messages : { } ) }
45
+ self . custom_messages = messages
53
46
self . save
54
47
end
55
48
56
49
def update_with_custom_messages_yaml ( yaml )
57
- begin
58
- messages = YAML . load ( yaml )
59
- @errs = { base : l ( :error_invalid_yaml_format ) } if !messages . is_a? ( Hash ) && messages . present?
60
- self . value = { custom_messages : ( messages . present? ? messages : { } ) }
61
- rescue => e
62
- @errs = { base : e . message }
63
- self . value = { custom_messages : yaml }
64
- end
50
+ self . custom_messages = yaml
65
51
self . save
66
52
end
67
53
68
54
def toggle_enabled!
69
- self . value = self . value . deep_merge ( { enabled : ( !self . enabled? ) . to_s } )
55
+ self . value = self . value . merge ( { enabled : ( !self . enabled? ) . to_s } )
70
56
71
57
if result = self . save
72
- self . class . reload_translations !( self . using_languages )
58
+ MessageCustomize :: Locale . reload !( self . using_languages )
73
59
end
74
60
result
75
61
end
@@ -83,21 +69,13 @@ def using_languages
83
69
end
84
70
end
85
71
86
- def self . available_messages ( lang )
87
- messages = I18n . backend . send ( :translations ) [ self . find_language ( lang ) . to_s . to_sym ]
88
- if messages . nil?
89
- CustomMessageSetting . reload_translations! ( [ lang ] )
90
- messages = I18n . backend . send ( :translations ) [ lang . to_s . to_sym ] || { }
91
- end
92
- self . flatten_hash ( messages )
93
- end
94
-
95
72
# { date: { formats: { defaults: '%m/%d/%Y'}}} to {'date.formats.defaults' => '%m/%d/%Y'}
96
73
def self . flatten_hash ( hash = nil )
97
- hash = self . to_hash unless hash
74
+ return hash unless hash . is_a? ( Hash )
75
+
98
76
hash . each_with_object ( { } ) do |( key , value ) , content |
99
77
next self . flatten_hash ( value ) . each do |k , v |
100
- content [ "#{ key } .#{ k } " . intern ] = v
78
+ content [ : "#{ key } .#{ k } "] = v
101
79
end if value . is_a? Hash
102
80
content [ key ] = value
103
81
end
@@ -108,7 +86,6 @@ def self.nested_hash(hash=nil)
108
86
new_hash = { }
109
87
hash . each do |key , value |
110
88
h = value
111
- h = YAML . load ( value ) if value . first == '[' && value . last == ']'
112
89
key . to_s . split ( '.' ) . reverse_each do |k |
113
90
h = { k => h }
114
91
end
@@ -117,62 +94,60 @@ def self.nested_hash(hash=nil)
117
94
new_hash
118
95
end
119
96
120
- def self . reload_translations! ( languages )
121
- paths = I18n . load_path . select { |path | self . find_language ( languages ) . include? ( File . basename ( path , '.*' ) . to_s ) }
122
- I18n . backend . load_translations ( paths )
123
- end
97
+ private
124
98
125
- def self . find_language ( language = nil )
126
- if language . is_a? ( Array )
127
- language . select { |l | I18n . available_locales . include? ( l . to_s . to_sym ) } . map ( &:to_s ) . compact
128
- elsif language . present? && I18n . available_locales . include? ( language . to_s . to_sym )
129
- language . to_s
130
- else
131
- nil
132
- end
99
+ def raw_custom_messages
100
+ self . value [ :custom_messages ] || self . value [ 'custom_messages' ]
133
101
end
134
102
135
- private
103
+ def custom_messages = ( messages )
104
+ messages = YAML . load ( "#{ messages } " ) unless messages . is_a? ( Hash )
105
+ self . value = self . value . merge ( { custom_messages : messages . presence || { } } )
106
+ rescue Psych ::SyntaxError => e
107
+ self . value = self . value . merge ( { custom_messages : messages } )
108
+ end
136
109
137
110
def custom_message_keys_are_available
138
- return false if !value [ :custom_messages ] . is_a? ( Hash ) || errors . present?
111
+ return if errors . present?
112
+
113
+ en_translation_hash = self . class . flatten_hash ( MessageCustomize ::Locale . available_messages ( 'en' ) )
114
+ custom_message_keys =
115
+ custom_messages . values . each_with_object ( [ ] ) { |val , ar |
116
+ ar . concat ( self . class . flatten_hash ( val ) . keys )
117
+ } . uniq
118
+
119
+ unused_keys = custom_message_keys . reject { |k | en_translation_hash . keys . include? ( :"#{ k } " ) }
120
+ unusable_type_of_keys = ( custom_message_keys - unused_keys ) . reject { |k | en_translation_hash [ :"#{ k } " ] . is_a? ( String ) }
139
121
140
- custom_messages_hash = { }
141
- custom_messages . values . compact . each do |val |
142
- custom_messages_hash = self . class . flatten_hash ( custom_messages_hash . merge ( val ) ) if val . is_a? ( Hash )
122
+ if unused_keys . present?
123
+ errors . add ( :base , "#{ l ( :error_unused_keys ) } keys: [#{ unused_keys . join ( ', ' ) } ]" )
143
124
end
144
- available_keys = self . class . flatten_hash ( self . class . available_messages ( 'en' ) ) . keys
145
- unavailable_keys = custom_messages_hash . keys . reject { |k | available_keys . include? ( k . to_sym ) }
146
- if unavailable_keys . present?
147
- self . errors . add ( :base , l ( :error_unavailable_keys ) + " keys: [#{ unavailable_keys . join ( ', ' ) } ]" )
148
- false
125
+ if unusable_type_of_keys . present?
126
+ errors . add ( :base , "#{ l ( :error_unusable_type_of_keys ) } keys: [#{ unusable_type_of_keys . join ( ', ' ) } ]" )
149
127
end
150
128
end
151
129
152
130
def custom_message_languages_are_available
153
- return false if ! value [ :custom_messages ] . is_a? ( Hash ) || errors . present?
131
+ return if errors . present?
154
132
155
133
unavailable_languages =
156
134
custom_messages . keys . compact . reject do |language |
157
- I18n . available_locales . include? ( language . to_sym )
135
+ MessageCustomize :: Locale . available_locales . include? ( language . to_sym )
158
136
end
159
137
if unavailable_languages . present?
160
- self . errors . add ( :base , l ( :error_unavailable_languages ) + " [#{ unavailable_languages . join ( ', ' ) } ]" )
161
- false
138
+ errors . add ( :base , l ( :error_unavailable_languages ) + " [#{ unavailable_languages . join ( ', ' ) } ]" )
162
139
end
163
140
end
164
141
165
142
def convertible_to_yaml
166
- YAML . dump ( self . value [ :custom_messages ] )
167
- end
168
-
169
- def add_errors
170
- if @errs . present?
171
- @errs . each do | key , value |
172
- self . errors . add ( key , value )
143
+ raw_messages = raw_custom_messages
144
+ if raw_messages . present? && ! raw_messages . is_a? ( Hash )
145
+ begin
146
+ YAML . load ( " #{ raw_messages } " )
147
+ errors . add ( :base , l ( :error_invalid_yaml_format ) )
148
+ rescue Psych :: SyntaxError => e
149
+ errors . add ( :base , " #{ l ( :error_invalid_yaml_format ) } #{ e . message } " )
173
150
end
174
- @errs = nil
175
- false
176
151
end
177
152
end
178
- end
153
+ end
0 commit comments