Sha256: bb6f05f99dc33807f25a89cedf3f197d7dd440a6609df6e595c99ecce3d616f1

Contents?: true

Size: 1.94 KB

Versions: 14

Compression:

Stored size: 1.94 KB

Contents

# frozen_string_literal: true

module Decidim
  module TermCustomizer
    class TranslationStore
      def initialize(hash)
        @values = flat_hash(hash || {})
      end

      def term(key)
        @values[key]
      end

      def by_key(search)
        @values.select do |key|
          includes_string?(key, search, case_sensitive: true)
        end
      end

      def by_term(search, case_sensitive: false)
        @values.select do |_key, term|
          includes_string?(term, search, case_sensitive: case_sensitive)
        end
      end

      private

      def includes_string?(source, search, case_sensitive: false)
        return source.include?(search) if case_sensitive

        source.downcase.include?(search.downcase)
      end

      def flat_hash(hash)
        hash.each_with_object({}) do |(k, v), h|
          if v.is_a? Hash
            flat_hash(v).map do |h_k, h_v|
              append_to_hash(h, "#{k}.#{h_k}", h_v)
            end
          else
            append_to_hash(h, k.to_s, v)
          end
        end
      end

      def append_to_hash(hash, key, value)
        # Specific translations have a proc value but in our context these
        # translations are not interesting. An example of such translation is
        # `i18n.plural.rule` which takes in an integer when called and returns
        # either `:one` or `:other` depending on the integer's value.
        return if value.is_a?(Proc)

        # Some translation values are symbols which are also not interesting in
        # our context. Example of such translation is `i18n.plural.rule` which
        # has a value of `[:one, :other]`.
        return if value.is_a?(Symbol)

        # Exclude the faker translations.
        return if key =~ /^faker\./

        if value.is_a?(Array)
          value.each_with_index do |v, i|
            append_to_hash(hash, "#{key}.#{i}", v)
          end
        else
          hash[key] = value.to_s
        end
      end
    end
  end
end

Version data entries

14 entries across 14 versions & 1 rubygems

Version Path
decidim-term_customizer-0.23.0 lib/decidim/term_customizer/translation_store.rb
decidim-term_customizer-0.22.0 lib/decidim/term_customizer/translation_store.rb
decidim-term_customizer-0.21.0 lib/decidim/term_customizer/translation_store.rb
decidim-term_customizer-0.20.0 lib/decidim/term_customizer/translation_store.rb
decidim-term_customizer-0.19.1 lib/decidim/term_customizer/translation_store.rb
decidim-term_customizer-0.19.0 lib/decidim/term_customizer/translation_store.rb
decidim-term_customizer-0.18.0 lib/decidim/term_customizer/translation_store.rb
decidim-term_customizer-0.17.1 lib/decidim/term_customizer/translation_store.rb
decidim-term_customizer-0.17.0 lib/decidim/term_customizer/translation_store.rb
decidim-term_customizer-0.16.6 lib/decidim/term_customizer/translation_store.rb
decidim-term_customizer-0.16.5 lib/decidim/term_customizer/translation_store.rb
decidim-term_customizer-0.16.3 lib/decidim/term_customizer/translation_store.rb
decidim-term_customizer-0.16.2 lib/decidim/term_customizer/translation_store.rb
decidim-term_customizer-0.16.1 lib/decidim/term_customizer/translation_store.rb