air18n 0.1.18 → 0.1.19

Sign up to get free protection for your applications and to get access to all the features.
@@ -299,7 +299,7 @@ module Air18n
299
299
  end
300
300
 
301
301
  def check_plural_forms
302
- result = SmartCount::valid?(self.value, self.locale)
302
+ result = SmartCount::valid?(self.phrase.value, self.value, I18n.default_locale, self.locale)
303
303
  if !result[:valid]
304
304
  self.errors.add(:value, result[:reason])
305
305
  end
@@ -310,7 +310,7 @@ module Air18n
310
310
  max_length = $1.to_i
311
311
  length = value.size
312
312
  if length > max_length
313
- self.errors.add(:value, "Translation has #{length} characters; maximum length #{max_length} characters.")
313
+ self.errors.add(:value, "Translation has #{length} characters, maximum length is #{max_length} characters.")
314
314
  end
315
315
  end
316
316
  end
@@ -322,8 +322,8 @@ module Air18n
322
322
  if SmartCount::applies?(self.phrase.value) || SmartCount::applies?(self.value)
323
323
  our_variables = SmartCount::dedupe_things_like_tags_or_variables(
324
324
  self.locale, our_variables)
325
- their_variables = SmartCount::dedupe_things_like_tags_or_variables(
326
- I18n.default_locale, their_variables)
325
+ their_variables = SmartCount::dedupe_things_like_tags_or_variables(
326
+ I18n.default_locale, their_variables)
327
327
  end
328
328
 
329
329
  LoggingHelper.info "our variables: #{our_variables.inspect}"
@@ -1,17 +1,28 @@
1
+ # encoding: utf-8
2
+
1
3
  module Air18n
2
4
  module SmartCount
3
5
  # Class for choosing the right plural form of a phrase based on an
4
6
  # interpolation variable with special name "smart_count" (set below in
5
7
  # OPTION_NAME constant).
6
8
  #
7
- # If a phrase uses the smart_count interpolation variable, translators can
8
- # specify multiple translations, one per possible pluralization form of the
9
+ # If a phrase's default text contains '||||', translators can specify
10
+ # multiple translations, one per possible pluralization form of the
9
11
  # language. If there is more than one pluralization form, translations are
10
- # separated by ";" (set below in DELIMITER constant).
12
+ # separated by "||||" (set below in DELIMITER constant). The default text
13
+ # specifies all the forms for the default locale. (If the default locale is
14
+ # a single-form locale like Japanese, the default text can look like
15
+ # "%{smart_count} レビュー||||" where it ends with '||||'.
11
16
 
17
+ # Option to translate() that holds number which controls which plural form
18
+ # is used.
12
19
  INTERPOLATION_VARIABLE_NAME = :smart_count
13
- INTERPOLATION_VARIABLE_PLACEHOLDER = "%{#{INTERPOLATION_VARIABLE_NAME}}"
14
- DELIMITER = ';'
20
+
21
+ # Delimiter between forms of translation.
22
+ #
23
+ # This delimiter must be unique and rare because we assume that any phrase
24
+ # that includes it uses smart counting.
25
+ DELIMITER = '||||'
15
26
 
16
27
  # C.F.
17
28
  # https://developer.mozilla.org/en-US/docs/Localization_and_Plurals
@@ -74,29 +85,30 @@ module Air18n
74
85
  # 'locale'.
75
86
  #
76
87
  # Examples:
77
- # choose("%{smart_count} bewertung; %{smart_count} bewertungen",
88
+ # choose("%{smart_count} bewertung |||| %{smart_count} bewertungen",
78
89
  # :de, 0)
79
- # => %{smart_count} bewertungen
80
- # choose("%{smart_count} bewertung; %{smart_count} bewertungen",
90
+ # => "%{smart_count} bewertungen"
91
+ # choose("%{smart_count} bewertung |||| %{smart_count} bewertungen",
81
92
  # :de, 1)
82
- # => %{smart_count} bewertung
83
- # choose("%{smart_count} bewertung; %{smart_count} bewertungen",
93
+ # => "%{smart_count} bewertung"
94
+ # choose("%{smart_count} bewertung |||| %{smart_count} bewertungen",
84
95
  # :de, 2)
