<?php
// Functions for internationalization

/**
 * Translates string to given language in first parameter, key given in second parameter (dynamically loads required language). Works like spritf from second parameter
 * @global array $LANG Associative array of language pharses
 * @return string Translated string
 */
function _translate() {
    global $LANG;

    $args = func_get_args();

    $l = $args[0];
    if (empty($l)) return 'NO LANGUAGE DEFINED';

    $key = $args[1];
    if (empty($key)) return '';

    // No translation needed
    if (!preg_match('/[a-z]/i', $key)) {
        return $key;
    }

    // Load language file (if not loaded yet)
    if (!isset($LANG[$l])) {
        require_once($_SERVER['DOCUMENT_ROOT']."/inc/i18n/$l.php");
    }

    //if (!isset($LANG[$l][$key])) file_put_contents('/somewhere/something.log', "$key\n", FILE_APPEND);
    $text = isset($LANG[$l][$key]) ? $LANG[$l][$key] : $key;

    array_shift($args);
    if (count($args) > 1) {
        $args[0] = $text;
        return call_user_func_array('sprintf', $args);
    } else {
        return $text;
    }
}

/**
 * Translates string by a given key in first parameter to current session language. Works like sprintf
 * @global array $LANG Associative array of language pharses
 * @return string Translated string
 * @see _translate()
 */
function __() {
    $args = func_get_args();
    array_unshift($args, $_SESSION['language']);
    return call_user_func_array('_translate', $args);
}

/**
 * Detects user language from Accept-Language HTTP header.
 * @param string Fallback language (default: 'en')
 * @return string Language code (such as 'en' and 'ja')
 */
function detect_user_language($fallback='en') {
    static $user_lang = '';

    // Already detected
    if (!empty($user_lang)) return $user_lang;

    // Check if Accept-Language header is available
    if (!isset($_SERVER) ||
        !isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) ||
        !is_string($_SERVER['HTTP_ACCEPT_LANGUAGE'])
    ) {
        // Store result for reusing
        $user_lang = $fallback;
        return $user_lang;
    }


    // Sort Accept-Language by `q` value
    $accept_langs = explode(',', preg_replace('/\s/', '', strtolower($_SERVER['HTTP_ACCEPT_LANGUAGE'])));
    $accept_langs_sorted = array() ;
    foreach ($accept_langs as $lang) {
        $div = explode(';q=', $lang, 2);
        if (count($div) < 2) {
            // `q` value was not specfied
            // -> Set default `q` value (1)
            $div[] = '1';
        }
        list($code, $q) = $div;
        if (preg_match('/^[\w\-]+$/', $code)) {
            // Acceptable language code
            $accept_langs_sorted[$code] = (double)$q;
        }
    }
    arsort($accept_langs_sorted);

    // List languages
    exec (HESTIA_CMD."v-list-sys-languages json", $output, $return_var);
    $languages = json_decode(implode('', $output), true);
    unset($output);

    // Find best matching language
    foreach ($accept_langs_sorted as $user_lang => $dummy) {
        $decision = '';
        foreach ($languages as $prov_lang) {
            if (strlen($decision) > strlen($prov_lang)) continue;
            if (strpos($user_lang, $prov_lang) !== false) {
                $decision = $prov_lang;
            }
        }
        if (!empty($decision)) {
            // Store result for reusing
            $user_lang = $decision;
            return $user_lang;
        }
    }

    // Store result for reusing
    $user_lang = $fallback;
    return $user_lang;
}

/**
 * Detects user language .
 * @param string Fallback language (default: 'en')
 * @return string Language code (such as 'en' and 'ja')
 */

function detect_login_language(){

}
