web-dev-qa-db-fra.com

Langue de base différente pour différents utilisateurs?

Je fais des recherches sur Internet depuis une heure mais je ne trouve rien d’actuel pour le faire (toutes les suggestions concernent des plugins qui n’ont pas été mis à jour depuis des années, voir cette question ) .

Existe-t-il un moyen de spécifier un back-end language différent pour différents utilisateurs? J'aime mon WP back-end en anglais mais tous mes collègues le préfèrent dans leur propre langue (italien), y a-t-il moyen de vivre en paix avec eux?

Des accessoires si votre méthode ne s'appuie pas sur des URL (/? Lang = it et autres) et n'est pas un plugin, mais une fonction functions.php.

Merci, passez une bonne année!

6
Orin Larrey

Nous pourrions essayer de filtrer la WPLANG option  locale (voir par exemple cette approche dans la liste associée ici à droite } de @brasofilo, basée sur celle-ci de @toscho):

/**
 * Override locale settings for the current (non-admin) user
 */
is_admin() && add_filter( 'locale', function( $locale )
{
    // Modify locale for non-admins (we don't want to override this on the settings pages)
    if( ! current_user_can( 'manage_options' ) )
    {
        // Get admin language for the current user
        $lang = get_user_meta( get_current_user_id(), 'wpse_lang', true );

        // Use 'en_US' as default
        $locale = ! empty( $lang ) ? sanitize_text_field( $lang ) : 'en_US';
    }   
    return $locale; 
} );    

où nous vérifions si l'utilisateur actuel a la clé méta clé wpse_lang utilisateur définie, avec des valeurs telles que is_IS, da_DK, ...

Ensuite, nous pourrions ajouter la sélection de la langue pour chaque utilisateur, sur la page des paramètres de l'utilisateur.

Là, nous pourrions utiliser la fonction wp_dropdown_languages() , avec la fonction get_available_languages() , pour afficher la boîte de sélection des langues disponibles.

Voici un exemple de @sanchothefat sur la manière dont nous pouvons ajouter des paramètres utilisateur personnalisés.

Nous pouvons afficher la sélection de langue de l'utilisateur avec:

/**
 * Display available language dropdown
 */
function wpse_user_language( $user ) 
{
    // Only display for non-admins, but allow admins to edit for other users
    if( current_user_can( 'manage_options' ) && $user->ID == get_current_user_id() )
        return;

    // Get the current 'wp_lang' settings
    $lang = get_user_meta( $user->ID, 'wpse_lang', true ); 
    ?>
    <table class="form-table">
        <tr id="wpse-lang-selection">
            <th scope="row">
               <label for="wpse_lang">
                   <?php _e( 'WPSE' ); ?> - <?php _e( 'Site Language' ); ?>
               </label>
            </th>
            <td><?php wp_dropdown_languages( 
                    [
                        'id'                          => 'wpse_lang',
                        'name'                        => 'wpse_lang',
                        'languages'                   => get_available_languages(),
                        'translations'                => [],
                        'selected'                    => $lang,
                        'show_available_translations' => false,
                    ] 
                );
            ?></td>
        </tr>
    </table>
    <?php
}
add_action( 'show_user_profile', 'wpse_user_language' );
add_action( 'edit_user_profile', 'wpse_user_language' );

Notez qu'ici nous réutilisons le Langue du site string, car il est traduit.

La partie mise à jour est:

/**
 * Update the 'wp_lang' user settings
 */    
function wpse_user_language_save( $user_id ) 
{
    if( current_user_can( 'edit_user', $user_id ) && isset( $_POST['wpse_lang'] ) )
        return update_user_meta( $user_id, 'wpse_lang', $_POST['wpse_lang'] );
    return false;
}
add_action( 'personal_options_update', 'wpse_user_language_save' );
add_action( 'edit_user_profile_update', 'wpse_user_language_save' );

Voici un exemple de sortie:

wpse_lang selection

J'espère que vous pourrez adapter cela à vos besoins. Ce serait une bonne idée de regrouper cela dans une classe, où nous pourrions l'initialiser avec une configuration personnalisée et réutiliser des éléments pour de meilleures performances. Nous pourrions également envisager de supprimer le contrôle is_admin() pour l'appliquer également au serveur frontal, mais nous aurions peut-être besoin d'un contrôle is_user_logged_in() supplémentaire.

7
birgire