Module: Tina4::Localization

Defined in:
lib/tina4/localization.rb

Constant Summary collapse

LOCALE_DIRS =
%w[locales translations i18n src/locales].freeze

Class Method Summary collapse

Class Method Details

.add(locale, key, value) ⇒ Object



102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
# File 'lib/tina4/localization.rb', line 102

def add(locale, key, value)
  translations[locale.to_s] ||= {}
  keys = key.to_s.split(".")
  hash = translations[locale.to_s]
  keys[0..-2].each do |k|
    hash[k] ||= {}
    hash = hash[k]
  end
  hash[keys.last] = value

  # Register leaf-key alias (first-wins)
  leaf = keys.last
  if value.is_a?(String)
    flat_aliases[locale.to_s] ||= {}
    flat_aliases[locale.to_s][leaf] ||= value
  end
end

.add_translation(locale, key, value) ⇒ Object



98
99
100
# File 'lib/tina4/localization.rb', line 98

def add_translation(locale, key, value)
  add(locale, key, value)
end

.available_localesObject



120
121
122
# File 'lib/tina4/localization.rb', line 120

def available_locales
  translations.keys
end

.current_localeObject



19
20
21
# File 'lib/tina4/localization.rb', line 19

def current_locale
  @current_locale || ENV["TINA4_LOCALE"] || "en"
end

.current_locale=(locale) ⇒ Object



23
24
25
# File 'lib/tina4/localization.rb', line 23

def current_locale=(locale)
  @current_locale = locale.to_s
end

.flat_aliasesObject

Flat alias map: { locale => { leaf_key => value } } First-wins on conflict — later duplicates are ignored.



15
16
17
# File 'lib/tina4/localization.rb', line 15

def flat_aliases
  @flat_aliases ||= {}
end

.get_localeObject



85
86
87
# File 'lib/tina4/localization.rb', line 85

def get_locale
  current_locale
end

.load(root_dir = Dir.pwd) ⇒ Object



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/tina4/localization.rb', line 27

def load(root_dir = Dir.pwd)
  locale_dir_override = ENV["TINA4_LOCALE_DIR"]
  search_dirs = locale_dir_override && !locale_dir_override.empty? ? [locale_dir_override] : LOCALE_DIRS

  search_dirs.each do |dir|
    locale_dir = File.expand_path(dir, root_dir)
    next unless Dir.exist?(locale_dir)

    Dir.glob(File.join(locale_dir, "*.json")).each do |file|
      locale = File.basename(file, ".json")
      data = JSON.parse(File.read(file))
      translations[locale] ||= {}
      translations[locale].merge!(data)
      # Build leaf-key aliases from the loaded data
      build_leaf_aliases(locale, data)
      Tina4::Log.debug("Loaded locale: #{locale} from #{file}")
    end

    # Also support YAML
    Dir.glob(File.join(locale_dir, "*.{yml,yaml}")).each do |file|
      begin
        require "yaml"
        locale = File.basename(file, File.extname(file))
        data = YAML.safe_load(File.read(file))
        if data.is_a?(Hash)
          translations[locale] ||= {}
          translations[locale].merge!(data)
          build_leaf_aliases(locale, data)
        end
      rescue LoadError
        Tina4::Log.warning("YAML support requires the 'yaml' gem")
      end
    end
  end
end

.load_translations(locale) ⇒ Object



93
94
95
96
# File 'lib/tina4/localization.rb', line 93

def load_translations(locale)
  load(Dir.pwd) if translations.empty?
  translations[locale.to_s] || {}
end

.set_locale(locale) ⇒ Object



81
82
83
# File 'lib/tina4/localization.rb', line 81

def set_locale(locale)
  self.current_locale = locale.to_s
end

.t(key, locale: nil, default: nil, **interpolations) ⇒ Object



63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/tina4/localization.rb', line 63

def t(key, locale: nil, default: nil, **interpolations)
  lang = locale || current_locale
  value = lookup(lang, key)

  if value.nil? && lang != "en"
    value = lookup("en", key)
  end

  value = default || key if value.nil?

  # Interpolation: "Hello %{name}" => "Hello World"
  interpolations.each do |k, v|
    value = value.gsub("%{#{k}}", v.to_s)
  end

  value
end

.translate(key, params: nil, locale: nil) ⇒ Object



89
90
91
# File 'lib/tina4/localization.rb', line 89

def translate(key, params: nil, locale: nil)
  t(key, locale: locale, **(params || {}))
end

.translationsObject



9
10
11
# File 'lib/tina4/localization.rb', line 9

def translations
  @translations ||= {}
end