Sha256: 64e80b538533f4c779bd6b8918b5fa25a8d38cf4f42f4243e9cc21a49c91d287

Contents?: true

Size: 1.55 KB

Versions: 45

Compression:

Stored size: 1.55 KB

Contents

# frozen_string_literal: true

module Worldwide
  module Cldr
    class Fallbacks < Hash
      def initialize
        super
        @all_ancestors_computed = false
        @map = {}
      end

      def [](locale)
        locale = locale.to_sym
        super || store(locale, ancestry(locale))
      end

      def descendants(locale)
        compute_all_ancestors
        self.select { |_loc, loc_ancestors| loc_ancestors.include?(locale.to_sym) }.keys
      end

      def defined_parent_locales
        @defined_parent_locales ||= cldr_defined_parents.values.uniq
      end

      private

      def cldr_defined_parents
        @cldr_defined_parents ||= YAML.load_file(File.join(Worldwide::Paths::CLDR_ROOT, "parent_locales.yml")).to_h { |k, v| [k.to_sym, v.to_sym] }
      end

      def ancestry(locale)
        ancestors = [locale]
        loop do
          if cldr_defined_parents[ancestors.last]
            ancestors << cldr_defined_parents[ancestors.last]
          elsif I18n::Locale::Tag.tag(ancestors.last).parents.count > 0
            ancestors << I18n::Locale::Tag.tag(ancestors.last).parents.first.to_sym
          else
            break
          end
        end
        ancestors << :root unless ancestors.last == :root
        ancestors
      end

      # Walk through all known locales, calculating their ancestry, and caching the results
      def compute_all_ancestors
        return if @all_ancestors_computed

        Worldwide::Locales.known.each do |locale|
          self[locale]
        end

        @all_ancestors_computed = true
      end
    end
  end
end

Version data entries

45 entries across 45 versions & 1 rubygems

Version Path
worldwide-1.8.0 lib/worldwide/cldr/fallbacks.rb
worldwide-1.7.5 lib/worldwide/cldr/fallbacks.rb
worldwide-1.7.4 lib/worldwide/cldr/fallbacks.rb
worldwide-1.7.3 lib/worldwide/cldr/fallbacks.rb
worldwide-1.7.2 lib/worldwide/cldr/fallbacks.rb
worldwide-1.7.1 lib/worldwide/cldr/fallbacks.rb
worldwide-1.7.0 lib/worldwide/cldr/fallbacks.rb
worldwide-1.6.2 lib/worldwide/cldr/fallbacks.rb
worldwide-1.6.1 lib/worldwide/cldr/fallbacks.rb
worldwide-1.6.0 lib/worldwide/cldr/fallbacks.rb
worldwide-1.5.0 lib/worldwide/cldr/fallbacks.rb
worldwide-1.4.1 lib/worldwide/cldr/fallbacks.rb
worldwide-1.4.0 lib/worldwide/cldr/fallbacks.rb
worldwide-1.3.1 lib/worldwide/cldr/fallbacks.rb
worldwide-1.3.0 lib/worldwide/cldr/fallbacks.rb
worldwide-1.2.0 lib/worldwide/cldr/fallbacks.rb
worldwide-1.1.0 lib/worldwide/cldr/fallbacks.rb
worldwide-1.0.0 lib/worldwide/cldr/fallbacks.rb
worldwide-0.15.0 lib/worldwide/cldr/fallbacks.rb
worldwide-0.14.0 lib/worldwide/cldr/fallbacks.rb