babylonia 0.0.3 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.rdoc +14 -0
- data/lib/babylonia/class_methods.rb +87 -62
- data/lib/babylonia/version.rb +1 -1
- data/spec/babylonia/class_methods_spec.rb +172 -38
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 471b84c7ea7c5f3e6a22c69a64b74438b159480c
|
4
|
+
data.tar.gz: 3895c1969ff6a922574c66123a819211e849f60f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 960ef518e49a6a76ab9fd5ac1a1016123b9b3a10cba86c2fb646f7ad2cdd03d52b55cdd1ad474c5b36c2188efeead630c238bf21ca42135cd1bc73538c9f8090
|
7
|
+
data.tar.gz: 1a0d5661cc64f338b0d83fac5bf1d8f370e4c33a526c65c749cd5a59f64262d3e168626aea25af7c7c13d98c3f609c921ab473acba4168553d9eb3722ae9925f
|
data/README.rdoc
CHANGED
@@ -66,6 +66,20 @@ Let's once assume a pretty basic class. Extend it with the Babylonian Class meth
|
|
66
66
|
fallback: false #=> will not fallback to default locale if no translation for locale is present
|
67
67
|
placeholder: "<span class='translation missing'>Translation missing in Transsylvania</span>" a placeholder if no translation is present
|
68
68
|
end
|
69
|
+
|
70
|
+
== Neat Helpers
|
71
|
+
Got to have helpers to build that tower with: These come with every babylonian tower built:
|
72
|
+
t = Transsylvania.new
|
73
|
+
t.locale #=> returns the current locale
|
74
|
+
t.locales #=> returns every locale present in each(!) translated field
|
75
|
+
t.has_locale?(locale) #=> returns true if all(!) fields are translated in that locale
|
76
|
+
t.available_locales #=> returns the locales available for translation, but not necessarily present in each translated field
|
77
|
+
t.has_available_locale? #=> returns true if a locale is available for translation
|
78
|
+
t.default_locale #=> returns the current default locale
|
79
|
+
t.locale_fallback? #=> returns true if the translations will fall back to the default locale
|
80
|
+
t.missing_translation_placeholder(field) #=> Returns a placeholder for missing translation for field, if defined
|
81
|
+
t.localized?(attribute) #=> returns if attribute is localized
|
82
|
+
|
69
83
|
== Contributing to babylonia
|
70
84
|
|
71
85
|
Please note that only open source APIs can be accepted as contributions to this gem. Private / Premium APIs have to be written as your own extension and will not be added to the gem code.
|
@@ -11,50 +11,34 @@ module Babylonia
|
|
11
11
|
# Class methods to extend a class with in order to make it able to handle translatable attributes
|
12
12
|
#
|
13
13
|
module ClassMethods
|
14
|
-
|
15
|
-
private
|
16
|
-
|
17
|
-
def add_to_handled_babylonian_fields data
|
18
|
-
instance_variable_set(:@handled_babylonian_fields, (instance_variable_get(:@handled_babylonian_fields) || []) + data.map(&:to_sym))
|
19
|
-
end
|
20
|
-
|
21
|
-
public
|
22
|
-
# Store all handled fields in a class instance variable
|
23
|
-
#
|
24
|
-
def handled_babylonian_fields
|
25
|
-
instance_variable_get(:@handled_babylonian_fields) || instance_variable_set(:@handled_babylonian_fields, [])
|
26
|
-
end
|
27
14
|
# Main class method ob Babylonia. Use to make attributes translatable
|
28
15
|
# @param [Symbol] fields the attributes to translate
|
29
16
|
# @param [Hash] options The options for translation
|
30
|
-
# @option [Symbol, Proc, String] locale The current locale - can be either a symbol that will be sent to the instance, a locale symbol that is included in available_locales or a proc that will get called with the instance
|
31
|
-
# @option [Symbol, Proc, String] default_locale The fallback / default locale - can be either a symbol that will be sent to the instance, a locale symbol that is included in available_locales, a proc that will get called with the instance
|
32
|
-
# @option [Symbol, Proc, Array] available_locales The available locales - can be either a symbol that will be sent to the instance, a proc that will get called with the instance
|
17
|
+
# @option [Symbol, Proc, String] locale The current locale - can be either a symbol that will be sent to the instance, a locale symbol that is included in available_locales or a proc that will get called with the instance. Defaults to I18n.locale at the time of use
|
18
|
+
# @option [Symbol, Proc, String] default_locale The fallback / default locale - can be either a symbol that will be sent to the instance, a locale symbol that is included in available_locales, a proc that will get called with the instance
|
19
|
+
# @option [Symbol, Proc, Array] available_locales The available locales - can be either a symbol that will be sent to the instance, a proc that will get called with the instance, or an Array of symbols of available locales. Defaults to I18n.available_locales at the time of use.
|
33
20
|
# @option [Boolean] fallback Wheter to fallback to the default locale or not
|
34
21
|
# @option [String] placeholder The placeholder to use for missing translations
|
35
22
|
#
|
36
23
|
def build_babylonian_tower_on(*fields)
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
babylonian_options[:fallback] = true if babylonian_options[:fallback].nil?
|
24
|
+
options = fields.last.is_a?(Hash) ? fields.pop : {}
|
25
|
+
options[:locale] ||= lambda { |r| I18n.locale }
|
26
|
+
options[:default_locale] ||= lambda { |r| I18n.default_locale }
|
27
|
+
options[:available_locales] ||= lambda { |r| I18n.available_locales }
|
28
|
+
options[:fallback] = true if options[:fallback].nil?
|
43
29
|
|
44
30
|
fields.each do |field|
|
45
|
-
instance_variable_set(:"@babylonian_options_for_#{field}", babylonian_options)
|
46
|
-
|
47
31
|
# Alias method chain the field to a translated value
|
48
32
|
# @param [Symbol] locale Pass a locale to get the field translation in this specific locale
|
49
33
|
# @return [String, NilClass] Either the string with the translation, the fallback, the placeholder or nil
|
50
34
|
# @example Call a field in italian
|
51
35
|
# your_instance.field(:it) #=> "Translation"
|
52
36
|
#
|
53
|
-
define_method :"#{field}_translated" do |
|
37
|
+
define_method :"#{field}_translated" do |l=nil|
|
54
38
|
field_hash = send(:"#{field}_hash")
|
55
|
-
translation = field_hash[
|
56
|
-
translation = field_hash[
|
57
|
-
(translation.nil? or translation.empty?) ?
|
39
|
+
translation = field_hash[l || locale]
|
40
|
+
translation = field_hash[default_locale] if translation.nil? or translation.empty? and locale_fallback?
|
41
|
+
(translation.nil? or translation.empty?) ? missing_translation_placeholder(field) : translation
|
58
42
|
end
|
59
43
|
alias_method :"#{field}_raw", field
|
60
44
|
alias_method field, :"#{field}_translated"
|
@@ -67,31 +51,6 @@ module Babylonia
|
|
67
51
|
field_content.is_a?(String) ? YAML.load(field_content) : {}
|
68
52
|
end
|
69
53
|
|
70
|
-
# Return all the languages stored
|
71
|
-
# @return [Array] An array containing all languages stored in the field
|
72
|
-
#
|
73
|
-
define_method :"#{field}_languages" do
|
74
|
-
send(:"#{field}_hash").keys
|
75
|
-
end
|
76
|
-
|
77
|
-
define_method :has_translated_attribute? do |attr|
|
78
|
-
self.class.handled_babylonian_fields.include?(attr.to_sym)
|
79
|
-
end
|
80
|
-
|
81
|
-
# Return if a translation in the language is stored for the field
|
82
|
-
# @return [Boolean] True if a translation is stored
|
83
|
-
#
|
84
|
-
define_method :"#{field}_has_locale?" do |locale|
|
85
|
-
send(:"#{field}_languages").include?(locale.to_sym)
|
86
|
-
end
|
87
|
-
|
88
|
-
# Return if a locale is theoretically available for the field
|
89
|
-
# @return [Boolean] True if the language is available
|
90
|
-
#
|
91
|
-
define_method :"#{field}_has_available_locale?" do |locale|
|
92
|
-
evaluate_babylonian_option!(:available_locales, field).include?(locale.to_sym)
|
93
|
-
end
|
94
|
-
|
95
54
|
# Set the field to a value. This either takes a string or a hash
|
96
55
|
# If given a String, the current locale is set to this value
|
97
56
|
# If given a Hash, the hash is merged into the current translation hash, and empty values are purged
|
@@ -105,34 +64,100 @@ module Babylonia
|
|
105
64
|
current_hash = send(:"#{field}_hash")
|
106
65
|
|
107
66
|
if data.is_a?(String)
|
108
|
-
current_hash.merge!
|
67
|
+
current_hash.merge! locale => data
|
109
68
|
elsif data.is_a?(Hash)
|
110
|
-
data.delete_if{|k,v| !
|
69
|
+
data.delete_if{|k,v| !has_available_locale?(k) }
|
111
70
|
current_hash.merge! data
|
112
71
|
end
|
113
72
|
|
114
|
-
send(:"#{field}_raw=", YAML.dump(current_hash.delete_if{|k,v| v.nil?
|
73
|
+
send(:"#{field}_raw=", YAML.dump(current_hash.delete_if{|k,v| v.nil? or v.empty? }))
|
115
74
|
end
|
116
75
|
alias_method :"#{field}_raw=", :"#{field}="
|
117
76
|
alias_method :"#{field}=", :"#{field}_translated="
|
118
77
|
end
|
119
78
|
|
79
|
+
# Return the currently active locale for the object
|
80
|
+
# @return [Symbol] The currently active locale
|
81
|
+
#
|
82
|
+
define_method :locale do
|
83
|
+
evaluate_localization_option!(:locale)
|
84
|
+
end
|
85
|
+
|
86
|
+
# Return the default locale for the object
|
87
|
+
# @return [Symbol] The currently active locale
|
88
|
+
#
|
89
|
+
define_method :default_locale do
|
90
|
+
evaluate_localization_option!(:default_locale)
|
91
|
+
end
|
92
|
+
|
93
|
+
# Return if the object falls back on translations
|
94
|
+
# @return [Boolean] if the translations fall back to the default locale
|
95
|
+
#
|
96
|
+
define_method :locale_fallback? do
|
97
|
+
evaluate_localization_option!(:fallback)
|
98
|
+
end
|
99
|
+
|
100
|
+
# Return the missing translation placeholder
|
101
|
+
# @return [String] The missing translation placeholder
|
102
|
+
#
|
103
|
+
define_method :missing_translation_placeholder do |field|
|
104
|
+
evaluate_localization_option!(:placeholder, field)
|
105
|
+
end
|
106
|
+
|
107
|
+
# Return languages stored in all translated fields
|
108
|
+
# @return [Array] An array containing all languages stored
|
109
|
+
#
|
110
|
+
define_method :locales do
|
111
|
+
first_field_locales = send(:"#{fields.first}_hash").keys
|
112
|
+
fields.inject(first_field_locales){|o, f| o & send(:"#{f}_hash").keys }
|
113
|
+
end
|
114
|
+
|
115
|
+
# Return if a translation in the language is stored in all translated fields
|
116
|
+
# @return [Boolean] True if a translation is stored
|
117
|
+
#
|
118
|
+
define_method :has_locale? do |locale|
|
119
|
+
locales.include?(locale.to_sym)
|
120
|
+
end
|
121
|
+
|
122
|
+
# Return all the available locales
|
123
|
+
# @return [Array] An array of symbols of all available locales
|
124
|
+
#
|
125
|
+
define_method :available_locales do
|
126
|
+
evaluate_localization_option!(:available_locales)
|
127
|
+
end
|
128
|
+
|
129
|
+
# Return if a locale is theoretically available in all translated fields
|
130
|
+
# @return [Boolean] True if the language is available
|
131
|
+
#
|
132
|
+
define_method :has_available_locale? do |locale|
|
133
|
+
available_locales.include?(locale.to_sym)
|
134
|
+
end
|
135
|
+
|
136
|
+
# Return if an attribute is localized
|
137
|
+
# @return [Boolean] True if the attribute is localized
|
138
|
+
#
|
139
|
+
define_method :localized? do |attr|
|
140
|
+
fields.include?(attr.to_sym)
|
141
|
+
end
|
142
|
+
|
120
143
|
# Define method missing to be able to access a language directly
|
121
144
|
define_method :method_missing do |meth, *args, &block|
|
122
|
-
if (m = meth.to_s.match(/\A([^_]+)_(\w+)(=)?\z/).to_a[1..3]) &&
|
145
|
+
if (m = meth.to_s.match(/\A([^_]+)_(\w+)(=)?\z/).to_a[1..3]) && localized?(m[0]) && has_available_locale?(m[1])
|
123
146
|
send(m[0] + m[2].to_s, m[2] ? {m[1].to_sym => args.first} : m[1].to_sym)
|
124
147
|
else
|
125
148
|
super(meth, *args, &block)
|
126
149
|
end
|
127
150
|
end
|
128
151
|
|
129
|
-
|
130
|
-
|
131
|
-
|
152
|
+
# Evaluate a localization option
|
153
|
+
#
|
154
|
+
define_method :evaluate_localization_option! do |option, field=nil, recursion=false|
|
132
155
|
o = options[option]
|
133
|
-
if o.is_a?(Proc)
|
156
|
+
if o.is_a?(Proc) && field
|
134
157
|
o.call self, field
|
135
|
-
elsif o.is_a?(
|
158
|
+
elsif o.is_a?(Proc)
|
159
|
+
o.call self
|
160
|
+
elsif o.is_a?(Symbol) && (recursion || !evaluate_localization_option!(:available_locales, nil, true).include?(o))
|
136
161
|
send o
|
137
162
|
else
|
138
163
|
o
|
data/lib/babylonia/version.rb
CHANGED
@@ -1,27 +1,16 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe Babylonia::ClassMethods do
|
4
|
-
|
5
|
-
|
6
|
-
|
3
|
+
describe Babylonia::ClassMethods do
|
4
|
+
context "without options" do
|
5
|
+
subject { BabylonianFields.new }
|
6
|
+
class BabylonianFields
|
7
|
+
extend Babylonia::ClassMethods
|
7
8
|
|
8
|
-
|
9
|
+
attr_accessor :marshes, :sky
|
9
10
|
|
10
|
-
|
11
|
-
build_babylonian_tower_on :grasslands, available_locales: [:pi, :de, :en, :it], locale: :architects_tongue, default_locale: lambda {|r, f| r.builders_tongue || :en }
|
12
|
-
build_babylonian_tower_on :desert, :sky, fallback: false, placeholder: lambda {|r, field| "<span class='missing translation'>Translation missing for " + field.to_s + "</span>"}
|
13
|
-
|
14
|
-
def architects_tongue
|
15
|
-
:pi
|
11
|
+
build_babylonian_tower_on :marshes, :sky
|
16
12
|
end
|
17
13
|
|
18
|
-
def builders_tongue
|
19
|
-
nil
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
context "without options" do
|
24
|
-
subject { BabylonianFields.new }
|
25
14
|
before(:each) do
|
26
15
|
I18n.stub locale: :en, default_locale: :de, available_locales: [:de, :en, :it]
|
27
16
|
end
|
@@ -116,7 +105,7 @@ describe Babylonia::ClassMethods do
|
|
116
105
|
end
|
117
106
|
end
|
118
107
|
end
|
119
|
-
describe "marshes=" do
|
108
|
+
describe "#marshes=" do
|
120
109
|
context "with no existing data" do
|
121
110
|
context "with a string" do
|
122
111
|
it "should set the current locales data" do
|
@@ -157,7 +146,7 @@ describe Babylonia::ClassMethods do
|
|
157
146
|
end
|
158
147
|
end
|
159
148
|
end
|
160
|
-
describe "marshes_hash" do
|
149
|
+
describe "#marshes_hash" do
|
161
150
|
before(:each) do
|
162
151
|
subject.marshes_raw = "---\n:it: SOME ITALIAN\n:en: SOME ENGLISH\n:de: SOME DEUTSCH\n"
|
163
152
|
end
|
@@ -165,26 +154,109 @@ describe Babylonia::ClassMethods do
|
|
165
154
|
subject.marshes_hash.should == {it: 'SOME ITALIAN', en: 'SOME ENGLISH', de: 'SOME DEUTSCH'}
|
166
155
|
end
|
167
156
|
end
|
168
|
-
describe "
|
157
|
+
describe "#locales" do
|
169
158
|
before(:each) do
|
170
159
|
subject.marshes_raw = "---\n:it: SOME ITALIAN\n:en: SOME ENGLISH\n:de: SOME DEUTSCH\n"
|
160
|
+
subject.sky_raw = "---\n:it: SOME ITALIAN\n:en: SOME ENGLISH\n:de: SOME DEUTSCH\n"
|
171
161
|
end
|
172
162
|
it "should return the translated languages of the field" do
|
173
|
-
subject.
|
163
|
+
subject.locales.sort.should == [:de, :en, :it]
|
164
|
+
end
|
165
|
+
end
|
166
|
+
describe "#has_locale?" do
|
167
|
+
before(:each) do
|
168
|
+
subject.marshes_raw = "---\n:it: SOME ITALIAN\n:en: SOME ENGLISH\n:de: SOME DEUTSCH\n"
|
169
|
+
subject.sky_raw = "---\n:it: SOME ITALIAN\n:en: SOME ENGLISH\n:de: SOME DEUTSCH\n"
|
170
|
+
end
|
171
|
+
context "with the locale present in the translation hashes" do
|
172
|
+
it "should return true" do
|
173
|
+
subject.should be_has_locale(:it)
|
174
|
+
end
|
175
|
+
end
|
176
|
+
context "with the locale not present in the translation hashes" do
|
177
|
+
it "should return true" do
|
178
|
+
subject.should_not be_has_locale(:pi)
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|
182
|
+
describe "#available_locales" do
|
183
|
+
before(:each) do
|
184
|
+
I18n.stub available_locales: [:de, :en]
|
185
|
+
end
|
186
|
+
it "should return available locales" do
|
187
|
+
subject.available_locales.sort.should == [:de, :en]
|
188
|
+
end
|
189
|
+
end
|
190
|
+
describe "#has_available_locale" do
|
191
|
+
before(:each) do
|
192
|
+
I18n.stub available_locales: [:de, :en]
|
193
|
+
end
|
194
|
+
context "with an available locale" do
|
195
|
+
it "should return true" do
|
196
|
+
subject.should be_has_available_locale(:de)
|
197
|
+
end
|
198
|
+
end
|
199
|
+
context "with an available locale" do
|
200
|
+
it "should return true" do
|
201
|
+
subject.should_not be_has_available_locale(:it)
|
202
|
+
end
|
203
|
+
end
|
204
|
+
end
|
205
|
+
describe "#localized?" do
|
206
|
+
context "with a localized attribute" do
|
207
|
+
it "should return true" do
|
208
|
+
subject.should be_localized(:sky)
|
209
|
+
end
|
210
|
+
end
|
211
|
+
context "with a unlocalized attribute" do
|
212
|
+
it "should return true" do
|
213
|
+
subject.should_not be_localized(:desert)
|
214
|
+
end
|
215
|
+
end
|
216
|
+
end
|
217
|
+
describe "#missing_translation_placeholder" do
|
218
|
+
it "should return nil" do
|
219
|
+
subject.missing_translation_placeholder('FIELD').should be_nil
|
220
|
+
end
|
221
|
+
end
|
222
|
+
describe "#locale_fallback?" do
|
223
|
+
it "should return false" do
|
224
|
+
subject.should be_locale_fallback
|
174
225
|
end
|
175
226
|
end
|
176
227
|
end
|
177
228
|
|
178
|
-
context "with options" do
|
179
|
-
|
229
|
+
context "with options opposite the defaults" do
|
230
|
+
class BabylonianFieldsWithOptions
|
231
|
+
extend Babylonia::ClassMethods
|
232
|
+
|
233
|
+
attr_accessor :grasslands, :desert
|
234
|
+
|
235
|
+
build_babylonian_tower_on :grasslands, :desert,
|
236
|
+
available_locales: [:pi, :de, :en, :it],
|
237
|
+
locale: :architects_tongue,
|
238
|
+
default_locale: lambda {|r| r.builders_tongue || :en },
|
239
|
+
fallback: false,
|
240
|
+
placeholder: lambda {|r, field| "<span class='missing translation'>Translation missing for " + field.to_s + "</span>"}
|
241
|
+
|
242
|
+
def architects_tongue
|
243
|
+
:pi
|
244
|
+
end
|
245
|
+
|
246
|
+
def builders_tongue
|
247
|
+
nil
|
248
|
+
end
|
249
|
+
end
|
250
|
+
|
251
|
+
subject { BabylonianFieldsWithOptions.new }
|
180
252
|
before(:each) do
|
181
253
|
I18n.stub locale: :en, default_locale: :de
|
182
254
|
end
|
183
255
|
|
184
256
|
describe "#grasslands" do
|
185
257
|
context "with no data" do
|
186
|
-
it "should return
|
187
|
-
subject.grasslands.should
|
258
|
+
it "should return the placeholder" do
|
259
|
+
subject.grasslands.should == "<span class='missing translation'>Translation missing for grasslands</span>"
|
188
260
|
end
|
189
261
|
end
|
190
262
|
context "with some raw data" do
|
@@ -204,12 +276,12 @@ describe Babylonia::ClassMethods do
|
|
204
276
|
before(:each) do
|
205
277
|
subject.stub grasslands_raw: "---\n:en: FALLBACK"
|
206
278
|
end
|
207
|
-
it "should return the fallback data" do
|
208
|
-
subject.grasslands.should == "
|
279
|
+
it "should not return the fallback data" do
|
280
|
+
subject.grasslands.should == "<span class='missing translation'>Translation missing for grasslands</span>"
|
209
281
|
end
|
210
282
|
context "with a locale argument" do
|
211
|
-
it "should return the fallback" do
|
212
|
-
subject.grasslands(:pi).should == '
|
283
|
+
it "should return the not return the fallback" do
|
284
|
+
subject.grasslands(:pi).should == "<span class='missing translation'>Translation missing for grasslands</span>"
|
213
285
|
end
|
214
286
|
end
|
215
287
|
end
|
@@ -218,11 +290,11 @@ describe Babylonia::ClassMethods do
|
|
218
290
|
subject.stub grasslands_raw: "---\n:it: NO_FALLBACK"
|
219
291
|
end
|
220
292
|
it "should return the fallback data" do
|
221
|
-
subject.grasslands.should
|
293
|
+
subject.grasslands.should == "<span class='missing translation'>Translation missing for grasslands</span>"
|
222
294
|
end
|
223
295
|
context "with a locale argument" do
|
224
296
|
it "should return the fallback" do
|
225
|
-
subject.grasslands(:en).should
|
297
|
+
subject.grasslands(:en).should == "<span class='missing translation'>Translation missing for grasslands</span>"
|
226
298
|
end
|
227
299
|
end
|
228
300
|
end
|
@@ -283,31 +355,93 @@ describe Babylonia::ClassMethods do
|
|
283
355
|
context "with a string" do
|
284
356
|
it "should be deleted" do
|
285
357
|
subject.grasslands = ''
|
286
|
-
subject.grasslands.should
|
358
|
+
subject.grasslands.should == "<span class='missing translation'>Translation missing for grasslands</span>"
|
287
359
|
end
|
288
360
|
end
|
289
361
|
context "with nil" do
|
290
362
|
it "should be deleted" do
|
291
363
|
subject.grasslands = nil
|
292
|
-
subject.grasslands.should
|
364
|
+
subject.grasslands.should == "<span class='missing translation'>Translation missing for grasslands</span>"
|
293
365
|
end
|
294
366
|
end
|
295
367
|
context "with a hash containing an empty string" do
|
296
368
|
it "should be deleted" do
|
297
369
|
subject.grasslands = {it: ''}
|
298
|
-
subject.grasslands(:it).should
|
370
|
+
subject.grasslands(:it).should == "<span class='missing translation'>Translation missing for grasslands</span>"
|
299
371
|
end
|
300
372
|
end
|
301
373
|
context "with a hash containing nil" do
|
302
374
|
it "should be deleted" do
|
303
375
|
subject.grasslands = {it: nil}
|
304
|
-
subject.grasslands(:it).should
|
376
|
+
subject.grasslands(:it).should == "<span class='missing translation'>Translation missing for grasslands</span>"
|
305
377
|
end
|
306
378
|
end
|
307
379
|
end
|
308
380
|
end
|
309
381
|
end
|
382
|
+
describe "#locales" do
|
383
|
+
before(:each) do
|
384
|
+
subject.grasslands_raw = "---\n:it: SOME ITALIAN\n:en: SOME ENGLISH\n:de: SOME DEUTSCH\n"
|
385
|
+
subject.desert_raw = "---\n:it: SOME ITALIAN\n:en: SOME ENGLISH\n:de: SOME DEUTSCH\n"
|
386
|
+
end
|
387
|
+
it "should return the translated languages of the field" do
|
388
|
+
subject.locales.sort.should == [:de, :en, :it]
|
389
|
+
end
|
390
|
+
end
|
391
|
+
describe "#has_locale?" do
|
392
|
+
before(:each) do
|
393
|
+
subject.grasslands_raw = "---\n:it: SOME ITALIAN\n:en: SOME ENGLISH\n:de: SOME DEUTSCH\n"
|
394
|
+
subject.desert_raw = "---\n:it: SOME ITALIAN\n:en: SOME ENGLISH\n:de: SOME DEUTSCH\n"
|
395
|
+
end
|
396
|
+
context "with the locale present in the translation hashes" do
|
397
|
+
it "should return true" do
|
398
|
+
subject.should be_has_locale(:it)
|
399
|
+
end
|
400
|
+
end
|
401
|
+
context "with the locale not present in the translation hashes" do
|
402
|
+
it "should return true" do
|
403
|
+
subject.should_not be_has_locale(:pi)
|
404
|
+
end
|
405
|
+
end
|
406
|
+
end
|
407
|
+
describe "#available_locales" do
|
408
|
+
it "should return available locales" do
|
409
|
+
subject.available_locales.sort.should == [:de, :en, :it, :pi]
|
410
|
+
end
|
411
|
+
end
|
412
|
+
describe "#has_available_locale" do
|
413
|
+
context "with an available locale" do
|
414
|
+
it "should return true" do
|
415
|
+
subject.should be_has_available_locale(:pi)
|
416
|
+
end
|
417
|
+
end
|
418
|
+
context "with an available locale" do
|
419
|
+
it "should return true" do
|
420
|
+
subject.should_not be_has_available_locale(:gb)
|
421
|
+
end
|
422
|
+
end
|
423
|
+
end
|
424
|
+
describe "#localized?" do
|
425
|
+
context "with a localized attribute" do
|
426
|
+
it "should return true" do
|
427
|
+
subject.should be_localized(:grasslands)
|
428
|
+
end
|
429
|
+
end
|
430
|
+
context "with a unlocalized attribute" do
|
431
|
+
it "should return true" do
|
432
|
+
subject.should_not be_localized(:fields)
|
433
|
+
end
|
434
|
+
end
|
435
|
+
end
|
436
|
+
describe "#missing_translation_placeholder" do
|
437
|
+
it "should return the defined placeholder for the field" do
|
438
|
+
subject.missing_translation_placeholder('FIELD').should == "<span class='missing translation'>Translation missing for FIELD</span>"
|
439
|
+
end
|
440
|
+
end
|
441
|
+
describe "#locale_fallback?" do
|
442
|
+
it "should return false" do
|
443
|
+
subject.should_not be_locale_fallback
|
444
|
+
end
|
445
|
+
end
|
310
446
|
end
|
311
|
-
|
312
|
-
|
313
447
|
end
|