]> git.openstreetmap.org Git - rails.git/blob - lib/locale.rb
Merge pull request #4803 from tomhughes/preference-encoding
[rails.git] / lib / locale.rb
1 class Locale < I18n::Locale::Tag::Rfc4646
2   class List < Array
3     attr_reader :locales
4
5     def initialize(tags)
6       super(tags.map { |tag| Locale.tag(tag) }).compact!
7     end
8
9     def candidates(preferred)
10       preferred.expand & self
11     end
12
13     def preferred(preferred, options = { :default => Locale.default })
14       candidates(preferred).first || options[:default]
15     end
16
17     def expand
18       List.new(reverse.each_with_object([]) do |locale, expanded|
19                  locale.candidates.uniq.reverse_each do |candidate|
20                    expanded << candidate if candidate == locale || expanded.exclude?(candidate)
21                  end
22                end.reverse.uniq)
23     end
24   end
25
26   def self.list(*tags)
27     List.new(tags.flatten)
28   end
29
30   def self.default
31     tag(I18n.default_locale)
32   end
33
34   def self.available
35     @available ||= List.new(I18n.available_locales).reject!(&:invalid?)
36   end
37
38   def invalid?
39     I18n.t("activerecord.models.acl", :locale => self, :fallback => false, :raise => true).nil?
40   rescue I18n::MissingTranslationData
41     true
42   end
43
44   def candidates
45     List.new([self.class.new(language, script, region, variant),
46               self.class.new(language, script, region),
47               self.class.new(language, script, nil, variant),
48               self.class.new(language, script),
49               self.class.new(language, nil, region, variant),
50               self.class.new(language, nil, region),
51               self.class.new(language, nil, nil, variant),
52               self.class.new(language)])
53   end
54 end