web-dev-qa-db-ja.com

ユーザーごとに異なるバックエンド言語

私は過去1時間インターネットを検索してきましたが、これを実行するための最新のものは見つかりません(すべての提案は、時代によって更新されていないプラグインに関するものです、 この質問 を参照)。 。

ユーザーごとに異なる バックエンド 言語を指定する方法はありますか?私はWPバックエンドが英語であるのが好きですが、私の同僚は全員自分の言語(イタリア語)で好きです。彼らと安心して暮らす方法はありますか?

あなたのメソッドがURLに依存せず(/?lang = itなど)、プラグインではなく、functions.php関数であれば、問題ありません。

ありがとう、素晴らしい新年をお過ごしください。

6
Orin Larrey

我々はフィルタリングすることを試みることができます WPLANGオプション  locale (例えば、右側の関連リストにあるこのアプローチを参照 by @brasofilo、これは this one by @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; 
} );    

現在のユーザーにwpse_langユーザーメタキーが設定されているかどうか、is_ISda_DKなどの値で確認します。

その後、ユーザー設定ページで、各ユーザーの言語選択を追加できます。

そこで、 wp_dropdown_languages() 関数を get_available_languages() 関数とともに使用して、使用可能な言語の選択ボックスを表示することができます。

これがカスタムユーザー設定を追加する方法についての@sanchothefatによる です。

ユーザー言語の選択は次のように表示できます。

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

ここでは Site Language という文字列を再利用しているので注意してください。

更新部分は次のとおりです。

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

これが出力例です。

wpse_lang selection

うまくいけばあなたはあなたのニーズに合わせてこれを調整することができます。これをクラスでラップして、カスタム設定で初期化し、パフォーマンスを向上させるために再利用できるようにすることをお勧めします。フロントエンドでもこれを適用するためにis_admin()チェックを削除することを検討するかもしれませんが、追加のis_user_logged_in()チェックが必要になるかもしれません。

7
birgire