i18n-inflector 2.1.0 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/docs/EXAMPLES CHANGED
@@ -11,21 +11,21 @@ This data will be used in any further example:
11
11
 
12
12
  @person:
13
13
  i: "i"
14
- you: "you"
14
+ u: "you"
15
15
  he: "he"
16
16
  she: "she"
17
17
  it: "it"
18
- u: @you
18
+ you: @u
19
19
 
20
20
  gender:
21
21
  m: "male"
22
22
  f: "female"
23
23
  n: "neuter"
24
- default: neuter
24
+ default: n
25
25
 
26
26
 
27
27
  welcome: "Dear @{f:Lady|m:Sir|n:You|All}!"
28
- sayit: "@person{i:I|u:You|he:He|she:She|it:It} @person{i:am|u:are|he,she,it:is}"
28
+ sayit: "@person{i:I|u:You|he:He|she:She|it:It}{ }{i:am|u:are|he,she,it:is}"
29
29
  tobe: "%{person} @person{i:am|u:are|he,she,it:is}"
30
30
 
31
31
 
@@ -49,7 +49,7 @@ This data will be used in any further example:
49
49
  }})
50
50
 
51
51
  I18n.backend.store_translations(:en, 'welcome' => 'Dear @{f:Lady|m:Sir|n:You|All}!')
52
- I18n.backend.store_translations(:en, 'sayit' => '@person{i:I|u:You|he:He|she:She|it:It} @person{i:am|u:are|he,she,it:is}')
52
+ I18n.backend.store_translations(:en, 'sayit' => '@person{i:I|u:You|he:He|she:She|it:It}{ }{i:am|u:are|he,she,it:is}')
53
53
  I18n.backend.store_translations(:en, 'tobe' => '%{person} @person{i:am|u:are|he,she,it:is}')
54
54
  I18n.locale = :en
55
55
 
@@ -141,13 +141,17 @@ Getting all known strict kinds:
141
141
 
142
142
  I18n.inflector.strict.kinds
143
143
  #=> [:person]
144
-
144
+
145
145
  Getting all known kinds for language 'pl':
146
146
 
147
147
  I18n.inflector.kinds(:pl)
148
148
  #=> []
149
-
150
- <i>to be continued…</i>
149
+
150
+ === Listing all known options
151
+
152
+ I18n.inflector.options.known
153
+ #=> [:inflector_cache_aware, :inflector_raises, :inflector_aliased_patterns,
154
+ # :inflector_unknown_defaults, :inflector_excluded_defaults]
151
155
 
152
156
  == Real-life example for Polish language
153
157
 
@@ -163,7 +167,7 @@ prefixes and suffixes of words we're able make our patterns compact.
163
167
  === YAML
164
168
 
165
169
  pl:
166
- are_you_sure: "@{m,f:Jesteś pew}@{m:ien|f:na}@{n:Na pewno}?"
170
+ are_you_sure: "@{m,f:Jesteś pew}{m:ien|f:na}{n:Na pewno}?"
167
171
 
168
172
  i18n:
169
173
  inflections:
@@ -173,27 +177,18 @@ prefixes and suffixes of words we're able make our patterns compact.
173
177
  n: "forma bezosobowa"
174
178
  masculine: @m
175
179
  facet: @m
176
- chłop: @m
177
180
  chłopak: @m
178
- chłopiec: @m
179
- mąż: @m
180
181
  feminine: @f
181
182
  pani: @f
182
183
  kobieta: @f
183
184
  k: @f
184
185
  dziewczyna: @f
185
- baba: @f
186
- babka: @f
187
- facetka: @f
188
186
  impersonal: @n
189
187
  default: n
190
-
191
-
192
-
193
-
188
+
194
189
  === Code
195
190
 
196
- # Using shorter form than YAML-listed
191
+ # Using shorter form than listed as YAML
197
192
 
198
193
  I18n.backend.store_translations(:pl, :i18n => { :inflections => { :gender =>
199
194
  { :f => 'f', :m=>'m', :n=>'n', :kobieta=>:@f, :facet => :@m, :default=>:n }}})
