lib/gettext_simple_rails/i18n_injector.rb
class GettextSimpleRails::I18nInjector
attr_reader :store_hash
def initialize(args = {})
@args = args
@debug = args[:debug]
@i18n_backend = I18n.config.backend
@store_hash = {}
end
def inject_translator_translations(gettext_simple)
@store_hash = {}
GettextSimpleRails::Translators.load_all.each do |translator_data|
translator = translator_data[:class].new
next unless translator.detected?
I18n.available_locales.each do |locale|
next unless gettext_simple.locale_exists?(locale.to_s)
locale = locale.to_s
injector_recursive gettext_simple, locale, translator.translations
end
end
@store_hash.each do |locale, language_hash|
@i18n_backend.store_translations(locale.to_sym, language_hash)
end
end
def inject_from_static_translation_file(args)
translation_hash = JSON.parse(File.read(args[:path]))
translation_hash.each do |locale, language_hash|
@i18n_backend.store_translations(locale.to_sym, language_hash)
end
end
private
def debug(str)
$stderr.puts str if @debug
end
def injector_recursive(gettext_simple, locale, translations, pre_path = [])
if translations.is_a?(Hash)
translations.each do |key, val|
newpath = pre_path + [key]
injector_recursive(gettext_simple, locale, val, newpath)
end
elsif translations.is_a?(Array)
injector_recursive_array(gettext_simple, locale, translations, pre_path)
elsif translations.is_a?(String)
gettext_key = "#{pre_path.join(".")}"
translation = gettext_simple.translate_with_locale(locale.to_s, gettext_key)
if !translation.to_s.empty? && translation != gettext_key
translation_hash = {}
translation_current = translation_hash
pre_path.each_with_index do |path, index|
if index == (pre_path.length - 1)
translation_current[path] = translation
else
translation_current[path] = {}
translation_current = translation_current[path]
end
end
store_translations(locale, translation_hash)
end
else
raise "Unknown class: '#{translations.class.name}'."
end
end
def injector_recursive_array(gettext_simple, locale, translations, pre_path = [])
translation_array = []
translations.each_with_index do |val, index|
gettext_key = "#{pre_path.join(".")}.#{index}"
translation = gettext_simple.translate_with_locale(locale.to_s, gettext_key)
next if translation.to_s.empty? || translation == gettext_key
translation_array << translation
end
translation_hash = {}
translation_current = translation_hash
pre_path.each_with_index do |path, index|
if index == (pre_path.length - 1)
translation_current[path] = translation_array
else
translation_current[path] = {}
translation_current = translation_current[path]
end
end
store_translations(locale, translation_hash)
end
def store_translations(locale, translation_hash)
@store_hash.deep_merge!({locale.to_sym => translation_hash})
end
end