不同用户使用不同的后端语言?

时间:2015-12-30 作者:Orin Larrey

我在互联网上搜索了一个小时,但找不到任何最新的方法(所有的建议都是关于很久没有更新的插件,请参阅this question).

有没有办法指定不同的back-end 不同用户的语言?我喜欢我的WP后端用英语,但我所有的同事都喜欢用他们自己的语言(意大利语),有没有办法和他们和平相处?

如果您的方法不依赖URL(/?lang=it等),并且不是插件,而是函数,则为您提供支持。php函数。

谢谢,祝你新年快乐!

1 个回复
最合适的回答,由SO网友:birgire 整理而成

我们可以尝试过滤WPLANG 选项区域设置(see e.g. this approach from the related list here on the right 作者@brasofilo,这是基于this one 作者@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_IS, da_DK, ...

然后,我们可以在用户设置页面上为每个用户添加语言选择。

在那里我们可以使用wp_dropdown_languages() 函数,具有get_available_languages() 函数,显示可用语言的选择框。

这是一个example 通过@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\' );
请注意,这里我们重复使用站点语言字符串,因为它是经过翻译的。

更新部分为:

/**
 * 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() 检查

相关推荐

Get users that likes the post

我有一个类似ajax的帖子系统,当用户喜欢帖子时,系统会在帖子中添加一个帖子元,并将其命名为(post\\u liked\\u users)。post\\u likes\\u users元值示例:a:1:{s:6:\"user-1\";i:1;}现在,如何才能获得喜欢该帖子的用户?注意:我不能像杰克·约翰逊那样只使用foreach答案,我必须使用WP\\u User\\u Query或WP\\u Query,因为我要使用offest和number。