@@ -215,8 +210,102 @@ prefixes and suffixes of words we're able make our patterns compact.
215
210
  #=> "Na pewno?"
216
211
 
217
212
  # It would look like that without commas:
218
- I18n.backend.store_translations(:pl, :are_you_sure => "@{m:Jesteś pewien|f:Jesteś pewna}@{n:Na pewno}?")
213
+ I18n.backend.store_translations(:pl, :are_you_sure => "@{m:Jesteś pewien|f:Jesteś pewna|n:Na pewno}?")
219
214
 
220
215
  # That would also work but it's less readable.
221
216
  # PS: Have you ever configured Sendmail? ;-)
222
- I18n.backend.store_translations(:pl, :are_you_sure => "@{n:Na|m,f:Jesteś} pew@{m:ie}n@{f:a|n:o}?")
217
+ I18n.backend.store_translations(:pl, :are_you_sure => "@{n:Na|m,f:Jesteś}{ pew}{m:ie}{n}{f:a|n:o}?")
218
+
219
+ === Complex pattern usage
220
+
221
+ # Store needed translations
222
+ I18n.backend.store_translations(:pl,
223
+ :i18n => { :inflections => {
224
+ :@gender =>
225
+ { :f => 'f', :m => 'm', :n => 'n',
226
+ :kobieta => :@f, :facet => :@m, :default => :n },
227
+ :@tense =>
228
+ { :t => 'teraz', :w => 'przeszły', :j => 'przyszły',
229
+ :teraz => :@t, :wczoraj => :@w, :jutro => :@j,
230
+ :default => :t }
231
+ }})
232
+
233
+ I18n.backend.store_translations(:pl,
234
+ :msg_receive => "@gender+tense{n+w:Otrzymano|Dosta}{m,f,n+t:jesz|m,f,n+j:niesz|f+w:łaś|m+w:łeś} wiadomość")
235
+
236
+ I18n.locale = :pl
237
+
238
+ p I18n.translate('msg_receive', :gender => :kobieta)
239
+ #=> "Dostajesz wiadomość"
240
+
241
+ p I18n.translate('msg_receive', :gender => :facet)
242
+ #=> "Dostajesz wiadomość"
243
+
244
+ p I18n.translate('msg_receive')
245
+ #=> "Dostajesz wiadomość"
246
+
247
+ p I18n.translate('msg_receive', :gender => :kobieta, :tense => :wczoraj)
248
+ #=> "Dostałaś wiadomość"
249
+
250
+ p I18n.translate('msg_receive', :gender => :facet, :tense => :wczoraj)
251
+ #=> "Dostałeś wiadomość"
252
+
253
+ p I18n.translate('msg_receive', :tense => :jutro)
254
+ #=> "Dostaniesz wiadomość"
255
+
256
+ p I18n.translate('msg_receive', :tense => :wczoraj)
257
+ #=> "Otrzymano wiadomość"
258
+
259
+ ==== YAML for the example above
260
+
261
+ The example above may use this YAML content instead of +store_translations+:
262
+
263
+ pl:
264
+ msg_receive: "@gender+tense{n+w:Otrzymano|Dosta}{m,f,n+t:jesz|m,f,n+j:niesz|f+w:łaś|m+w:łeś} wiadomość"
265
+
266
+ i18n:
267
+ inflections:
268
+ @gender:
269
+ m: 'male'
270
+ f: 'female'
271
+ n: 'neuter'
272
+ kobieta: @f
273
+ facet: @m
274
+ default: n
275
+ @tense:
276
+ t: 'teraźniejszy'
277
+ w: 'przeszły'
278
+ j: 'przyszły'
279
+ teraz: @t
280
+ wczoraj: @w
281
+ jutro: @j
282
+ default: @t
283
+
284
+ ===== Alternative for +msg_receive+ key
285
+
286
+ The +msg_receive+ might also be expressed using two infleciton keys:
287
+
288
+ pl:
289
+ @msg_receive_1:
290
+ @kind: gender+tense
291
+ @free: 'Dosta'
292
+ n+w: 'Otrzymano'
293
+
294
+ @msg_receive_2:
295
+ @kind: gender+tense
296
+ @suffix: " wiadomość"
297
+ m,f,n+t: "jesz"
298
+ m,f,n+j: "niesz"
299
+ f+w: "łaś"
300
+ m+w: "łeś"
301
+
302
+ But then you have to change the translation call too, e.g.:
303
+
304
+ p I18n.translate(['@msg_receive_1','@msg_receive_2'], :gender => :kobieta).join
305
+ #=> "Dostajesz wiadomość"
306
+
307
+ The split is necessary because we have two patterns here and no way to express them
308
+ as one inflection key.
309
+
310
+ <i>to be continued…</i>
311
+
data/docs/HISTORY CHANGED
@@ -1,3 +1,40 @@
1
+ === 2.2.0 / 2011-02-09
2
+
3
+ * major enhancements
4
+
5
+ * Added loud tokens support
6
+ * Added complex patterns support
7
+ * Added key-based inflection support
8
+ * Added :cache_aware switch
9
+ * Improved validation of token and kind identifiers
10
+
11
+ * minor enhancements
12
+
13
+ * Refactored error reporting code
14
+ * Refactored options gathering code
15
+ * Removed magic symbols and strings
16
+ * Removed intermediate array from LazyHashEnumerator#to_h
17
+ * Added multiple patterns support (syntactic sugar)
18
+ * Added I18n::Inflector::Config module
19
+ * Added I18n::Inflector::LazyArrayEnumerator class
20
+ * Added I18n::Inflector::HSet class for keeping collections of data
21
+ * Added error classes: I18n::InvalidInflectionOption and I18n::InvalidInflectionKind
22
+ * Interpolation method moved to I18n::Inflector::Interpolate module
23
+ * All inflection related exceptions now have the attribute "key" containing key name
24
+
25
+ * major bugfixes
26
+
27
+ * Fixed handling of missing inflection option when :inflector_raises is set
28
+
29
+ * minor bugfixes
30
+
31
+ * Fixed interpolation when :excluded_defaults is on and a kind is strict
32
+ * Fixed interpolation when pattern is escaped and locale is not inflected
33
+ * Enabled filtering of reserved names in options
34
+ * Enabled filtering of inflection options for options that go to original translate method
35
+ * Updated documentation in a section describing options
36
+ * Fixed some examples
37
+
1
38
  === 2.1.0 / 2011-01-27
