X-Git-Url: https://git.openstreetmap.org./rails.git/blobdiff_plain/4028f4cdb91f616bc774dc9b9fa8c7183eb1f6dd..6aded887ee383b976393c88b454d3beb7a72deee:/lib/locale.rb diff --git a/lib/locale.rb b/lib/locale.rb index bb09ae327..5931301b5 100644 --- a/lib/locale.rb +++ b/lib/locale.rb @@ -3,19 +3,23 @@ class Locale < I18n::Locale::Tag::Rfc4646 attr_reader :locales def initialize(tags) - super(tags.map { |tag| Locale.tag(tag) }) + super(tags.map { |tag| Locale.tag(tag) }).compact! end def candidates(preferred) preferred.expand & self end - def preferred(preferred) - candidates(preferred).first + def preferred(preferred, options = { :default => Locale.default }) + candidates(preferred).first || options[:default] end def expand - map(&:candidates).flatten.uniq << Locale.default + 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 @@ -28,17 +32,23 @@ class Locale < I18n::Locale::Tag::Rfc4646 end def self.available - @available ||= List.new(I18n.available_locales) + @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 - [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)] + 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