我想根据用户在个人资料(下拉菜单)中的选择更改WordPress安装的语言。
由于我想更改前端(为主题准备的.mo文件)和后端语言,我想我可以更改$locale
变量,它会成功的。
所以我在我的functions.php
但这不起作用:
function change_lang() {
get_currentuserinfo();
$lang = get_user_meta($current_user->ID, \'user_lang\');
$locale = $lang[0];
return $locale;
}
add_filter(\'locale\', \'change_lang\');
当我返回
$locale
, WP返回一个简单
NULL
, 没什么了。当我释放挂钩时,定义的值
WP_LANG()
已返回。
所以,我在某个地方显然错了,但我找不到哪里。有什么提示吗?
此外:I read this for inspiration and code, 但如果可能的话,我不想把它作为插件。
提前感谢!
Edit: 修复了我的代码,但仍然没有发生语言更改。
最合适的回答,由SO网友:cybmeta 整理而成
您对的使用$current_user
有点错误,您应该包括global $current_user
或者将其分配给变量,或者更短、更干净get_current_user_id()
:
add_filter(\'locale\', \'change_lang\');
function change_lang( $locale ) {
if( $lang = get_user_meta( get_current_user_id(), \'user_lang\', true) ) {
return $lang;
}
return $locale;
}
SO网友:marciofao
我的插件也有类似的问题,但这里什么都不起作用。
经过几天的调查。我已经意识到,不可能将当前用户放入过滤器“locale”中。甚至不打电话给全球$user_locale
.
显然,钩子“locale”是在init或其他任何东西之前触发的。
毕竟,在设置语言环境之前,我发现我正在加载插件文本域。所以,之后马上打电话switch_to_locale()
已修复问题。
这对我很有用:
function set_user_locale(){
switch_to_locale(get_user_locale());
load_plugin_textdomain( \'plugin-texdomain\', false, dirname( plugin_basename( __FILE__ ) ) . \'/languages\' );
}
add_filter(\'init\', \'set_user_locale\');