85
- # => %{smart_count} bewertungen
96
+ # => "%{smart_count} bewertungen"
97
+ # choose("%{smart_count} bewertung |||| %{smart_count} bewertungen",
98
+ # :de, nil)
99
+ # => "%{smart_count} bewertung |||| %{smart_count} bewertungen"
86
100
  #
87
101
  # If 'count' is nil or 'text' contains too few alternative versions, this
88
102
  # method degrades gracefully by returning the first version of text.
89
103
  #
90
104
  # Returns if nil if text is blank.
91
105
  def choose(text, locale, count)
92
- return text if text.blank?
93
-
94
- texts = text.split(DELIMITER)
95
- if count
106
+ if count.present? && text.present?
107
+ texts = text.split(DELIMITER)
96
108
  chosen_text = texts[plural_type_index(locale, count)] || texts.first
97
109
  chosen_text.strip
98
110
  else
99
- texts.first.strip
111
+ text
100
112
  end
101
113
  end
102
114
 
@@ -109,19 +121,21 @@ module Air18n
109
121
  PLURAL_TYPES[plural_type_name(locale)][:rule].call(count)
110
122
  end
111
123
 
112
- def hint(text, locale)
113
- if applies?(text)
114
- doc_array = PLURAL_TYPES[plural_type_name(locale)][:doc]
124
+ # Returns a hint for translators translating source_text to target_locale,
125
+ # or nil if there is no smart-count-related hint.
126
+ def hint(source_text, target_locale)
127
+ if applies?(source_text)
128
+ doc_array = PLURAL_TYPES[plural_type_name(target_locale)][:doc]
115
129
  if doc_array
116
- doc_string = doc_array.join(DELIMITER + ' ')
117
- n = num_forms(locale)
130
+ doc_string = doc_array.join(' ' + DELIMITER + ' ')
131
+ n = num_forms(target_locale)
118
132
  "Must specify #{n} forms separated by \"#{DELIMITER}\": \"#{doc_string}\""
119
133
  end
120
134
  end
121
135
  end
122
136
 
123
137
  def applies?(text)
124
- !!text.index(INTERPOLATION_VARIABLE_PLACEHOLDER)
138
+ !!text.index(DELIMITER)
125
139
  end
126
140
 
127
141
  def num_forms(locale)
@@ -161,10 +175,10 @@ module Air18n
161
175
  end
162
176
  end
163
177
 
164
- def valid?(text, locale)
165
- if applies?(text)
166
- size = text.split(DELIMITER).size
167
- num_forms = num_forms(locale)
178
+ def valid?(source_text, target_text, source_locale, target_locale)
179
+ if applies?(source_text) || applies?(target_text)
180
+ size = target_text.split(DELIMITER).size
181
+ num_forms = num_forms(target_locale)
168
182
  if size == num_forms
169
183
  { :valid => true }
170
184
  else
@@ -1,3 +1,3 @@
1
1
  module Air18n
2
- VERSION = "0.1.18"
2
+ VERSION = "0.1.19"
3
3
  end
@@ -105,6 +105,40 @@ describe Air18n do
105
105
  end
106
106
  end
107
107
 
108
+ context 'smart_count' do
109
+ it 'should work in English' do
110
+ I18n.t('smart count test',
111
+ :default => 'review |||| reviews'
112
+ ).should == 'review |||| reviews'
113
+ I18n.t('smart count test',
114
+ :default => 'review |||| reviews',
115
+ :smart_count => 1
116
+ ).should == 'review'
117
+ I18n.t('smart count test',
118
+ :default => 'review |||| reviews',
119
+ :smart_count => 2
120
+ ).should == 'reviews'
121
+ end
122
+
123
+ it 'should work in English with other interpolation' do
124
+ I18n.t('smart count test with interpolation',
125
+ :default => 'review in %{location} |||| reviews in %{location}',
126
+ :smart_count => 2,
127
+ :location => 'Finland'
128
+ ).should == 'reviews in Finland'
129
+
130
+ # You can't use smart_count without specifying all other interpolation
131
+ # variables. Otherwise you get a I18n::MissingInterpolationArgument
132
+ # error.
133
+ lambda {
134
+ I18n.t('smart count test with interpolation',
135
+ :default => 'review in %{location} |||| reviews in %{location}',
136
+ :smart_count => 2
137
+ )
138
+ }.should raise_error
139
+ end
140
+ end
141
+
108
142
  context 'pluralize' do