2
39
 
3
40
  * major enhancements
data/docs/TODO CHANGED
@@ -1,31 +1,7 @@
1
1
  == Near future
2
2
 
3
- * do something with that to_h that creates intermediate array
4
-
5
- * add a switch that causes inflection arguments to be gathered and removed before using original
6
- version of translate and then injected when interpolating happens (default value
7
- for that switch should be true if there is I18n version 4 installed)
8
-
9
- - not so good idea to turn it on by default since the same variable may be used to interpolate
10
- inflections and for direct interpolation
11
-
12
- * attach inflection key name to some raised errors
13
-
14
- * add some external iterators for tokens, aliases, kinds, true_tokens
15
-
16
- * allow different descriptions for aliases pointing to the same token, e.g.: now: @present ="description"
17
-
18
3
  == Distant future
19
4
 
20
- * Loud tokens: description substitution, e.g.: "Dear @{u|i:me}" gives "Dear You" if u is described as "You"
21
-
22
- * Combined patterns (!!!!!!!!!!!!)
23
-
24
- - @person+time{i+now:am|i+past:was}
25
- - @person+time{i+now:am|i+past:was|he,she,it+now:is}
26
- - @g_sender+g_receiver{...} - for Hebrew for example
27
-
28
- * case-insensitivity switch for inflection options (?)
29
-
30
- * think about allowing negative matches to be AND-ed, e.g.: !m&!f:impersonal (?)
31
- - that will double positive-matching syntax, and make it even less KISS
5
+ * add "any token" operator - will make it easier to create complex patterns - (use negative matching to non-existant, reserved value)
6
+ * split interpolate_core and make it more reusable by raw data (e.g. pattern content)
7
+ * allow different descriptions for aliases pointing to the same token, e.g.: now: @present ="description"
@@ -44,6 +44,8 @@ module I18n
44
44
  # @api public
