Sha256: 768017eb933366995b2952c3fd564706e7c504a8dc3d7ae6d1492cba1be6d879

Contents?: true

Size: 1.4 KB

Versions: 1

Compression:

Stored size: 1.4 KB

Contents

# coding: utf-8
require 'i18n/tasks/data/router/pattern_router'

module I18n::Tasks
  module Data::Router
    # Keep the path, or infer from base locale
    class ConservativeRouter < PatternRouter
      def initialize(adapter, config)
        @adapter       = adapter
        @base_locale   = config[:base_locale]
        super
      end

      def route(locale, forest, &block)
        return to_enum(:route, locale, forest) unless block
        out = {}
        not_found = Set.new
        forest.keys do |key, node|
          locale_key = "#{locale}.#{key}"
          path = adapter[locale][locale_key].try(:data).try(:[], :path)

          # infer from base
          unless path
            path = base_tree["#{base_locale}.#{key}"].try(:data).try(:[], :path)
            path = path.try :sub, /(^|[\/.])#{base_locale}(?=\.)/, "\\1#{locale}"
          end

          if path
            (out[path] ||= Set.new) << locale_key
          else
            not_found << locale_key
          end
        end
        out.each do |dest, keys|
          block.yield dest, forest.select_keys(root: true) { |key, _| keys.include?(key) }
        end
        if not_found.present?
          super(locale, forest.select_keys(root: true) { |key, _| not_found.include?(key) }, &block)
        end
      end

      protected

      def base_tree
        adapter[base_locale]
      end

      attr_reader :adapter, :base_locale
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
i18n-tasks-0.5.0 lib/i18n/tasks/data/router/conservative_router.rb