function bogo_get_user_locale($user_id = 0)
{
    global $current_user;
    $default_locale = bogo_get_default_locale();
    $user_id = absint($user_id);
    if (!$user_id) {
        if (function_exists('wp_get_current_user') && !empty($current_user)) {
            $user_id = get_current_user_id();
        } elseif (!($user_id = apply_filters('determine_current_user', false))) {
            return $default_locale;
        }
    }
    $locale = get_user_option('locale', $user_id);
    if (bogo_is_available_locale($locale) && user_can($user_id, 'bogo_access_locale', $locale)) {
        return $locale;
    }
    if (user_can($user_id, 'bogo_access_locale', $default_locale)) {
        return $default_locale;
    }
    foreach ((array) bogo_available_locales() as $locale) {
        if (user_can($user_id, 'bogo_access_locale', $locale)) {
            return $locale;
        }
    }
    return $default_locale;
}
function bogo_locale($locale)
{
    global $wp_rewrite, $wp_query;
    if (!did_action('plugins_loaded')) {
        return $locale;
    }
    if (is_admin()) {
        return bogo_get_user_locale();
    }
    $default_locale = bogo_get_default_locale();
    if (!empty($wp_query->query_vars)) {
        if (($lang = get_query_var('lang')) && ($closest = bogo_get_closest_locale($lang))) {
            return $closest;
        } else {
            return $default_locale;
        }
    }
    if (isset($wp_rewrite) && $wp_rewrite->using_permalinks()) {
        $url = is_ssl() ? 'https://' : 'http://';
        $url .= $_SERVER['HTTP_HOST'];
        $url .= $_SERVER['REQUEST_URI'];
        $home = set_url_scheme(get_option('home'));
        $home = trailingslashit($home);
        $available_languages = bogo_available_languages();
        $available_languages = array_map('bogo_lang_slug', array_keys($available_languages));
        $available_languages = implode('|', $available_languages);
        $pattern = '#^' . preg_quote($home) . '(' . $available_languages . ')(/|$)#';
        if (preg_match($pattern, $url, $matches) && ($closest = bogo_get_closest_locale($matches[1]))) {
            return $closest;
        }
    }
    $lang = bogo_get_lang_from_url();
    if ($lang && ($closest = bogo_get_closest_locale($lang))) {
        return $closest;
    }
    $locale = $default_locale;
    return $locale;
}
function bogo_save_post($post_id, $post)
{
    if (did_action('import_start') && !did_action('import_end')) {
        // Importing
        return;
    }
    if (!bogo_is_localizable_post_type($post->post_type)) {
        return;
    }
    $old_locale = get_post_meta($post_id, '_locale', true);
    if (empty($old_locale)) {
        if (!empty($_REQUEST['locale']) && bogo_is_available_locale($_REQUEST['locale'])) {
            $locale = $_REQUEST['locale'];
        } elseif ('auto-draft' == get_post_status($post_id)) {
            $locale = bogo_get_user_locale();
        } else {
            $locale = bogo_get_default_locale();
        }
    }
    if (!empty($locale) && $locale != $old_locale) {
        update_post_meta($post_id, '_locale', $locale);
    } else {
        $locale = $old_locale;
    }
    if ($original = get_post_meta($post_id, '_original_post', true)) {
        return;
    }
    if (!empty($_REQUEST['original_post'])) {
        $original = get_post_meta($_REQUEST['original_post'], '_original_post', true);
        if (empty($original)) {
            $original = (int) $_REQUEST['original_post'];
        }
        update_post_meta($post_id, '_original_post', $original);
        return;
    }
    $original = $post_id;
    while (1) {
        $q = new WP_Query();
        $posts = $q->query(array('bogo_suppress_locale_query' => true, 'posts_per_page' => 1, 'post_status' => 'any', 'post_type' => $post->post_type, 'meta_key' => '_original_post', 'meta_value' => $original));
        if (empty($posts)) {
            update_post_meta($post_id, '_original_post', $original);
            return;
        }
        $original += 1;
    }
}
function bogo_tools_page()
{
    $message = "";
    if (isset($_GET['message'])) {
        if ('success' == $_GET['message']) {
            $message = __("Translation installed successfully.", 'bogo');
        } elseif ('failed' == $_GET['message']) {
            $message = __("Translation install failed.", 'bogo');
        }
    }
    $default_locale = bogo_get_default_locale();
    $available_locales = bogo_available_locales();
    ?>
<div class="wrap">

<h2><?php 
    echo esc_html(__('Bogo Tools', 'bogo'));
    ?>
</h2>

<?php 
    if (!empty($message)) {
        ?>
<div id="message" class="updated"><p><?php 
        echo esc_html($message);
        ?>
</p></div>
<?php 
    }
    ?>

<h3 class="title"><?php 
    echo esc_html(__('Available Languages', 'bogo'));
    ?>
</h3>

<table id="bogo-languages-table" class="widefat">
<thead>
	<tr><th></th><th><?php 
    echo esc_html(__('Language', 'bogo'));
    ?>
</th></tr>
</thead>
<tfoot>
	<tr><th></th><th><?php 
    echo esc_html(__('Language', 'bogo'));
    ?>
</th></tr>
</tfoot>
<tbody id="translations">
	<tr><th>1</th><td><p>
		<strong><?php 
    echo esc_html(bogo_get_language($default_locale));
    ?>
</strong>
		[<?php 
    echo esc_html($default_locale);
    ?>
]
		<br /><?php 
    echo esc_html(__('Site Default Language', 'bogo'));
    ?>
	</p></td></tr>

<?php 
    $count = 1;
    foreach ($available_locales as $locale) {
        if ($locale == $default_locale) {
            continue;
        }
        $count += 1;
        ?>
	<tr><th><?php 
        echo $count;
        ?>
</th><td><p>
		<strong><?php 
        echo esc_html(bogo_get_language($locale));
        ?>
</strong>
		[<?php 
        echo esc_html($locale);
        ?>
]
		<br /><?php 
        echo esc_html(__('Installed', 'bogo'));
        ?>
	</p></td></tr>
<?php 
    }
    $can_install = wp_can_install_language_pack();
    foreach (wp_get_available_translations() as $locale => $translation) {
        if (in_array($locale, $available_locales)) {
            continue;
        }
        $count += 1;
        $install_link = '';
        if ($can_install) {
            $install_link = menu_page_url('bogo-tools', false);
            $install_link = add_query_arg(array('action' => 'install_translation', 'locale' => $locale), $install_link);
            $install_link = wp_nonce_url($install_link, 'bogo-tools');
            $install_link = sprintf('<a href="%1$s" class="install">%2$s</a>', $install_link, esc_html(__('Install', 'bogo')));
        }
        ?>
	<tr><th><?php 
        echo $count;
        ?>
</th><td><p>
		<strong><?php 
        echo esc_html(bogo_get_language($locale));
        ?>
</strong>
		[<?php 
        echo esc_html($locale);
        ?>
]
		<?php 
        echo $install_link;
        ?>
	</p></td></tr>
<?php 
    }
    ?>

</tbody>
</table>

</div>
<?php 
}
function bogo_get_page_by_path($page_path, $locale = null, $post_type = 'page')
{
    global $wpdb;
    if (!bogo_is_available_locale($locale)) {
        $locale = bogo_get_default_locale();
    }
    $page_path = rawurlencode(urldecode($page_path));
    $page_path = str_replace('%2F', '/', $page_path);
    $page_path = str_replace('%20', ' ', $page_path);
    $parts = explode('/', trim($page_path, '/'));
    $parts = array_map('esc_sql', $parts);
    $parts = array_map('sanitize_title_for_query', $parts);
    $in_string = "'" . implode("','", $parts) . "'";
    $post_type_sql = $post_type;
    $wpdb->escape_by_ref($post_type_sql);
    $q = "SELECT ID, post_name, post_parent FROM {$wpdb->posts}";
    $q .= " LEFT JOIN {$wpdb->postmeta} ON ID = {$wpdb->postmeta}.post_id AND meta_key = '_locale'";
    $q .= " WHERE 1=1";
    $q .= " AND post_name IN ({$in_string})";
    $q .= " AND (post_type = '{$post_type_sql}' OR post_type = 'attachment')";
    $q .= " AND (1=0";
    $q .= $wpdb->prepare(" OR meta_value LIKE %s", $locale);
    $q .= bogo_is_default_locale($locale) ? " OR meta_id IS NULL" : "";
    $q .= ")";
    $pages = $wpdb->get_results($q, OBJECT_K);
    $revparts = array_reverse($parts);
    $foundid = 0;
    foreach ((array) $pages as $page) {
        if ($page->post_name != $revparts[0]) {
            continue;
        }
        $count = 0;
        $p = $page;
        while ($p->post_parent != 0 && isset($pages[$p->post_parent])) {
            $count++;
            $parent = $pages[$p->post_parent];
            if (!isset($revparts[$count]) || $parent->post_name != $revparts[$count]) {
                break;
            }
            $p = $parent;
        }
        if ($p->post_parent == 0 && $count + 1 == count($revparts) && $p->post_name == $revparts[$count]) {
            $foundid = $page->ID;
            break;
        }
    }
    if ($foundid) {
        return get_page($foundid);
    }
    return null;
}
function bogo_get_url_with_lang($url = null, $lang = null, $args = '')
{
    $defaults = array('using_permalinks' => true);
    $args = wp_parse_args($args, $defaults);
    if (!$url) {
        if (!($url = redirect_canonical($url, false))) {
            $url = is_ssl() ? 'https://' : 'http://';
            $url .= $_SERVER['HTTP_HOST'];
            $url .= $_SERVER['REQUEST_URI'];
        }
        if ($frag = strstr($url, '#')) {
            $url = substr($url, 0, -strlen($frag));
        }
        if ($query = @parse_url($url, PHP_URL_QUERY)) {
            parse_str($query, $query_vars);
            foreach (array_keys($query_vars) as $qv) {
                if (!get_query_var($qv)) {
                    $url = remove_query_arg($qv, $url);
                }
            }
        }
    }
    $default_locale = bogo_get_default_locale();
    if (!$lang) {
        $lang = $default_locale;
    }
    $home = set_url_scheme(get_option('home'));
    $home = trailingslashit($home);
    $url = remove_query_arg('lang', $url);
    if (!$args['using_permalinks']) {
        if ($lang != $default_locale) {
            $url = add_query_arg(array('lang' => bogo_lang_slug($lang)), $url);
        }
        return $url;
    }
    $available_languages = array_map('bogo_lang_slug', bogo_available_locales());
    $tail_slashed = '/' == substr($url, -1);
    $url = preg_replace('#^' . preg_quote($home) . '((' . implode('|', $available_languages) . ')/)?#', $home . ($lang == $default_locale ? '' : bogo_lang_slug($lang) . '/'), trailingslashit($url));
    if (!$tail_slashed) {
        $url = untrailingslashit($url);
    }
    return $url;
}
function bogo_parse_query($query)
{
    $qv =& $query->query_vars;
    if (!empty($qv['bogo_suppress_locale_query'])) {
        return;
    }
    if (isset($qv['post_type']) && 'any' != $qv['post_type']) {
        $localizable = array_filter((array) $qv['post_type'], 'bogo_is_localizable_post_type');
        if (empty($localizable)) {
            $qv['bogo_suppress_locale_query'] = true;
            return;
        }
    }
    $lang = isset($qv['lang']) ? $qv['lang'] : '';
    if (is_admin()) {
        $locale = $lang;
    } else {
        if ($lang) {
            $locale = bogo_get_closest_locale($lang);
        } else {
            $locale = get_locale();
        }
        if (empty($locale)) {
            $locale = bogo_get_default_locale();
        }
    }
    if (empty($locale) || !bogo_is_available_locale($locale)) {
        $qv['bogo_suppress_locale_query'] = true;
        return;
    }
    $qv['lang'] = $locale;
    if (is_admin()) {
        return;
    }
    if ($query->is_home && 'page' == get_option('show_on_front') && get_option('page_on_front')) {
        $query_keys = array_keys(wp_parse_args($query->query));
        $query_keys = array_diff($query_keys, array('preview', 'page', 'paged', 'cpage', 'lang'));
        if (empty($query_keys)) {
            $query->is_page = true;
            $query->is_singular = true;
            $query->is_home = false;
            $qv['page_id'] = get_option('page_on_front');
            if (!empty($qv['paged'])) {
                $qv['page'] = $qv['paged'];
                unset($qv['paged']);
            }
        }
    }
    if ('' != $qv['pagename']) {
        $query->queried_object = bogo_get_page_by_path($qv['pagename'], $locale);
        if (!empty($query->queried_object)) {
            $query->queried_object_id = (int) $query->queried_object->ID;
        } else {
            unset($query->queried_object);
        }
        if ('page' == get_option('show_on_front') && isset($query->queried_object_id) && $query->queried_object_id == get_option('page_for_posts')) {
            $query->is_page = false;
            $query->is_home = true;
            $query->is_posts_page = true;
        }
    }
}