module I18n::Backend::Simple::Implementation

Constants

MUTEX

Mutex to ensure that concurrent translations loading will be thread-safe

Public Instance Methods

Get available locales from the translations hash

# File lib/i18n/backend/simple.rb, line 49
def available_locales
  init_translations unless initialized?
  translations.inject([]) do |locales, (locale, data)|
    locales << locale unless data.size <= 1 && (data.empty? || data.has_key?(:i18n))
    locales
  end
end
Calls superclass method I18n::Backend::Base#eager_load!
# File lib/i18n/backend/simple.rb, line 64
def eager_load!
  init_translations unless initialized?
  super
end
# File lib/i18n/backend/simple.rb, line 28
def initialized?
  @initialized ||= false
end

Clean up translations hash and set initialized to false on reload!

Calls superclass method I18n::Backend::Base#reload!
# File lib/i18n/backend/simple.rb, line 58
def reload!
  @initialized = false
  @translations = nil
  super
end

Stores translations for the given locale in memory. This uses a deep merge for the translations hash, so existing translations will be overwritten by new ones only at the deepest level of the hash.

# File lib/i18n/backend/simple.rb, line 36
def store_translations(locale, data, options = EMPTY_HASH)
  if I18n.enforce_available_locales &&
    I18n.available_locales_initialized? &&
    !I18n.locale_available?(locale)
    return data
  end
  locale = locale.to_sym
  translations[locale] ||= Concurrent::Hash.new
  data = Utils.deep_symbolize_keys(data) unless options.fetch(:skip_symbolize_keys, false)
  Utils.deep_merge!(translations[locale], data)
end
# File lib/i18n/backend/simple.rb, line 69
def translations(do_init: false)
  # To avoid returning empty translations,
  # call `init_translations`
  init_translations if do_init && !initialized?

  @translations ||= Concurrent::Hash.new do |h, k|
    MUTEX.synchronize do
      h[k] = Concurrent::Hash.new
    end
  end
end

Protected Instance Methods

# File lib/i18n/backend/simple.rb, line 83
def init_translations
  load_translations
  @initialized = true
end

Looks up a translation from the translations hash. Returns nil if either key is nil, or locale, scope or key do not exist as a key in the nested translations hash. Splits keys or scopes containing dots into multiple keys, i.e. currency.format is regarded the same as %w(currency format).

# File lib/i18n/backend/simple.rb, line 93
def lookup(locale, key, scope = [], options = EMPTY_HASH)
  init_translations unless initialized?
  keys = I18n.normalize_keys(locale, key, scope, options[:separator])

  keys.inject(translations) do |result, _key|
    return nil unless result.is_a?(Hash)
    unless result.has_key?(_key)
      _key = _key.to_s.to_sym
      return nil unless result.has_key?(_key)
    end
    result = result[_key]
    result = resolve_entry(locale, _key, result, Utils.except(options.merge(:scope => nil), :count)) if result.is_a?(Symbol)
    result
  end
end