我有一个使用Wordpress的基于用户的网站, 并且可以从其个人资料设置中选择语言, 并且为user_meta中的每个用户设置了此信息和其他设置。
我知道如何翻译, 但是, 有没有办法以编程方式设置主题语言?
谢谢!
编辑:请没有插件, 我需要做的尽可能简单。
#1从WP 4.7开始, 你可以使用:
switch_to_locale('en_US');
参考:https://developer.wordpress.org/reference/functions/switch_to_locale/
#2我找到了不同的解决方案:
// Set user selected language by loading the lang.mo file
if ( is_user_logged_in() ) {// add local filter
add_filter('locale', 'language');
function language($locale) {
/* Note: user_meta and user_info are two functions made by me, user_info will grab the current user ID and use it for
grabbing user_meta */// grab user_meta "lang" value
$lang = user_meta(user_info('ID', false), 'lang', false);
// if user_meta lang is not empty
if ( !empty($lang) ) {
$locale = $lang;
/* set locale to lang */
}return $locale;
}// load textdomain and .mo file if "lang" is set
load_theme_textdomain('theme-domain', TEMPLATEPATH . '/lang');
}
通过:http://codex.wordpress.org/Function_Reference/load_theme_textdomain
#3我想出了以下解决方案, 因为我需要在相同请求范围内从插件以不同语言生成发票:
global $locale;
$locale = 'en_CA';
load_plugin_textdomain('invoice', false, 'my-plugin/languages/');
generateInvoice();
// produce the English localized invoice$locale = 'fr_CA';
load_plugin_textdomain('invoice', false, 'my-plugin/languages/');
generateInvoice();
// produce the French localized invoice
#4我想你正在寻找的是over_load_textdomain过滤器, 该过滤器仅在load_textdomain函数调用的开始处调用。
就像这样:
function my_load_textdomain ($retval, $domain, $mofile) {if ($domain != 'theme_domain')
return false;
$user = get_currentuserinfo()
$user_lang = get_user_lang($user);
if ($new_mofile = get_my_mofile($user_lang)) {
load_textdomain('theme_domain', $new_mofile);
return true;
}return false;
}
add_filter('override_load_textdomain', 'my_load_textdomain');
从大脑到键盘的代码, 未经测试。你应该再做一些验证等等。
#5我有一个类似的问题, 并这样解决:
就我而言, 我想使用用户语言环境来检索语言环境:$ userLocale = get_user_locale($ userObject-> ID);
我创建了一个自定义函数, 以使用动态语言环境加载正确的theme_textdomain。它与WP函数几乎相同, 但是你可以添加一个语言环境变量:
/**
* Loads text domain by custom locale
* Based on a WP function, only change is the custom $locale
* parameter so we can get translated strings on demand during runtime
*/
function load_theme_textdomain_custom_locale($domain, $path = false, $locale)
{
/**
* Filter a theme's locale.
*
* @since 3.0.0
*
* @param string $locale The theme's current locale.
* @param string $domain Text domain. Unique identifier for retrieving translated strings.
*/
$locale = apply_filters('theme_locale', $locale, $domain);
if (!$path) {
$path = get_template_directory();
}// Load the textdomain according to the theme
$mofile = "{$path}/{$locale}.mo";
if ($loaded = load_textdomain($domain, $mofile)) {
return $loaded;
}// Otherwise, load from the languages directory
$mofile = WP_LANG_DIR . "/themes/{$domain}-{$locale}.mo";
return load_textdomain($domain, $mofile);
}
基于:http://queryposts.com/function/load_theme_textdomain/
#6对我来说, 只有这两种解决方案共同起作用。
switch_to_locale($locale);
load_textdomain('example_domain', $mo_file_full_path);
#7【以编程方式设置WordPress语言()】实际上switch_to_locale对我不起作用, 并且在调试期间, 我发现load_textdomain导致内存不足致命错误:/
推荐阅读
- 以编程方式设置WordPress主菜单
- 设置WordPress主题-发布内容可使屏幕滚动
- 在wp_enqueue_style中为不同的媒体设置多CSS文件
- WP主题选项中带有容器的单独字段数组(Carbon Fields)
- 使用wp_login()钩子设置Cookie
- 将粘性帖子与主循环分开。 #WordPress
- 在WordPress中发布帖子时向用户发送电子邮件
- 搜索结果与搜索查询一起返回”随机数”
- STM32MP157开发板评测(华清远见FS-MP1A开发板初体验!)