109
143
  it 'should work in English' do
110
144
  I18n.pluralize(0, 'Review').should == '0 Reviews'
@@ -118,7 +152,7 @@ describe Air18n do
118
152
  end
119
153
 
120
154
  it 'should work in French' do
121
- I18n.backend.store_translations(:fr, { 'shared.pluralize.Review' => '%{smart_count} Commentaire;%{smart_count} Commentaires' })
155
+ I18n.backend.store_translations(:fr, { 'shared.pluralize.Review' => '%{smart_count} Commentaire |||| %{smart_count} Commentaires' })
122
156
  old_locale = I18n.full_locale
123
157
  I18n.full_locale = :fr
124
158
  I18n.pluralize(0, 'Review').should == '0 Commentaire'
@@ -129,7 +163,7 @@ describe Air18n do
129
163
  end
130
164
 
131
165
  it 'should work with explicitly-specified plural' do
132
- I18n.backend.store_translations(:fr, { 'shared.pluralize.feis' => '%{smart_count} french singular;%{smart_count} french plural' })
166
+ I18n.backend.store_translations(:fr, { 'shared.pluralize.feis' => '%{smart_count} french singular |||| %{smart_count} french plural' })
133
167
 
134
168
  I18n.pluralize(0, 'feis', 'feiseanna').should == '0 feiseanna'
135
169
  I18n.pluralize(1, 'feis', 'feiseanna').should == '1 feis'
@@ -153,21 +153,25 @@ describe Air18n::Backend do
153
153
  backend = Air18n::Backend.new
154
154
  backend.lookup(
155
155
  :en, 'smart count reviews', @scope,
156
- :default => "%{smart_count} review; %{smart_count} reviews",
156
+ :default => "%{smart_count} review |||| %{smart_count} reviews",
157
157
  :smart_count => 1
158
158
  ).should == '%{smart_count} review'
159
159
  backend.lookup(
160
160
  :en, 'smart count reviews', @scope,
161
- :default => "%{smart_count} review; %{smart_count} reviews",
161
+ :default => "%{smart_count} review |||| %{smart_count} reviews",
162
162
  :smart_count => 3
163
163
  ).should == '%{smart_count} reviews'
164
+ backend.lookup(
165
+ :en, 'smart count reviews', @scope,
166
+ :default => "%{smart_count} review |||| %{smart_count} reviews",
167
+ ).should == '%{smart_count} review |||| %{smart_count} reviews'
164
168
 
165
169
  # If a phrase is untranslated in Chinese, this can turn into "3 review"
166
170
  # on the Chinese site if we are not careful and use the Chinese plural
167
171
  # rules for this English fallback. This test catches this bug.
168
172
  backend.lookup(
169
173
  :zh, 'smart count reviews', @scope,
170
- :default => "%{smart_count} review; %{smart_count} reviews",
174
+ :default => "%{smart_count} review |||| %{smart_count} reviews",
171
175
  :smart_count => 3
172
176
  ).should == '%{smart_count} reviews'
173
177
  end
@@ -41,7 +41,7 @@ describe Air18n::PhraseTranslation do
41
41
  translation.value = 'too looooong'
42
42
  translation.save.should be_false
43
43
  translation.errors.should include :value
44
- translation.errors[:value].should include "Translation has 12 characters; maximum length 10 characters."
44
+ translation.errors[:value].should include "Translation has 12 characters, maximum length is 10 characters."
45
45
  end
46
46
 
47
47
  it 'Should check variables' do
@@ -57,7 +57,7 @@ describe Air18n::PhraseTranslation do
57
57
 
58
58
  context 'smart_count' do
59
59
  before :all do
60
- @phrase = FactoryGirl.create(:phrase, :key => 'variables with smart count reviews', :value => "%{smart_count} review in %{location};%{smart_count} reviews in %{location}")
60
+ @phrase = FactoryGirl.create(:phrase, :key => 'variables with smart count reviews', :value => "%{smart_count} review in %{location} |||| %{smart_count} reviews in %{location}")
61
61
  end
62
62
 
63
63
  it 'Should check variables with smart count in language with one plural form' do
@@ -81,10 +81,10 @@ describe Air18n::PhraseTranslation do
81
81
  :phrase => @phrase,
