require 'active_support/core_ext/hash/reverse_merge' module Titlezilla class Translator attr_reader :namespace, :controller_name, :action_name, :context def initialize(controller_path, action_name, context = {}) @namespace, @controller_name = parse_namespace_and_controller_name(controller_path) @action_name = action_name.to_s.freeze @context = context end def title(override = nil) if !override @title ||= lookup(controller_name, map(action_name)) else @title = override end end def application_title @application_title ||= reverse_lookup('application') end def meta_title [title, application_title].compact.join(::Titlezilla.configuration.separator) end private def parse_namespace_and_controller_name(controller_path) parts = controller_path.to_s.split('/') parts.map!(&:to_s).map!(&:freeze) if parts.size > 1 [parts[(0...-1)], parts[-1]] else [[], parts[0].to_s.freeze] end end def lookup(*key) lookup_with_namespace(key, namespace) end def reverse_lookup(*key) title_namespace = namespace.dup begin title = lookup_with_namespace(key, title_namespace) return title if title title_namespace.pop end while title_namespace.size >= 0 end def lookup_with_namespace(keys, namespace) t_key = [:titles, namespace, keys].flatten.compact.join('.') i18n_set?(t_key) ? I18n.t(t_key, context) : nil end def map(action_name) (::Titlezilla.configuration.action_map[action_name.to_sym] || action_name).to_s.freeze end def i18n_set?(key) I18n.t(key, raise: true) rescue false end end end