45
45
  class API < API_Strict
46
46
 
47
+ include I18n::Inflector::Interpolate
48
+
47
49
  # Options controlling the engine.
48
50
  #
49
51
  # @api public
@@ -64,6 +66,11 @@ module I18n
64
66
  # I18n.translate('welcome', :inflector_raises => true)
65
67
  attr_reader :options
66
68
 
69
+ # @private
70
+ def config
71
+ I18n::Inflector::Config
72
+ end
73
+
67
74
  # @private
68
75
  def strict
69
76
  @strict ||= I18n::Inflector::API_Strict.new(@idb_strict, @options)
@@ -184,7 +191,7 @@ module I18n
184
191
  # @note If +kind+ begins with the +@+ symbol then the variant of this method
185
192
  # operating on strict kinds will be called ({I18n::Inflector::API_Strict#inflected_locales})
186
193
  def inflected_locales(kind=nil)
187
- if kind.to_s[0..0] == NAMED_MARKER
194
+ if kind.to_s[0..0] == Markers::PATTERN
188
195
  strict.inflected_locales(kind.to_s[1..-1])
189
196
  else
190
197
  (super + strict.inflected_locales(kind)).uniq
@@ -209,7 +216,7 @@ module I18n
209
216
  # @param [Symbol] locale the locale identifier
210
217
  # @return [Boolean] +true+ if the given +kind+ exists, +false+ otherwise
211
218
  def has_kind?(kind, locale=nil)
212
- if kind.to_s[0..0] == NAMED_MARKER
219
+ if kind.to_s[0..0] == Markers::PATTERN
213
220
  return strict.has_kind?(kind.to_s[1..-1], locale)
214
221
  end
215
222
  super
@@ -235,7 +242,7 @@ module I18n
235
242
  # there is no default token
236
243
  def default_token(kind, locale=nil)
237
244
  return nil if (kind.nil? || kind.to_s.empty?)
238
- if kind.to_s[0..0] == NAMED_MARKER
245
+ if kind.to_s[0..0] == Markers::PATTERN
239
246
  return strict.default_token(kind.to_s[1..-1], locale)
240
247
  end
241
248
  super
@@ -278,7 +285,7 @@ module I18n
278
285
  unless kind.nil?
279
286
  kind = kind.to_s
280
287
  reutrn false if kind.empty?
281
- if kind[0..0] == NAMED_MARKER
288
+ if kind[0..0] == Markers::PATTERN
282
289
  return strict.has_alias?(token, kind[1..-1], locale)
283
290
  end
284
291
  kind = kind.to_sym
@@ -324,7 +331,7 @@ module I18n
324
331
  unless kind.nil?
325
332
  kind = kind.to_s
326
333
  return false if kind.empty?
327
- if kind[0..0] == NAMED_MARKER
334
+ if kind[0..0] == Markers::PATTERN
328
335
  return strict.has_true_token?(token, kind[1..-1], locale)
329
336
  end
330
337
  kind = kind.to_sym
@@ -370,7 +377,7 @@ module I18n
370
377
  unless kind.nil?
371
378
  kind = kind.to_s
372
379
  return false if kind.empty?
373
- if kind[0..0] == NAMED_MARKER
380
+ if kind[0..0] == Markers::PATTERN
374
381
  return strict.has_token?(token, kind[1..-1], locale)
375
382
  end
376
383
  kind = kind.to_sym
@@ -420,7 +427,7 @@ module I18n
420
427
  unless kind.nil?
421
428
  kind = kind.to_s
422
429
  return nil if kind.empty?
423
- if kind[0..0] == NAMED_MARKER
430
+ if kind[0..0] == Markers::PATTERN
424
431
  return strict.true_token(token, kind[1..-1], locale)
425
432
  end
426
433
  kind = kind.to_sym
@@ -465,7 +472,7 @@ module I18n
465
472
  unless kind.nil?
466
473
  kind = kind.to_s
