function bogo_switch_user_locale()
{
    if (empty($_REQUEST['action']) || 'bogo-switch-locale' != $_REQUEST['action']) {
        return;
    }
    check_admin_referer('bogo-switch-locale');
    $locale = isset($_REQUEST['locale']) ? $_REQUEST['locale'] : '';
    if (!bogo_is_available_locale($locale) || $locale == bogo_get_user_locale()) {
        return;
    }
    update_user_option(get_current_user_id(), 'locale', $locale, true);
    if (!empty($_REQUEST['redirect_to'])) {
        wp_safe_redirect($_REQUEST['redirect_to']);
        exit;
    }
}
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_select_own_locale($profileuser)
{
    $available_languages = bogo_available_languages(array('orderby' => 'value', 'current_user_can_access' => true));
    $selected = bogo_get_user_locale($profileuser->ID);
    ?>

<!-- Bogo plugin -->
<tr>
<th scope="row"><?php 
    echo esc_html(__('Locale', 'bogo'));
    ?>
</th>
<td>
<select name="bogo_own_locale">
<?php 
    foreach ($available_languages as $locale => $lang) {
        ?>
<option value="<?php 
        echo esc_attr($locale);
        ?>
" <?php 
        selected($locale, $selected);
        ?>
><?php 
        echo esc_html($lang);
        ?>
</option>
<?php 
    }
    ?>
</select>
</td>
</tr>

<?php 
}