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; } } }