是否在运行时手动更改区域设置?

时间:2012-04-18 作者:KodeFor.Me

我想知道,有没有办法使用WordPress在运行时更改语言环境?

我的意思是,我创建了一个自定义URL,以便创建一个包含数据的XML文件,以便与另一个web应用程序集成。URL还有一个语言部分。假设这是我的URL

http://example.com/custom/url/en

其中URL的最后一部分是英语。在这种情况下,我喜欢使用WordPress生成英文XML。但我如何指示WordPress在执行时更改语言环境呢?

请注意,我必须更改区域设置,因为我还使用已翻译的系统变量,如us _u()、\\u e()等。

3 个回复
SO网友:Manu

我正在尝试做一件类似的事情,wp黑客邮件列表(Otto,Nacin)上的专家告诉我:

不要试图更改WPLANG,您无法更改定义的常量。相反,请更改全局$locale,或在“locale”上设置筛选器。

因此,最好的解决方案是对“locale”全局变量应用过滤器。唯一的方法是创建一个自定义插件。如果将以下代码放入functions.php 文件,它将无法正常工作,因为它将在WP加载序列中运行得太晚。

你的插件可能是这样的(我只是重复使用OneTrickPony的URI测试部分,你可以用另一种条件测试方法替换它):

<?php
/*
Plugin Name: Change locale at runtime
Plugin URI: http://wordpress.stackexchange.com/questions/49451/change-locale-at-runtime
*/

function wpsx_redefine_locale($locale) {
    // run your tests on the URI
        $lang = explode(\'/\', $_SERVER[\'REQUEST_URI\']);
        // here change to english if requested
        if(array_pop($lang) === \'en\'){
          $locale = \'en_US\';
        // otherwise stick to your default language
        }else{
          $locale = \'gr_GR\';
        }
    return $locale;
}
add_filter(\'locale\',\'wpsx_redefine_locale\',10);  
?>
我希望这可以帮助任何人!

关于切换区域设置时的性能成本,还有一些警告(引用Andrew Nacin的话):

在加载默认语言环境后,可以“切换”一个语言环境,但我建议不要这样做,因为这样做效率很低,除非您的默认语言是英语,在这种情况下,英语还不错。

默认textdomain文件在plugins_loadedsetup_theme, 但在加载主题之前after_setup_theme 火灾。在上加载英语,然后将textdomain重新加载为德语init 钩子会很好,性能方面,因为英语没有mo文件。但在默认情况下加载西班牙语,然后切换到德语则不行。

看见http://codex.wordpress.org/Plugin_API/Action_Reference 有关加载顺序的有用信息。

SO网友:onetrickpony

我不知道在插件中是否可以做到这一点,因为WP需要在某个点之前定义常量,但请在WP config中检查请求的语言。php并定义必要的常量:

// split URI
$lang = explode(\'/\', $_SERVER[\'REQUEST_URI\']);

// here change to english if requested
if(array_pop($lang) === \'en\'){
  define(\'WPLANG\', \'en_US\');

// otherwise stick to your default language
}else{
  define(\'WPLANG\', \'gr_GR\');
}

SO网友:T.Todua

首先,确保所需的区域设置为in a list (根据“has a language pack“”。如果确认,则使用该代码:

//set desired locale
add_filter( \'locale\', function($locale) {
    if ( !is_admin() ) 
        $locale = "zh_TW";
    return $locale;
});
如果尚未在WP dashboard中选择该语言,则可能需要以编程方式使用安装程序挂钩:

//check if it\'s not install, then install
add_action(\'wp\', \'my_locale_implemention\');
function my_locale_implemention()
{
    $my_locale = get_locale();  //get_user_locale
    if ( !empty($my_locale) && !in_array( $my_locale, get_available_languages() ) ) {
        require_once( ABSPATH . \'wp-admin/includes/file.php\' );
        require_once( ABSPATH . \'wp-admin/includes/translation-install.php\' );
        $language = wp_download_language_pack( $my_locale );
        if ( $language ) {
            if(empty($_POST)) header("location: ".$_SERVER[\'REQUEST_URI\']); exit; //reload page
        }
    }
}

结束

相关推荐

Plugin Localization

我刚刚为wp构建了我的第一个插件,即使它不是一个伟大的“代码诗意”;)它正常工作。这是一个使用GalleryView 3.0 jquery插件转换默认wp库的插件(http://spaceforaname.com/galleryview).我唯一不能做的就是本地化。此插件的本地化意味着转换管理界面,在这里可以配置jquery插件选项来更改结果库的外观。我试着关注网络上数百万的教程,在论坛上阅读了很多关于这个问题的帖子,并遵循了codex的指南。。。但仍然没有运气。这就是我所做的:每个文本行都位于gette