问题描述
我一直在互联网上搜索最后一个小时,但是我找不到任何 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_IS
,da_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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。