<?php

// Gettext text domain
define('TEXT_DOMAIN', 'DEFAULT');

/*
 * List available translation languages
 *
 * @param[in] $as_locales boolean  If true, locale names will be return instead
 *                                 of primary languages (optional, default: false)
 *
 * @retval array Array of available translation languages (or locales)
 */
function get_available_langs($as_locales=false) {
  global $root_lang_dir;
  if (!is_dir($root_lang_dir))
    logging('FATAL', "Root land directory not found ($root_lang_dir)");
  $langs = array(($as_locales?'en_US.UTF8':'en'));
  if ($dh = opendir($root_lang_dir)) {
    while (($file = readdir($dh)) !== false) {
      if (!is_dir($root_lang_dir . '/' . $file) || in_array($file, array('.', '..')))
        continue;
      if ($as_locales) {
        $langs[] = $file;
        continue;
      }
      $lang = Locale::getPrimaryLanguage($file);
      if (!in_array($lang, $langs))
        $langs[] = $lang;
    }
    closedir($dh);
  }
  $langs = array_unique($langs);
  logging('TRACE', 'Available '.($as_locales?'locales':'languages').': '.implode(', ', $langs));
  return $langs;
}

/*
 * Get locale name corresponding to specified translation language
 *
 * @param[in] $lang string The translation language
 * @param[in] $default string|null Default locale name to return if any available translation
 *                                 locales matched with the specified language
 *                                 (optional, default: $default_locale)
 * return string Corresponding locale
 */
function lang2locale($lang, $default=null) {
  global $default_locale;
  if (is_null($default))
    $default = $default_locale;
  foreach (get_available_langs(true) as $locale) {
    if (strpos($locale, $lang) === false)
      continue;
    return $locale;
  }
  return $default;
}

// Helper function: just mark message to translation
function ___($msg) {
  return $msg;
}

/*
 * Initialize translation system
 *
 * Detect best translation language and configure the translation
 * system.
 *
 * @retval void
 */
function init_translation() {
  global $root_dir_path, $root_lang_dir, $default_locale;
  $root_lang_dir = "$root_dir_path/lang";

  if (!class_exists('Locale')) {
    logging('ERROR', 'Locale PHP class does not exist. May be php-intl is not installed?');
    return;
  }

  $available_langs = get_available_langs();
  if (php_sapi_name() != "cli") {
    $lang = Locale::lookup(
      get_available_langs(),
      Locale::acceptFromHttp($_SERVER['HTTP_ACCEPT_LANGUAGE']),
      true,
      Locale::getPrimaryLanguage($default_locale)
    );
  }
  else {
    $lang = null;
    $sys_current = getenv('LC_ALL');
    if (!$sys_current)
      $sys_current = getenv('LANG');
    if ($sys_current)
      $lang = Locale::getPrimaryLanguage($sys_current);
    if (is_null($lang)) {
      logging('TRACE', 'No configured lang detected from CLI env, use default.');
      $lang = Locale::getPrimaryLanguage($default_locale);
    }
    else
      logging('TRACE', "Lang detected from CLI env : '$lang'");
  }
  logging('TRACE', "Best lang found is '$lang'");

  $locale = lang2locale($lang);
  logging('TRACE', "Matching locale found with language '$lang' is '$locale'");

  // Gettext firstly look the LANGUAGE env variable, so set it
  putenv("LANGUAGE=$locale");

  // Set the locale
  if (setlocale(LC_ALL, $locale) === false)
    logging('ERROR', "An error occured setting locale to '$locale'");

  // Configure and set the text domain
  $fullpath = bindtextdomain(TEXT_DOMAIN, $root_lang_dir);
  logging('TRACE', "Text domain fullpath is '$fullpath'.");
  logging('TRACE', "Text domain is '".textdomain(TEXT_DOMAIN)."'.");
}