class Dry::Schema::Messages::I18n

I18n message backend

@api public

Attributes

t[R]

Translation function

@return [Method]

Public Class Methods

new() click to toggle source

@api private

Calls superclass method
# File lib/dry/schema/messages/i18n.rb, line 18
def initialize
  super
  @t = I18n.method(:t)
end

Public Instance Methods

default_locale() click to toggle source

@api private

# File lib/dry/schema/messages/i18n.rb, line 72
def default_locale
  super || I18n.locale || I18n.default_locale
end
get(key, options = EMPTY_HASH) click to toggle source

Get a message for the given key and its options

@param [Symbol] key @param [Hash] options

@return [String]

@api public

# File lib/dry/schema/messages/i18n.rb, line 31
def get(key, options = EMPTY_HASH)
  return unless key

  result = t.(key, locale: options.fetch(:locale, default_locale))

  if result.is_a?(Hash)
    text = result[:text]
    meta = result.dup.tap { |h| h.delete(:text) }
  else
    text = result
    meta = EMPTY_HASH.dup
  end

  {
    text: text,
    meta: meta
  }
end
interpolatable_data(_key, _options, **data) click to toggle source

@api private

# File lib/dry/schema/messages/i18n.rb, line 98
def interpolatable_data(_key, _options, **data)
  data
end
interpolate(key, options, **data) click to toggle source

@api private

# File lib/dry/schema/messages/i18n.rb, line 103
def interpolate(key, options, **data)
  text_key = "#{key}.text"

  opts = {
    locale: default_locale,
    **options,
    **data
  }

  resolved_key = key?(text_key, opts) ? text_key : key

  t.(resolved_key, **opts)
end
key?(key, options) click to toggle source

Check if given key is defined

@return [Boolean]

@api public

# File lib/dry/schema/messages/i18n.rb, line 55
def key?(key, options)
  I18n.exists?(key, options.fetch(:locale, default_locale)) ||
    I18n.exists?(key, I18n.default_locale)
end
merge(paths) click to toggle source

Merge messages from an additional path

@param [String, Array<String>] paths

@return [Messages::I18n]

@api public

# File lib/dry/schema/messages/i18n.rb, line 67
def merge(paths)
  prepare(paths)
end
prepare(paths = config.load_paths) click to toggle source

@api private

# File lib/dry/schema/messages/i18n.rb, line 77
def prepare(paths = config.load_paths)
  paths.each do |path|
    data = YAML.load_file(path)

    if custom_top_namespace?(path)
      top_namespace = config.top_namespace

      mapped_data = data
        .map { |k, v| [k, {top_namespace => v[DEFAULT_MESSAGES_ROOT]}] }
        .to_h

      store_translations(mapped_data)
    else
      store_translations(data)
    end
  end

  self
end

Private Instance Methods

store_translations(data) click to toggle source

@api private

# File lib/dry/schema/messages/i18n.rb, line 120
def store_translations(data)
  locales = data.keys.map(&:to_sym)

  I18n.available_locales |= locales

  locales.each do |locale|
    I18n.backend.store_translations(locale, data[locale.to_s])
  end
end