openstreetmap-website/lib/locale.rb
2020-08-06 22:27:30 +01:00

54 lines
1.5 KiB
Ruby

class Locale < I18n::Locale::Tag::Rfc4646
class List < Array
attr_reader :locales
def initialize(tags)
super(tags.map { |tag| Locale.tag(tag) }).compact!
end
def candidates(preferred)
preferred.expand & self
end
def preferred(preferred, options = { :default => Locale.default })
candidates(preferred).first || options[:default]
end
def expand
List.new(reverse.each_with_object([]) do |locale, expanded|
locale.candidates.uniq.reverse_each do |candidate|
expanded << candidate if candidate == locale || expanded.exclude?(candidate)
end
end.reverse.uniq)
end
end
def self.list(*tags)
List.new(tags.flatten)
end
def self.default
tag(I18n.default_locale)
end
def self.available
@available ||= List.new(I18n.available_locales).reject!(&:invalid?)
end
def invalid?
I18n.t("activerecord.models.acl", :locale => self, :fallback => false, :raise => true).nil?
rescue I18n::MissingTranslationData
true
end
def candidates
List.new([self.class.new(language, script, region, variant),
self.class.new(language, script, region),
self.class.new(language, script, nil, variant),
self.class.new(language, script),
self.class.new(language, nil, region, variant),
self.class.new(language, nil, region),
self.class.new(language, nil, nil, variant),
self.class.new(language)])
end
end