Module: Bugsage::Translations

Defined in:
lib/bugsage/translations.rb

Constant Summary collapse

LOCALE_DIR =
File.expand_path("locales", __dir__)

Class Method Summary collapse

Class Method Details

.deep_merge!(base, other) ⇒ Object



63
64
65
66
67
68
69
70
71
72
# File 'lib/bugsage/translations.rb', line 63

def deep_merge!(base, other)
  other.each do |key, value|
    key = key.to_s
    if base[key].is_a?(Hash) && value.is_a?(Hash)
      deep_merge!(base[key], value)
    else
      base[key] = value
    end
  end
end

.dig_fallback(keys) ⇒ Object



54
55
56
57
58
59
60
61
# File 'lib/bugsage/translations.rb', line 54

def dig_fallback(keys)
  locale = @fallback_translations["en"] || @fallback_translations[:en] || {}
  keys.reduce(locale) do |node, segment|
    break nil unless node.is_a?(Hash)

    node[segment] || node[segment.to_sym]
  end
end

.interpolate(string, options) ⇒ Object



74
75
76
77
78
79
# File 'lib/bugsage/translations.rb', line 74

def interpolate(string, options)
  string.gsub(/%\{(\w+)\}/) do
    symbol = Regexp.last_match(1).to_sym
    options.key?(symbol) ? options[symbol].to_s : "%{#{symbol}}"
  end
end

.load!Object



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# File 'lib/bugsage/translations.rb', line 11

def load!
  return if @loaded

  paths = Dir[File.join(LOCALE_DIR, "*.yml")]
  if defined?(::I18n)
    ::I18n.load_path |= paths
  else
    @fallback_translations = {}
    paths.each do |path|
      data = YAML.safe_load_file(path, aliases: true)
      deep_merge!(@fallback_translations, data)
    end
  end

  @loaded = true
end

.missing_translation(key) ⇒ Object



81
82
83
# File 'lib/bugsage/translations.rb', line 81

def missing_translation(key)
  key
end

.t(key) ⇒ Object



28
29
30
31
32
33
34
35
36
37
# File 'lib/bugsage/translations.rb', line 28

def t(key, **)
  load!
  full_key = key.to_s.start_with?("bugsage.") ? key : "bugsage.#{key}"

  if defined?(::I18n)
    ::I18n.t(full_key, **)
  else
    translate_fallback(full_key, **)
  end
end

.translate_fallback(key, **options) ⇒ Object



39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/bugsage/translations.rb', line 39

def translate_fallback(key, **options)
  keys = key.split(".")
  value = dig_fallback(keys)
  return options[:default] if value.nil? && options.key?(:default)

  case value
  when Array
    value
  when String
    interpolate(value, options)
  else
    options.fetch(:default, missing_translation(key))
  end
end