82
82
  :locale => :fr,
83
83
  :key => 'variables with smart count reviews',
84
- :value => 'a %{location} %{smart_count} commentaire; a %{location} %{smart_count} commentaires')
84
+ :value => 'a %{location} %{smart_count} commentaire |||| a %{location} %{smart_count} commentaires')
85
85
  validated = translation.save
86
86
  validated.should == true
87
- translation.value = 'a %{location} %{smart_count} commentaire; a %{location} %{smart_countz} commentaires'
87
+ translation.value = 'a %{location} %{smart_count} commentaire |||| a %{location} %{smart_countz} commentaires'
88
88
  translation.save.should be_false
89
89
  translation.errors.should include :value
90
90
  translation.errors[:value].should include "Var %{smart_count} missing from translation"
@@ -96,10 +96,10 @@ describe Air18n::PhraseTranslation do
96
96
  :phrase => @phrase,
97
97
  :locale => :pl,
98
98
  :key => 'variables with smart count reviews',
99
- :value => 'a %{location} %{smart_count} ends-in-one-except-eleven; a %{location} %{smart_count} ends-in-two-through-four-except-twelve-through-fourteen; a %{location} %{smart_count} everything-else')
99
+ :value => 'a %{location} %{smart_count} ends-in-one-except-eleven |||| a %{location} %{smart_count} ends-in-two-through-four-except-twelve-through-fourteen |||| a %{location} %{smart_count} everything-else')
100
100
  validated = translation.save
101
101
  validated.should == true
102
- translation.value = 'a %{location} %{smart_count} ends-in-one-except-eleven; a %{location} %{smart_count} ends-in-two-through-four-except-twelve-through-fourteen; a %{smart_count} everything-else'
102
+ translation.value = 'a %{location} %{smart_count} ends-in-one-except-eleven |||| a %{location} %{smart_count} ends-in-two-through-four-except-twelve-through-fourteen |||| a %{smart_count} everything-else'
103
103
 
104
104
  translation.save.should be_false
105
105
  translation.errors.should include :value
@@ -112,13 +112,13 @@ describe Air18n::PhraseTranslation do
112
112
  :phrase => @phrase,
113
113
  :locale => :de,
114
114
  :key => 'variables with smart count reviews',
115
- :value => 'a %{location} %{smart_count} bewertung; a %{location} %{smart_count} bewertungen')
115
+ :value => 'a %{location} %{smart_count} bewertung |||| a %{location} %{smart_count} bewertungen')
116
116
  validated = translation.save
117
117
  validated.should == true
118
118
  translation.value = 'a %{location} %{smart_count} bewertung, a %{location} %{smart_count} bewertungen'
119
119
  translation.save.should be_false
120
120
  translation.errors.should include :value
121
- translation.errors[:value].should include "Must specify 2 forms separated by \";\" (1 was specified)"
121
+ translation.errors[:value].should include "Must specify 2 forms separated by \"||||\" (1 was specified)"
122
122
  end
123
123
  end
124
124
  end
@@ -19,7 +19,7 @@ describe Air18n::SmartCount do
19
19
  end
20
20
 
21
21
  it "should work in German" do
22
- review_text = "%{smart_count} bewertung; %{smart_count} bewertungen"
22
+ review_text = "%{smart_count} bewertung |||| %{smart_count} bewertungen"
23
23
  answers =
24
24
  ["%{smart_count} bewertungen"] * 1 +
25
25
  ["%{smart_count} bewertung"] * 1 +
@@ -28,7 +28,7 @@ describe Air18n::SmartCount do
28
28
  end
29
29
 
30
30
  it "should work in French" do
31
- review_text = "%{smart_count} commentaire; %{smart_count} commentaires"
31
+ review_text = "%{smart_count} commentaire |||| %{smart_count} commentaires"
32
32
  answers =
33
33
  ["%{smart_count} commentaire"] * 2 +
34
34
  ["%{smart_count} commentaires"] * 24
@@ -36,7 +36,7 @@ describe Air18n::SmartCount do
36
36
  end
37
37
 
38
38
  it "should work in Russian" do
39
- review_text = "%{smart_count} ends-in-one-except-eleven; %{smart_count} ends-in-two-through-four-except-twelve-through-fourteen; %{smart_count} everything-else"
39
+ review_text = "%{smart_count} ends-in-one-except-eleven |||| %{smart_count} ends-in-two-through-four-except-twelve-through-fourteen |||| %{smart_count} everything-else"
40
40
  answers =
