問題描述

我一直在互聯網上搜索最後一個小時,但是我找不到任何 up-to-date 來做這個 (所有的建議都是關於年齡未更新的插件,請參閲 this question) 。

有沒有辦法為不同的用户指定不同的 back-end 語言?我喜歡我的 WP back-end 英文,但我所有的同事都喜歡用自己的語言 (意大利語),有沒有辦法和他們一起生活?

道具如果你的方法不依賴於 URL(/?lang = it 等等),而不是一個插件,而是一個 functions.php 函數。

謝謝,有一個偉大的新年!

最佳解決方案

我們可以嘗試通過 @brasofilo 過濾 WPLANG 選項區域設置 (see e.g. this approach from the related list here on the right,這是由 @toscho 基於 this one):

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

在那裏我們檢查當前用户是否具有 wpse_lang 用户元鍵集,其值如 is_ISda_DK,…

然後,我們可以在用户設置頁面上為每個用户添加語言選擇。

我們可以使用 wp_dropdown_languages()功能與 get_available_languages()功能來顯示可用語言的 select-box 。

以下是 @sanchothefat 的 example,我們可以如何添加自定義用户設置。

我們可以顯示用户語言選擇:

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

請注意,在這裏我們 re-use 的網站語言字符串,因為它被翻譯。

更新部分是:

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

以下是一個示例輸出:

希望您可以根據自己的需要進行調整。這將是一個好主意,將其包裝在一個類中,我們可以使用自定義設置和 re-use 進行初始化,以獲得更好的性能。我們也可以考慮刪除 is_admin()檢查以將其應用於 front-end,但是我們可能需要額外的 is_user_logged_in()檢查。

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。