air18n 0.1.3 → 0.1.4
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.
- data/lib/air18n/backend.rb +30 -17
- data/lib/air18n/class_methods.rb +4 -0
- data/lib/air18n/version.rb +1 -1
- data/lib/air18n.rb +1 -0
- data/make_gem +1 -1
- data/spec/lib/air18n/backend_spec.rb +23 -0
- data/spec/lib/air18n/phrase_translation_spec.rb +0 -3
- metadata +1 -1
data/lib/air18n/backend.rb
CHANGED
@@ -8,7 +8,13 @@ module Air18n
|
|
8
8
|
class Backend
|
9
9
|
include I18n::Backend::Base
|
10
10
|
|
11
|
-
|
11
|
+
# - translation_data: map of locale to key to translation
|
12
|
+
# - phrase_screenshots: map of phrase key to the routes context that we
|
13
|
+
# have screenshots for
|
14
|
+
# - default_text_change_observer: set this to an implementation of
|
15
|
+
# DefaultTextChangeObserver to be alerted to changes of default text, and
|
16
|
+
# be able to guard against flipflops.
|
17
|
+
attr_accessor :translation_data, :phrase_screenshots, :default_text_change_observer
|
12
18
|
|
13
19
|
# Stores translations for a given locale.
|
14
20
|
def store_translations locale, data, options = {}
|
@@ -157,27 +163,34 @@ module Air18n
|
|
157
163
|
if locale == I18n.default_locale && default && result != default
|
158
164
|
# If it doesn't, we need to update the 'phrases' table so that
|
159
165
|
# the 'value' column reflects the latest English default text.
|
166
|
+
store_default = true
|
160
167
|
if result.present?
|
161
|
-
LoggingHelper.info "Default #{
|
168
|
+
LoggingHelper.info "Default #{locale} text for key '#{key}' changed! Old default '#{result}' != new default '#{default}'. Route context: #{options[:routes_context]}"
|
169
|
+
if @default_text_change_observer.present?
|
170
|
+
@default_text_change_observer.default_text_changed(locale, key, result, default)
|
171
|
+
store_default = @default_text_change_observer.allow_default_text_change?(locale, key, result, default)
|
172
|
+
end
|
162
173
|
end
|
163
|
-
|
164
|
-
|
165
|
-
if
|
166
|
-
(
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
174
|
+
if store_default
|
175
|
+
phrase = Phrase.find_or_create_by_key(key)
|
176
|
+
if phrase
|
177
|
+
if (overrides_previous_default && phrase.value != default) ||
|
178
|
+
(!overrides_previous_default && phrase.value != default && phrase.value.blank?)
|
179
|
+
phrase.value = default
|
180
|
+
|
181
|
+
begin
|
182
|
+
phrase.save
|
183
|
+
rescue Exception => e
|
184
|
+
# If many requests happen simultaneously for a page with a new
|
185
|
+
# phrase, a "duplicate entry" exception will happen naturally.
|
186
|
+
# And if phrase creation fails for some other reason, we will try
|
187
|
+
# again to create it next time automatically.
|
188
|
+
end
|
176
189
|
end
|
177
190
|
end
|
178
|
-
end
|
179
191
|
|
180
|
-
|
192
|
+
@translation_data[locale][key] = default
|
193
|
+
end
|
181
194
|
result = default
|
182
195
|
end
|
183
196
|
|
data/lib/air18n/class_methods.rb
CHANGED
@@ -178,6 +178,10 @@ module Air18n
|
|
178
178
|
@air18n_backend.rescreenshot(routes_context)
|
179
179
|
end
|
180
180
|
|
181
|
+
def set_default_text_change_observer(observer)
|
182
|
+
@air18n_backend.default_text_change_observer = observer
|
183
|
+
end
|
184
|
+
|
181
185
|
def currency=(c)
|
182
186
|
@currency = c
|
183
187
|
@distance_unit = self::MILES_CURRENCIES.include?(c) ? "MI" : "KM"
|
data/lib/air18n/version.rb
CHANGED
data/lib/air18n.rb
CHANGED
data/make_gem
CHANGED
@@ -4,6 +4,19 @@ require 'air18n/mock_priority'
|
|
4
4
|
|
5
5
|
describe Air18n::Backend do
|
6
6
|
|
7
|
+
class PessimisticRecordingDefaultTextChangeObserver
|
8
|
+
extend Air18n::DefaultTextChangeObserver
|
9
|
+
attr_accessor :changes
|
10
|
+
def default_text_changed(locale, key, old_default, new_default)
|
11
|
+
@changes ||= []
|
12
|
+
@changes << [locale, key, old_default, new_default]
|
13
|
+
end
|
14
|
+
|
15
|
+
def allow_default_text_change?(locale, key, old_default, new_default)
|
16
|
+
false
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
7
20
|
before do
|
8
21
|
@scope = []
|
9
22
|
end
|
@@ -31,6 +44,16 @@ describe Air18n::Backend do
|
|
31
44
|
@backend.lookup(I18n.default_locale, phrase.key, @scope, :default => 'new_value', :default_is_low_priority => true).should == 'new_value'
|
32
45
|
phrase.reload.value.should == 'original_value'
|
33
46
|
end
|
47
|
+
it 'Should not override DB value when default text observer says not to' do
|
48
|
+
phrase = FactoryGirl.create(:phrase, :key => 'default text change, key 1', :value => 'original_value')
|
49
|
+
@backend.init_translations(I18n.default_locale)
|
50
|
+
default_text_change_observer = PessimisticRecordingDefaultTextChangeObserver.new
|
51
|
+
@backend.default_text_change_observer = default_text_change_observer
|
52
|
+
@backend.lookup(I18n.default_locale, phrase.key, @scope, :default => 'new_value').should == 'new_value'
|
53
|
+
|
54
|
+
default_text_change_observer.changes.should == [[:en, 'default text change, key 1', 'original_value', 'new_value']]
|
55
|
+
phrase.reload.value.should == 'original_value'
|
56
|
+
end
|
34
57
|
end
|
35
58
|
|
36
59
|
context 'Robustness to various input formats' do
|
@@ -30,9 +30,6 @@ describe Air18n::PhraseTranslation do
|
|
30
30
|
translation.value = 'too looooong'
|
31
31
|
translation.save.should be_false
|
32
32
|
translation.errors.should == { :value => ["Translation has 12 characters; maximum length 10 characters."] }
|
33
|
-
|
34
|
-
translation = FactoryGirl.create(:phrase_translation, :key => 'facebook description maxlength:0', :value => 'short')
|
35
|
-
validated = translation.save
|
36
33
|
end
|
37
34
|
end
|
38
35
|
|