41
41
  ["%{smart_count} everything-else"] * 1 +
42
42
  ["%{smart_count} ends-in-one-except-eleven"] * 1 +
@@ -49,7 +49,7 @@ describe Air18n::SmartCount do
49
49
  end
50
50
 
51
51
  it "should work in Czech" do
52
- review_text = "%{smart_count} one; %{smart_count} two-through-four; %{smart_count} everything-else"
52
+ review_text = "%{smart_count} one |||| %{smart_count} two-through-four |||| %{smart_count} everything-else"
53
53
  answers =
54
54
  ["%{smart_count} everything-else"] * 1 +
55
55
  ["%{smart_count} one"] * 1 +
@@ -59,7 +59,7 @@ describe Air18n::SmartCount do
59
59
  end
60
60
 
61
61
  it "should work in Polish" do
62
- review_text = "%{smart_count} one; %{smart_count} ends-in-two-through-four-except-twelve-through-fourteen; %{smart_count} everything-else"
62
+ review_text = "%{smart_count} one |||| %{smart_count} ends-in-two-through-four-except-twelve-through-fourteen |||| %{smart_count} everything-else"
63
63
  answers =
64
64
  ["%{smart_count} everything-else"] * 1 +
65
65
  ["%{smart_count} one"] * 1 +
@@ -69,13 +69,26 @@ describe Air18n::SmartCount do
69
69
  ["%{smart_count} everything-else"] * 1
70
70
  test_choose(review_text, :pl, answers)
71
71
  end
72
+
73
+ it "should work without %{smart_count} being in the phrase" do
74
+ review_text = "ends-in-one-except-eleven |||| ends-in-two-through-four-except-twelve-through-fourteen |||| everything-else"
75
+ answers =
76
+ ["everything-else"] * 1 +
77
+ ["ends-in-one-except-eleven"] * 1 +
78
+ ["ends-in-two-through-four-except-twelve-through-fourteen"] * 3 +
79
+ ["everything-else"] * 16 +
80
+ ["ends-in-one-except-eleven"] * 1 +
81
+ ["ends-in-two-through-four-except-twelve-through-fourteen"] * 3 +
82
+ ["everything-else"] * 1
83
+ test_choose(review_text, :ru, answers)
84
+ end
72
85
  end
73
86
 
74
87
  describe "degenerate choose" do
75
88
  it "should work if too few translated forms are given" do
76
89
  # One of the three Russian forms, the "everything else" form, is missing.
77
90
  # The fallback should be the first form, "ends in one except eleven".
78
- review_text = "%{smart_count} ends-in-one-except-eleven; %{smart_count} ends-in-two-through-four-except-twelve-through-fourteen"
91
+ review_text = "%{smart_count} ends-in-one-except-eleven |||| %{smart_count} ends-in-two-through-four-except-twelve-through-fourteen"
79
92
  answers =
80
93
  ["%{smart_count} ends-in-one-except-eleven"] * 1 +
81
94
  ["%{smart_count} ends-in-one-except-eleven"] * 1 +
@@ -88,8 +101,8 @@ describe Air18n::SmartCount do
88
101
  end
89
102
 
90
103
  it "should work with nil count" do
91
- review_text = "%{smart_count} ends-in-one-except-eleven; %{smart_count} ends-in-two-through-four-except-twelve-through-fourteen"
92
- Air18n::SmartCount::choose(review_text, :ru, nil).should == "%{smart_count} ends-in-one-except-eleven"
104
+ review_text = "%{smart_count} ends-in-one-except-eleven |||| %{smart_count} ends-in-two-through-four-except-twelve-through-fourteen"
105
+ Air18n::SmartCount::choose(review_text, :ru, nil).should == "%{smart_count} ends-in-one-except-eleven |||| %{smart_count} ends-in-two-through-four-except-twelve-through-fourteen"
93
106
  end
94
107
 
95
108
  it "should work with nil text" do
@@ -100,8 +113,8 @@ describe Air18n::SmartCount do
100
113
  describe 'hint' do
101
114
  it 'should work' do
102
115
  Air18n::SmartCount::hint('hi there', :pl).should be_nil