467
474
  return nil if kind.empty?
468
- if kind[0..0] == NAMED_MARKER
475
+ if kind[0..0] == Markers::PATTERN
469
476
  return strict.kind(token, kind[1..-1], locale)
470
477
  end
471
478
  kind = kind.to_sym
@@ -507,7 +514,7 @@ module I18n
507
514
  unless kind.nil?
508
515
  kind = kind.to_s
509
516
  return {} if kind.empty?
510
- if kind[0..0] == NAMED_MARKER
517
+ if kind[0..0] == Markers::PATTERN
511
518
  return strict.tokens(kind[1..-1], locale)
512
519
  end
513
520
  kind = kind.to_sym
@@ -548,7 +555,7 @@ module I18n
548
555
  unless kind.nil?
549
556
  kind = kind.to_s
550
557
  return {} if kind.empty?
551
- if kind[0..0] == NAMED_MARKER
558
+ if kind[0..0] == Markers::PATTERN
552
559
  return strict.tokens_raw(kind[1..-1], locale)
553
560
  end
554
561
  kind = kind.to_sym
@@ -586,7 +593,7 @@ module I18n
586
593
  unless kind.nil?
587
594
  kind = kind.to_s
588
595
  return {} if kind.empty?
589
- if kind[0..0] == NAMED_MARKER
596
+ if kind[0..0] == Markers::PATTERN
590
597
  return strict.tokens_true(kind[1..-1], locale)
591
598
  end
592
599
  kind = kind.to_sym
@@ -620,7 +627,7 @@ module I18n
620
627
  unless kind.nil?
621
628
  kind = kind.to_s
622
629
  return nil if kind.empty?
623
- if kind[0..0] == NAMED_MARKER
630
+ if kind[0..0] == Markers::PATTERN
624
631
  return strict.aliases(kind[1..-1], locale)
625
632
  end
626
633
  kind = kind.to_sym
@@ -672,7 +679,7 @@ module I18n
672
679
  unless kind.nil?
673
680
  kind = kind.to_s
674
681
  return nil if kind.empty?
675
- if kind[0..0] == NAMED_MARKER
682
+ if kind[0..0] == Markers::PATTERN
676
683
  return strict.token_description(token, kind[1..-1], locale)
677
684
  end
678
685
  kind = kind.to_sym
@@ -680,225 +687,6 @@ module I18n
680
687
  data_safe(locale).get_description(token.to_sym, kind)
681
688
  end
682
689
 
