以编程方式设置Wordpress语言?

时间:2011-11-23 01:33:55

标签: wordpress wordpress-theming

我有一个基于用户的WordPress网站,他们可以从他们的个人资料设置中选择语言,为user_meta中的每个用户设置此信息和其他设置。

我知道如何翻译但是,有没有办法以编程方式设置主题语言?

谢谢!

编辑:请不要插件,我需要尽可能简单。

8 个答案:

答案 0 :(得分:3)

我找到了一个不同的解决方案:

// 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

答案 1 :(得分:2)

我猜您正在寻找override_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');

从大脑到键盘的代码,未经测试。你应该做一些更多的验证。

答案 2 :(得分:2)

我提出了以下解决方案,因为我需要在同一请求的范围内从不同语言的插件生成发票:

    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

答案 3 :(得分:0)

我遇到了类似的问题并解决了这个问题:

  1. 在我的情况下,我想使用用户区域设置来检索区域设置:$userLocale = get_user_locale($userObject->ID);

  2. 我创建了一个自定义函数来加载带有动态区域设置的正确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);
    }
    
  3. 基于: http://queryposts.com/function/load_theme_textdomain/

答案 4 :(得分:0)

自WP 4.7起,您可以使用:

switch_to_locale('en_US');

参考:https://developer.wordpress.org/reference/functions/switch_to_locale/

答案 5 :(得分:0)

对我来说,只有这两种解决方案共同起作用。

switch_to_locale($locale);
load_textdomain('example_domain', $mo_file_full_path);

答案 6 :(得分:0)

实际上switch_to_locale对我不起作用,并且在调试期间,我发现load_textdomain导致内存不足致命错误:/

答案 7 :(得分:0)

有同样的问题,我是这样解决的:

第一步,您必须创建一个带有文本域的 .mo。您可以使用本地翻译插件:https://br.wordpress.org/plugins/loco-translate/

加载您的文本域链接 .mo 文件:

load_textdomain('your_text_domain', '/your/file.mo');

通过钩子更改 wordpress 位置。创建一个返回所需位置的函数。永远使用 Wordpress 语言环境 ID,您可以在此处查看所有语言环境 ID:https://wpastra.com/docs/complete-list-wordpress-locale-codes/

让我们编写函数:

function wpsx_redefine_locale($locale){
  
  return 'ja';
}
add_filter('locale','wpsx_redefine_locale',10);

您可以根据用户位置进行更改。这样 wordpress 设置了用户在其控制面板中设置的相同语言:

$user_locale = get_user_locale();
function wpsx_redefine_locale($locale){
  global $user_locale;
  return $user_locale;
}
add_filter('locale','wpsx_redefine_locale',10);

Obs:我的 wordpress 版本是 5.7。这种方式在其他版本中不起作用。好看!