it-swarm.com.de

Unterschiedliche Backend-Sprache für unterschiedliche Benutzer?

Ich habe in der letzten Stunde im Internet gesucht, aber ich kann nichts aktuelles finden, um dies zu tun (alle Vorschläge beziehen sich auf Plugins, die seit Ewigkeiten nicht mehr aktualisiert wurden, siehe diese Frage ). .

Gibt es eine Möglichkeit, eine andere Back-End Sprache für verschiedene Benutzer anzugeben? Ich mag es, wenn mein WP Back-End auf Englisch ist, aber alle meine Mitarbeiter bevorzugen es in ihrer eigenen Sprache (Italienisch). Gibt es eine Möglichkeit, in Frieden mit ihnen zu leben?

Requisiten, wenn Ihre Methode nicht auf URLs (/? Lang = it und so weiter) basiert und kein Plugin, sondern eine functions.php-Funktion ist.

Danke, ein tolles neues Jahr!

6
Orin Larrey

Wir könnten versuchen, das zu filtern WPLANG option  locale (siehe z. B. diesen Ansatz aus der Themenliste hier rechts von @brasofilo, der auf diesem von @toscho basiert):

/**
 * 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; 
} );    

hier prüfen wir, ob für den aktuellen Benutzer der Metaschlüssel für den wpse_lang-Benutzer mit Werten wie is_IS, da_DK, ... festgelegt ist.

Dann können wir die Sprachauswahl für jeden Benutzer auf der Seite mit den Benutzereinstellungen hinzufügen.

Dort könnten wir die Funktion wp_dropdown_languages() mit der Funktion get_available_languages() verwenden, um das Auswahlfeld für verfügbare Sprachen anzuzeigen.

Hier ist ein Beispiel von @sanchothefat, wie wir benutzerdefinierte Benutzereinstellungen hinzufügen können.

Wir können die Auswahl der Benutzersprache anzeigen mit:

/**
 * 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' );

Beachten Sie, dass wir hier die Zeichenfolge Site Language wiederverwenden, da diese übersetzt ist.

Der Update-Teil ist:

/**
 * 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' );

Hier ist eine Beispielausgabe:

 wpse_lang selection 

Hoffentlich können Sie dies an Ihre Bedürfnisse anpassen. Es wäre eine gute Idee, dies in eine Klasse zu packen, in der wir es mit einem benutzerdefinierten Setup initialisieren und Dinge für eine bessere Leistung wiederverwenden könnten. Wir könnten auch erwägen, die is_admin()-Prüfung zu entfernen, um dies auch auf das Front-End anzuwenden, aber dann benötigen wir möglicherweise eine zusätzliche is_user_logged_in()-Prüfung.

7
birgire