103
- Air18n::SmartCount::hint('%{smart_count} reviews', :pl).should ==
104
- "Must specify 3 forms separated by \";\": \"When count is 1; When count ends in 2-4, excluding 12-14 (2, 3, 4, 22, ...); Everything else (0, 5, 6, ...)\""
116
+ Air18n::SmartCount::hint('%{smart_count} review||||%{smart_count} reviews', :pl).should ==
117
+ "Must specify 3 forms separated by \"||||\": \"When count is 1 |||| When count ends in 2-4, excluding 12-14 (2, 3, 4, 22, ...) |||| Everything else (0, 5, 6, ...)\""
105
118
  Air18n::SmartCount::hint('%{smart_count} reviews', :ja).should be_nil
106
119
  end
107
120
  end
@@ -134,13 +147,25 @@ describe Air18n::SmartCount do
134
147
 
135
148
  describe "valid?" do
136
149
  it 'should work' do
137
- Air18n::SmartCount::valid?('%{smart_count} レビュー', :ja).should == { :valid => true }
138
- Air18n::SmartCount::valid?('%{smart_count} commentaire; %{smart_count} commentaires', :fr).should == { :valid => true }
139
- Air18n::SmartCount::valid?('%{smart_count} ends-in-one-except-eleven; %{smart_count} ends-in-two-through-four-except-twelve-through-fourteen; %{smart_count} everything-else', :pl).should == { :valid => true }
140
-
141
- Air18n::SmartCount::valid?('%{smart_count} a; %{smart_count} b; %{smart_count} c', :fr).should == {
150
+ Air18n::SmartCount::valid?(
151
+ '%{smart_count} review |||| %{smart_count} reviews',
152
+ '%{smart_count} レビュー',
153
+ :en, :ja).should == { :valid => true }
154
+ Air18n::SmartCount::valid?(
155
+ '%{smart_count} review |||| %{smart_count} reviews',
156
+ '%{smart_count} commentaire |||| %{smart_count} commentaires',
157
+ :en, :fr).should == { :valid => true }
158
+ Air18n::SmartCount::valid?(
159
+ '%{smart_count} review |||| %{smart_count} reviews',
160
+ '%{smart_count} ends-in-one-except-eleven |||| %{smart_count} ends-in-two-through-four-except-twelve-through-fourteen |||| %{smart_count} everything-else',
161
+ :en, :pl).should == { :valid => true }
162
+
163
+ Air18n::SmartCount::valid?(
164
+ '%{smart_count} a |||| %{smart_count} b',
165
+ '%{smart_count} a |||| %{smart_count} b |||| %{smart_count} c',
166
+ :en, :fr).should == {
142
167
  :valid => false,
143
- :reason => "Must specify 2 forms separated by \";\" (3 were specified)"
168
+ :reason => "Must specify 2 forms separated by \"||||\" (3 were specified)"
144
169
  }
145
170
  end
146
171
  end
@@ -45,14 +45,14 @@ describe Air18n::XssDetector do
45
45
 
46
46
  it "should work with smart count with one plural form" do
47
47
  Air18n::XssDetector::safe?(
48
- "<span class='count'>%{smart_count}</span> <span class='text'>review</span>;<span class='count'>%{smart_count}</span> <span class='text'>reviews</span>",
48
+ "<span class='count'>%{smart_count}</span> <span class='text'>review</span> |||| <span class='count'>%{smart_count}</span> <span class='text'>reviews</span>",
49
49
  "<span class='text'>レビュー</span> <span class='count'>%{smart_count}</span>",
50
50
  :en, :ja
51
51
  ).should == { :safe => true }
52
52
 
53
53
  # "spank" instead of "span" in the last tag.
54
54
  Air18n::XssDetector::safe?(
55
- "<span class='count'>%{smart_count}</span> <span class='text'>review</span>;<span class='count'>%{smart_count}</span> <span class='text'>reviews</span>",
55
+ "<span class='count'>%{smart_count}</span> <span class='text'>review</span> |||| <span class='count'>%{smart_count}</span> <span class='text'>reviews</span>",
56
56
  "<span class='text'>レビュー</span> <span class='count'>%{smart_count}</spank>",
57
57
  :en, :ja
58
58
  ).should == { :safe => false, :reason => "HTML tags don't match: [\"<span class='count'>\", \"</span>\", \"</span>\", \"<span class='text'>\"] vs. [\"<span class='text'>\", \"</span>\", \"<span class='count'>\", \"</spank>\"]" }
@@ -60,22 +60,22 @@ describe Air18n::XssDetector do
60
60
 
61
61
  it "should work with smart count with two plural forms" do
62
62
  Air18n::XssDetector::safe?(
63
- "<span class='count'>%{smart_count}</span> <span class='text'>review</span>;<span class='count'>%{smart_count}</span> <span class='text'>reviews</span>",
64
- "<span class='text'>commentaire</span> <span class='count'>%{smart_count}</span>;<span class='text'>commentaires</span> <span class='count'>%{smart_count}</span>",
63
+ "<span class='count'>%{smart_count}</span> <span class='text'>review</span> |||| <span class='count'>%{smart_count}</span> <span class='text'>reviews</span>",
64
+ "<span class='text'>commentaire</span> <span class='count'>%{smart_count}</span> |||| <span class='text'>commentaires</span> <span class='count'>%{smart_count}</span>",
65
65
  :en, :fr
66
66
  ).should == { :safe => true }
67
67
 
68
68
  # Second form not styled.
69
69
  Air18n::LoggingHelper.info "GRRRRR"
70
70
  Air18n::XssDetector::safe?(
71
- "<span class='count'>%{smart_count}</span> <span class='text'>review</span>;<span class='count'>%{smart_count}</span> <span class='text'>reviews</span>",
72
- "<span class='text'>commentaire</span> <span class='count'>%{smart_count}</span>;commentaires %{smart_count}",
71
+ "<span class='count'>%{smart_count}</span> <span class='text'>review</span> |||| <span class='count'>%{smart_count}</span> <span class='text'>reviews</span>",
72
+ "<span class='text'>commentaire</span> <span class='count'>%{smart_count}</span> |||| commentaires %{smart_count}",
73
73
  :en, :fr
74
74
  ).should == { :safe => false, :reason => "HTML tags don't match: [\"<span class='count'>\", \"</span>\", \"</span>\", \"<span class='text'>\"] vs. [\"</span>\"]" }
75
75
 
76
76
  # Only one form being given leads to the same error.
77
77
  Air18n::XssDetector::safe?(
78
- "<span class='count'>%{smart_count}</span> <span class='text'>review</span>;<span class='count'>%{smart_count}</span> <span class='text'>reviews</span>",
78
+ "<span class='count'>%{smart_count}</span> <span class='text'>review</span> |||| <span class='count'>%{smart_count}</span> <span class='text'>reviews</span>",
79
79
  "<span class='text'>commentaire</span> <span class='count'>%{smart_count}</span>",
80
80
  :en, :fr
81
81
  ).should == { :safe => false, :reason => "HTML tags don't match: [\"<span class='count'>\", \"</span>\", \"</span>\", \"<span class='text'>\"] vs. [\"</span>\"]" }
@@ -83,8 +83,8 @@ describe Air18n::XssDetector do
83
83
 
84
84
  it "should work with smart count with three plural forms" do
85
85
  Air18n::XssDetector::safe?(
86
- "<span class='count'>%{smart_count}</span> <span class='text'>review</span>;<span class='count'>%{smart_count}</span> <span class='text'>reviews</span>",
87
- "<span class='text'>ends-in-one-except-eleven</span> <span class='count'>%{smart_count}</span>;<span class='text'>ends-in-two-through-four-except-twelve-through-fourteen</span> <span class='count'>%{smart_count}</span>;<span class='text'>everything-else</span> <span class='count'>%{smart_count}</span>",
86
+ "<span class='count'>%{smart_count}</span> <span class='text'>review</span> |||| <span class='count'>%{smart_count}</span> <span class='text'>reviews</span>",
87
+ "<span class='text'>ends-in-one-except-eleven</span> <span class='count'>%{smart_count}</span> |||| <span class='text'>ends-in-two-through-four-except-twelve-through-fourteen</span> <span class='count'>%{smart_count}</span> |||| <span class='text'>everything-else</span> <span class='count'>%{smart_count}</span>",
88
88
  :en, :ru
89
89
  ).should == { :safe => true }
90
90
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: air18n
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.18
4
+ version: 0.1.19
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors: