module FastGettext::Storage

Responsibility:

- store data threadsafe
- provide error messages when repositories are unconfigured
- accept/reject locales that are set by the user

Constants

DEFAULT_PLURALIZATION_RULE

Public Instance Methods

available_locales() click to toggle source
# File lib/fast_gettext/storage.rb, line 33
def available_locales
  locales = Thread.current[:fast_gettext_available_locales] || default_available_locales
  return unless locales

  locales.map(&:to_s)
end
best_locale_in(locales) click to toggle source

Opera: de-DE,de;q=0.9,en;q=0.8 Firefox de-de,de;q=0.8,en-us;q=0.5,en;q=0.3 IE6/7 de nil if nothing matches

# File lib/fast_gettext/storage.rb, line 136
def best_locale_in(locales)
  formatted_sorted_locales(locales).each do |candidate|
    return candidate unless available_locales
    return candidate if available_locales.include?(candidate)
    return candidate[0..1] if available_locales.include?(candidate[0..1]) # available locales include a langauge
  end
  nil # nothing found im sorry :P
end
cache() click to toggle source
# File lib/fast_gettext/storage.rb, line 69
def cache
  Thread.current[:fast_gettext_cache] ||= cache_class.new
end
cached_find(key) click to toggle source
# File lib/fast_gettext/storage.rb, line 92
def cached_find(key)
  cache.fetch(key) { current_repository[key] }
end
cached_plural_find(*keys) click to toggle source
# File lib/fast_gettext/storage.rb, line 96
def cached_plural_find(*keys)
  key = '||||' + keys * '||||'
  cache.fetch(key) { current_repository.plural(*keys) }
end
current_repository() click to toggle source
# File lib/fast_gettext/storage.rb, line 84
def current_repository
  translation_repositories[text_domain] || raise(NoTextDomainConfigured)
end
default_locale() click to toggle source
# File lib/fast_gettext/storage.rb, line 128
def default_locale
  @@default_locale
end
default_locale=(new_locale) click to toggle source
# File lib/fast_gettext/storage.rb, line 123
def default_locale=(new_locale)
  @@default_locale = best_locale_in(new_locale) # rubocop:disable Style/ClassVars
  switch_cache
end
expire_cache_for(key) click to toggle source
# File lib/fast_gettext/storage.rb, line 101
def expire_cache_for(key)
  cache.delete(key)
end
key_exist?(key) click to toggle source
# File lib/fast_gettext/storage.rb, line 88
def key_exist?(key)
  !!(cached_find key)
end
locale() click to toggle source
# File lib/fast_gettext/storage.rb, line 105
def locale
  _locale || (default_locale || (available_locales || []).first || 'en')
end
locale=(new_locale) click to toggle source
# File lib/fast_gettext/storage.rb, line 109
def locale=(new_locale)
  set_locale(new_locale)
end
pluralisation_rule() click to toggle source

if overwritten by user( FastGettext.pluralisation_rule = xxx) use it, otherwise fall back to repo or to default lambda

# File lib/fast_gettext/storage.rb, line 65
def pluralisation_rule
  Thread.current[:fast_gettext_pluralisation_rule] || current_repository.pluralisation_rule || DEFAULT_PLURALIZATION_RULE
end
reload!() click to toggle source
# File lib/fast_gettext/storage.rb, line 73
def reload!
  cache.reload!
  translation_repositories.values.each(&:reload)
end
set_locale(new_locale) click to toggle source

for chaining: puts set_locale('xx') == 'xx' ? 'applied' : 'rejected' returns the current locale, not the one that was supplied like locale=(), whoes behavior cannot be changed

# File lib/fast_gettext/storage.rb, line 116
def set_locale(new_locale) # rubocop:disable Naming/AccessorMethodName
  new_locale = best_locale_in(new_locale)
  self._locale = new_locale
  locale
end
silence_errors() click to toggle source

turn off translation if none was defined to disable all resulting errors

# File lib/fast_gettext/storage.rb, line 156
def silence_errors
  require 'fast_gettext/translation_repository/base'
  translation_repositories[text_domain] ||= TranslationRepository::Base.new('x', path: 'locale')
end
text_domain() click to toggle source
# File lib/fast_gettext/storage.rb, line 59
def text_domain
  Thread.current[:fast_gettext_text_domain] || default_text_domain
end
translation_repositories() click to toggle source
# File lib/fast_gettext/storage.rb, line 80
def translation_repositories
  @@translation_repositories
end
with_locale(temp_locale) { || ... } click to toggle source

temporarily switch locale for a block FastGettext.with_locale 'xx' { _('cars') }

# File lib/fast_gettext/storage.rb, line 147
def with_locale(temp_locale)
  current_locale = locale
  set_locale temp_locale
  yield
ensure
  set_locale current_locale
end

Private Instance Methods

_locale() click to toggle source
# File lib/fast_gettext/storage.rb, line 28
def _locale
  Thread.current[:fast_gettext__locale]
end
format_locale(locale) click to toggle source

de-de -> de_DE

# File lib/fast_gettext/storage.rb, line 187
def format_locale(locale)
  locale.sub(/^([a-zA-Z]{2,3})[-_]([a-zA-Z]{2,3})$/) { $1.downcase + '_' + $2.upcase }
end
formatted_sorted_locales(locales) click to toggle source

de-de,DE-CH;q=0.9 -> ['de_DE','de_CH']

# File lib/fast_gettext/storage.rb, line 164
def formatted_sorted_locales(locales)
  found = weighted_locales(locales).reject(&:empty?).sort_by(&:last).reverse # sort them by weight which is the last entry
  found.flatten.map { |l| format_locale(l) }
end
switch_cache() click to toggle source
# File lib/fast_gettext/storage.rb, line 191
def switch_cache
  cache.switch_to(text_domain, locale)
end
weighted_locales(locales) click to toggle source

split the locale and seperate it into different languages de-de,de;q=0.9,en;q=0.8 => [['de-de','de','0.5'], ['en','0.8']]

# File lib/fast_gettext/storage.rb, line 171
def weighted_locales(locales)
  locales = locales.to_s.gsub(/\s/, '')
  found = [[]]
  locales.split(',').each do |part|
    if /;q=/.match?(part) # contains language and weight ?
      found.last << part.split(/;q=/)
      found.last.flatten!
      found << []
    else
      found.last << part
    end
  end
  found
end