Module: Bugsage::Translations
- Defined in:
- lib/bugsage/translations.rb
Constant Summary collapse
- LOCALE_DIR =
File.("locales", __dir__)
Class Method Summary collapse
- .deep_merge!(base, other) ⇒ Object
- .dig_fallback(keys) ⇒ Object
- .interpolate(string, options) ⇒ Object
- .load! ⇒ Object
- .missing_translation(key) ⇒ Object
- .t(key) ⇒ Object
- .translate_fallback(key, **options) ⇒ Object
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, ) string.gsub(/%\{(\w+)\}/) do symbol = Regexp.last_match(1).to_sym .key?(symbol) ? [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, **) keys = key.split(".") value = dig_fallback(keys) return [:default] if value.nil? && .key?(:default) case value when Array value when String interpolate(value, ) else .fetch(:default, missing_translation(key)) end end |