683
- # Interpolates inflection values in the given +string+
684
- # using kinds given in +options+ and a matching tokens.
685
- #
686
- # @param [String] string the translation string
687
- # containing patterns to interpolate
688
- # @param [String,Symbol] locale the locale identifier
689
- # @param [Hash] options the options
690
- # @option options [Boolean] :inflector_excluded_defaults (false) local switch
691
- # that overrides global setting (see: {I18n::Inflector::InflectionOptions#excluded_defaults})
692
- # @option options [Boolean] :inflector_unknown_defaults (true) local switch
693
- # that overrides global setting (see: {I18n::Inflector::InflectionOptions#unknown_defaults})
694
- # @option options [Boolean] :inflector_raises (false) local switch
695
- # that overrides global setting (see: {I18n::Inflector::InflectionOptions#raises})
696
- # @option options [Boolean] :inflector_aliased_patterns (false) local switch
697
- # that overrides global setting (see: {I18n::Inflector::InflectionOptions#aliased_patterns})
698
- # @return [String] the string with interpolated patterns
699
- def interpolate(string, locale, options = {})
700
- used_kinds = options.except(*INFLECTOR_RESERVED_KEYS)
701
- sw, op = @options, options
702
- raises = (s=op.delete :inflector_raises).nil? ? sw.raises : s
703
- aliased_patterns = (s=op.delete :inflector_aliased_patterns).nil? ? sw.aliased_patterns : s
704
- unknown_defaults = (s=op.delete :inflector_unknown_defaults).nil? ? sw.unknown_defaults : s
705
- excluded_defaults = (s=op.delete :inflector_excluded_defaults).nil? ? sw.excluded_defaults : s
706
-
707
- idb = @idb[locale]
708
- idb_strict = @idb_strict[locale]
709
-
710
- string.gsub(PATTERN) do
711
- pattern_fix = $1
712
- strict_kind = $2
713
- pattern_content = $3
714
- ext_pattern = $&
715
- ext_value = nil
716
- ext_freetext = ''
717
- found = false
718
- parsed_default_v= nil
719
-
720
- # leave escaped pattern as-is
721
- unless pattern_fix.empty?
722
- ext_pattern = ext_pattern[1..-1]
723
- next ext_pattern if ESCAPES[pattern_fix]
724
- end
725
-
726
- # set parsed kind if strict kind is given (named pattern is parsed)
727
- if strict_kind.empty?
728
- parsed_symbol = nil
729
- strict_kind = nil
730
- parsed_kind = nil
731
- default_token = nil
732
- subdb = idb
733
- else
734
- parsed_symbol = (NAMED_MARKER + strict_kind).to_sym
735
- strict_kind = strict_kind.to_sym
736
- parsed_kind = strict_kind
737
- subdb = idb_strict
738
- default_token = subdb.get_default_token(parsed_kind)
739
- end
740
-
741
- # process pattern content's
742
- pattern_content.scan(TOKENS) do
743
- ext_token = $1.to_s
744
- ext_value = $2.to_s
745
- ext_freetext = $3.to_s
746
- tokens = Hash.new(false)
747
- negatives = Hash.new(false)
748
- kind = nil
749
- option = nil
750
-
751
- # token not found?
752
- if ext_token.empty?
753
- # free text not found too? that should never happend.
754
- if ext_freetext.empty?
755
- raise I18n::InvalidInflectionToken.new(ext_pattern, ext_token) if raises
756
- end
757
- next
758
- end
759
-
760
- # split tokens if comma is present and put into fast list
761
- ext_token.split(OPERATOR_MULTI).each do |t|
762
- # token name corrupted
763
- if t.empty?
764
- raise I18n::InvalidInflectionToken.new(ext_pattern, t) if raises
765
- next
766
- end
767
-
768
- # mark negative-matching tokens and put them to negatives fast list
769
- if t[0..0] == OPERATOR_NOT
770
- t = t[1..-1]
771
- if t.empty?
772
- raise I18n::InvalidInflectionToken.new(ext_pattern, t) if raises
773
- next
774
- end
775
- t = t.to_sym
776
- t = subdb.get_true_token(t, strict_kind) if aliased_patterns
777
- negatives[t] = true
778
- end
779
-
780
- t = t.to_sym
781
- t = subdb.get_true_token(t, strict_kind) if aliased_patterns
782
-
783
- # get kind for that token
784
- kind = subdb.get_kind(t, strict_kind)
785
- if kind.nil?
786
- raise I18n::InvalidInflectionToken.new(ext_pattern, t) if raises
787
- next
788
- end
789
-
790
- # set processed kind after matching first token in a pattern
791
- if parsed_kind.nil?
792
- parsed_kind = kind
793
- parsed_symbol = kind.to_sym
794
- default_token = subdb.get_default_token(parsed_kind)
795
- elsif parsed_kind != kind
796
- # tokens of different kinds in one regular (not named) pattern are prohibited
797
- if raises
798
- raise I18n::MisplacedInflectionToken.new(ext_pattern, t, parsed_symbol)
799
- end
800
- next
801
- end
802
-
803
- # use that token
804
- tokens[t] = true unless negatives[t]
805
- end
806
-
807
- # self-explanatory
808
- if (tokens.empty? && negatives.empty?)
809
- raise I18n::InvalidInflectionToken.new(ext_pattern, ext_token) if raises
810
- end
811
-
812
- # try @-style option for strict kind, fallback to regular if not found
813
- # and memorize option name for error reporting
814
- oname = !strict_kind.nil? && options.has_key?(parsed_symbol) ?
815
- parsed_symbol : (options.has_key?(kind) ? kind : nil)
816
-
817
- # Get option if possible and memorize for error reporting;
818
- # fallback to default token if option still not found
819
- if oname.nil?
820
- option = default_token
821
- orig_option = nil
822
- else
823
- option = options[oname]
824
- orig_option = option
825
- end
826
-
827
- if (option.nil? || option.to_s.empty?)
828
- # if option is given but is unknown, empty or nil
829
- # then use default option for a kind if unknown_defaults is switched on
830
- option = unknown_defaults ? default_token : nil
831
- else
832
- # validate option and if it's unknown try in aliases
833
- option = subdb.get_true_token(option.to_sym, strict_kind)
834
-
835
- # if still nothing then fall back to default value
836
- # for a kind if unknown_defaults switch is on
837
- if option.nil?
838
- option = unknown_defaults ? default_token : nil
839
- end
840
- end
841
-
842
- # if the option is still unknown or bad
843
- # raise an exception
844
- if option.nil?
845
- if raises
846
- if oname.nil?
847
- ex = InflectionOptionNotFound
848
- oname = parsed_symbol
849
- orig_option = nil
850
- else
851
- ex = InflectionOptionIncorrect
852
- end
853
- raise ex.new(ext_pattern, oname, ext_token, orig_option)
854
- end
855
- next
856
- end
857
-
858
- # memorize default value for further processing
859
- # outside this block if excluded_defaults switch is on
860
- parsed_default_v = ext_value if (excluded_defaults && !default_token.nil?)
861
-
862
- # throw the value if the given option matches one of the tokens from group
863
- # or negatively matches one of the negated tokens
864
- case negatives.count
865
- when 0 then next unless tokens[option]
866
- when 1 then next if negatives[option]
867
- end
868
-
869
- # skip further evaluation of the pattern
870
- # since the right token has been found
871
- found = true
872
- break
873
-
874
- end # single token (or a group) processing
875
-
876
- result = nil
877
-
878
- # return value of a token that matches option's value
879
- # given for a kind or try to return a free text
880
- # if it's present
881
- if found
882
- result = ext_value
883
- elsif (excluded_defaults && !parsed_kind.nil?)
884
- # if there is excluded_defaults switch turned on
885
- # and a correct token was found in an inflection option but
886
- # has not been found in a pattern then interpolate
887
- # the pattern with a value picked for the default
888
- # token for that kind if a default token was present
889
- # in a pattern
890
- kind = nil
891
- token = options[parsed_kind]
892
- kind = subdb.get_kind(token)
893
- result = parsed_default_v unless kind.nil?
894
- end
895
-
896
- pattern_fix + (result || ext_freetext)
897
-
898
- end # single pattern processing
899
-
900
- end
901
-
902
690
  protected
