class Middleman::CoreExtensions::Internationalization

def after_configuration

def after_configuration
  # See https://github.com/svenfuchs/i18n/wiki/Fallbacks
  unless options[:no_fallbacks]
    require 'i18n/backend/fallbacks'
    ::I18n::Backend::Simple.send(:include, ::I18n::Backend::Fallbacks)
  end
  locales_file_path = options[:data]
  # Tell the file watcher to observe the :data_dir
  app.files.watch :locales,
                  path: File.join(app.root, locales_file_path),
                  ignore: proc { |f| !(/.*(rb|yml|yaml)$/.match(f[:relative_path])) }
  # Setup data files before anything else so they are available when
  # parsing config.rb
  app.files.on_change(:locales, &method(:on_file_changed))
  @maps = {}
  @mount_at_root = options[:mount_at_root].nil? ? langs.first : options[:mount_at_root]
  # Don't output localizable files
  app.ignore File.join(options[:templates_dir], '**')
  configure_i18n
  logger.info "== Locales: #{langs.join(', ')} (Default #{@mount_at_root})"
end

def build_resource(path, source_path, page_id, lang)

def build_resource(path, source_path, page_id, lang)
  old_locale = ::I18n.locale
  ::I18n.locale = lang
  localized_page_id = ::I18n.t("paths.#{page_id}", default: page_id, fallback: [])
  prefix = if (options[:mount_at_root] == lang) || (options[:mount_at_root].nil? && langs[0] == lang)
    '/'
  else
    replacement = options[:lang_map].fetch(lang, lang)
    options[:path].sub(':locale', replacement.to_s)
  end
  # path needs to be changed if file has a localizable extension. (options[mount_at_root] == lang)
  path = ::Middleman::Util.normalize_path(
    File.join(prefix, path.sub(page_id, localized_page_id))
  )
  path = path.sub(options[:templates_dir] + '/', '')
  p = ::Middleman::Sitemap::ProxyResource.new(app.sitemap, path, source_path)
  p.add_metadata locals: { lang: lang, page_id: path }, options: { lang: lang }
  ::I18n.locale = old_locale
  p
end

def configure_i18n

def configure_i18n
  ::I18n.load_path += app.files.by_type(:locales).files.map { |p| p[:full_path].to_s }
  ::I18n.reload!
  ::I18n.default_locale = @mount_at_root
  # Reset fallbacks to fall back to our new default
  ::I18n.fallbacks = ::I18n::Locale::Fallbacks.new if ::I18n.respond_to?(:fallbacks)
end

def known_languages

def known_languages
  if options[:langs]
    Array(options[:langs]).map(&:to_sym)
  else
    known_langs = app.files.by_type(:locales).files.select do |p|
      p[:relative_path].to_s.split(File::SEPARATOR).length == 1
    end
    known_langs.map { |p|
      File.basename(p[:relative_path].to_s).sub(/\.ya?ml$/, '').sub(/\.rb$/, '')
    }.sort.map(&:to_sym)
  end
end

def langs

def langs
  @langs ||= known_languages
end

def locate_partial(partial_name)

def locate_partial(partial_name)
  locals_dir = extensions[:i18n].options[:templates_dir]
  # Try /localizable
  partials_path = File.join(locals_dir, partial_name)
  lang_suffix = current_resource.metadata[:locals] && current_resource.metadata[:locals][:lang]
  extname = File.extname(partial_name)
  maybe_static = extname.length > 0
  suffixed_partial_name = if maybe_static
    partial_name.sub(extname, ".#{lang_suffix}#{extname}")
  else
    "#{partial_name}.#{lang_suffix}"
  end
  if lang_suffix
    super(suffixed_partial_name) ||
      super(File.join(locals_dir, suffixed_partial_name)) ||
      super(partials_path) ||
      super
  else
    super(partials_path) ||
      super
  end
end

def manipulate_resource_list(resources)

def manipulate_resource_list(resources)
  new_resources = []
  resources.each do |resource|
    # If it uses file extension localization
    if result = parse_locale_extension(resource.path)
      ext_lang, path, page_id = result
      new_resources << build_resource(path, resource.path, page_id, ext_lang)
    # If it's a "localizable template"
    elsif File.fnmatch?(File.join(options[:templates_dir], '**'), resource.path)
      page_id = File.basename(resource.path, File.extname(resource.path))
      langs.each do |lang|
        # Remove folder name
        path = resource.path.sub(options[:templates_dir], '')
        new_resources << build_resource(path, resource.path, page_id, lang)
      end
    end
    # This is for backwards compatibility with the old provides_metadata-based code
    # that used to be in this extension, but I don't know how much sense it makes.
    next if resource.options[:lang]
    resource.add_metadata options: { lang: @mount_at_root }, locals: { lang: @mount_at_root }
  end
  resources + new_resources
end

def on_file_changed(_updated_files, _removed_files)

def on_file_changed(_updated_files, _removed_files)
  @_langs = nil # Clear langs cache
  # TODO, add new file to ::I18n.load_path
  ::I18n.reload!
end

def parse_locale_extension(path)

def parse_locale_extension(path)
  path_bits = path.split('.')
  return nil if path_bits.size < 3
  lang = path_bits.delete_at(-2).to_sym
  return nil unless langs.include?(lang)
  path = path_bits.join('.')
  basename = File.basename(path_bits[0..-2].join('.'))
  [lang, path, basename]
end

def t(*args)

def t(*args)
  ::I18n.t(*args)
end