add_menu( array( 'parent' => 'top-secondary', 'id' => 'bogo-user-locale', 'title' => '✔ ' . $current_language ) ); $available_languages = bogo_available_languages( array( 'exclude' => array( $current_locale ), 'exclude_enus_if_inactive' => true, 'current_user_can_access' => true ) ); foreach ( $available_languages as $locale => $lang ) { $url = admin_url( 'profile.php?action=bogo-switch-locale&locale=' . $locale ); $url = add_query_arg( array( 'redirect_to' => urlencode( $_SERVER['REQUEST_URI'] ) ), $url ); $url = wp_nonce_url( $url, 'bogo-switch-locale' ); $wp_admin_bar->add_menu( array( 'parent' => 'bogo-user-locale', 'id' => 'bogo-user-locale-' . $locale, 'title' => $lang, 'href' => $url ) ); } } add_action( 'admin_init', 'bogo_switch_user_locale' ); 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_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 ) && ( 'en_US' != $locale || ! bogo_get_prop( 'enus_deactivated' ) ) && user_can( $user_id, 'bogo_access_locale', $locale ) ) { return $locale; } if ( user_can( $user_id, 'bogo_access_locale', $default_locale ) ) { return $default_locale; } $available_locales = bogo_available_locales( array( 'exclude_enus_if_inactive' => true ) ); foreach ( $available_locales as $locale ) { if ( user_can( $user_id, 'bogo_access_locale', $locale ) ) { return $locale; } } return $default_locale; } function bogo_get_user_accessible_locales( $user_id ) { global $wpdb; $user_id = absint( $user_id ); $meta_key = $wpdb->get_blog_prefix() . 'accessible_locale'; $locales = get_user_meta( $user_id, $meta_key ); if ( bogo_get_prop( 'enus_deactivated' ) ) { $locales = array_diff( $locales, array( 'en_US' ) ); } return $locales; }