903
691
 
904
692
  # @private
@@ -947,9 +735,9 @@ module I18n
947
735
  def tkl_args(args)
948
736
  token, kind, locale = case args.count
949
737
  when 1 then [args[0], nil, nil]
950
- when 2 then args[1].to_s[0..0] == NAMED_MARKER ? [args[0], args[1], nil] : [args[0], nil, args[1]]
738
+ when 2 then args[1].to_s[0..0] == Markers::PATTERN ? [args[0], args[1], nil] : [args[0], nil, args[1]]
951
739
  when 3 then args
952
- else raise ArgumentError.new("wrong number of arguments: #{args.count} for (1..3)")
740
+ else raise I18n::ArgumentError.new("wrong number of arguments: #{args.count} for (1..3)")
953
741
  end
954
742
  [token,kind,locale]
955
743
  end
@@ -491,7 +491,7 @@ module I18n
491
491
  when 1 then [args[0], nil, nil]
492
492
  when 2 then [args[0], args[1], nil]
493
493
  when 3 then args
494
- else raise ArgumentError.new("wrong number of arguments: #{args.count} for (1..3)")
494
+ else raise I18n::ArgumentError.new("wrong number of arguments: #{args.count} for (1..3)")
495
495
  end
496
496
  token = token.nil? || token.to_s.empty? ? nil : token.to_sym
497
497
  kind = kind.nil? || kind.to_s.empty? ? nil : kind.to_sym