function bogo_set_accessible_locales($profileuser)
{
    $available_languages = bogo_available_languages('orderby=value');
    $accessible_locales = bogo_get_user_accessible_locales($profileuser->ID);
    if (empty($accessible_locales)) {
        $accessible_locales = array_keys($available_languages);
    } else {
        $accessible_locales = bogo_filter_locales($accessible_locales);
    }
    ?>

<!-- Bogo plugin -->
<tr>
<th scope="row"><?php 
    echo esc_html(__('Locale', 'bogo'));
    ?>
</th>
<td>
<input type="hidden" name="setting_bogo_accessible_locales" value="1" />
<span class="description"><?php 
    echo esc_html(__('This user is allowed to access the following locales:', 'bogo'));
    ?>
</span><br />
<fieldset class="bogo-locale-options">

<?php 
    foreach ($available_languages as $locale => $language) {
        $checked = in_array($locale, $accessible_locales);
        $id_attr = 'bogo_accessible_locale-' . $locale;
        ?>
<label class="bogo-locale-option<?php 
        echo $checked ? ' checked' : '';
        ?>
" for="<?php 
        echo $id_attr;
        ?>
">
<input type="checkbox" id="<?php 
        echo $id_attr;
        ?>
" name="bogo_accessible_locales[]" value="<?php 
        echo esc_attr($locale);
        ?>
"<?php 
        echo $checked ? ' checked="checked"' : '';
        ?>
 /><?php 
        echo esc_html($language);
        ?>
</label>
<?php 
    }
    ?>
</fieldset>
</td>
</tr>

<?php 
}
function bogo_update_nav_menu_item($menu_id, $menu_item_id)
{
    delete_post_meta($menu_item_id, '_locale');
    if (isset($_POST['menu-item-bogo-locale'][$menu_item_id])) {
        $locales = (array) $_POST['menu-item-bogo-locale'][$menu_item_id];
        $locales = bogo_filter_locales($locales);
        foreach ($locales as $locale) {
            add_post_meta($menu_item_id, '_locale', $locale);
        }
    }
    if (!metadata_exists('post', $menu_item_id, '_locale')) {
        add_post_meta($menu_item_id, '_locale', 'zxx');
        // special code in ISO 639-2
    }
}
function bogo_setup_nav_menu_item($menu_item)
{
    if (isset($menu_item->bogo_locales)) {
        return $menu_item;
    }
    $menu_item->bogo_locales = array();
    if (isset($menu_item->post_type) && 'nav_menu_item' == $menu_item->post_type) {
        $menu_item->bogo_locales = get_post_meta($menu_item->ID, '_locale');
    }
    if ($menu_item->bogo_locales) {
        $menu_item->bogo_locales = bogo_filter_locales($menu_item->bogo_locales);
    } else {
        $menu_item->bogo_locales = bogo_available_locales();
    }
    return $menu_item;
}
function bogo_map_meta_cap($caps, $cap, $user_id, $args)
{
    $meta_caps = array('bogo_access_all_locales' => 'manage_options', 'bogo_access_locale' => 'read');
    $meta_caps = apply_filters('bogo_map_meta_cap', $meta_caps);
    $caps = array_diff($caps, array_keys($meta_caps));
    if (isset($meta_caps[$cap])) {
        $caps[] = $meta_caps[$cap];
    }
    if ('bogo_access_locale' == $cap && !user_can($user_id, 'bogo_access_all_locales')) {
        $accessible_locales = bogo_get_user_accessible_locales($user_id);
        if (!empty($accessible_locales)) {
            $accessible_locales = bogo_filter_locales($accessible_locales);
            $locale = $args[0];
            if (!in_array($locale, $accessible_locales)) {
                $caps[] = 'do_not_allow';
            }
        }
    }
    return $caps;
}