問題描述
我一直在網際網路上搜尋最後一個小時,但是我找不到任何 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。
