在没有多站点的情况下更改界面语言

时间:2014-05-14 作者:Mayeenul Islam

我想通过将langauage参数传递到URL中来更改主题的接口语言,而不创建多站点。

<a href="<?php echo home_url(\'/\')?lang=bn ?>">Bengali</a>
我的想法是使用以下代码:

if(get_query_var(\'bn\')) {

    /**
     * CHANGE THE \'WPLANG\' IN wp-config.php TO bn_BD ON THEME SWITCHING
     * Thanks: toscho
     * Source: http://wordpress.stackexchange.com/a/121136/22728
     * -------------------------------------------------- */

    add_filter( \'locale\', \'toscho_change_language\' );

    function toscho_change_language( $locale ) {
        return \'bn_BD\';
    }

}
带支票isset() URL中的参数,加载此代码块。并使用主题的语言文件bn_BD.

但我对逻辑过程很好奇:

这个概念行吗

2 个回复
最合适的回答,由SO网友:gmazzap 整理而成

2关于your own answer:

尽量不要直接访问超级全局变量,而是使用filter_input$_GET[\'lang\'] 未设置,因此可以改进代码:

function toscho_change_language() {
    return \'bn_BD\';
}

if ( filter_input( INPUT_GET, \'lang\', FILTER_SANITIZE_STRING ) === \'bn\' ) {
  add_filter( \'locale\', \'toscho_change_language\' );
}
或者如果您的服务器有PHP 5.3+

if ( filter_input( INPUT_GET, \'lang\', FILTER_SANITIZE_STRING ) === \'bn\' ) {
  add_filter( \'locale\', function() { return \'bn_BD\'; } );
}
最后,如果您认为将来可能需要支持其他语言,您可以用一种易于扩展的方式编写函数:

function gm_change_language( $locale ) {
    $langs = array(
       \'bn\' => \'bn_BD\',
       \'sw\' => \'sw_TZ\' // Tanzania Swahili 
    );
    $l = strtolower( filter_input( INPUT_GET, \'lang\', FILTER_SANITIZE_STRING ) );
    return $l && array_key_exists( $l, $langs ) ? $langs[$l] : $locale; 
}

add_filter( \'locale\', \'gm_change_language\' );
此代码的问题是,单击内部链接时,语言参数丢失。一种可能的解决方案是使用cookie存储语言。

我将对最后一个代码段应用此改进,但也可以在前面的代码段中使用。

function gm_change_language( $locale ) {
    $langs = array(
       \'bn\' => \'bn_BD\',
       \'sw\' => \'sw_TZ\' // Tanzania Swahili 
    );
    $l = filter_input( INPUT_GET, \'lang\', FILTER_SANITIZE_STRING );
    if ( ! empty( $l ) ) {
       setcookie ( \'my_theme_lang\', $l, 0 );
    } else {
       $l = filter_input( INPUT_COOKIE, \'my_theme_lang\', FILTER_SANITIZE_STRING );
    }
    return $l && array_key_exists( $l, $langs ) ? $langs[$l] : $locale; 
}

add_filter( \'locale\', \'gm_change_language\' );
当然,正如你所说,你需要translate 您的主题并使用加载texdomainload_theme_textdomain.

而且,这只是给未来读者的一个提示,为了能够翻译主题中的字符串,所有这些字符串都必须使用i18n functions.

SO网友:Mayeenul Islam

Trigger in template:

<a href="?lang=bn">BN</a>|<a href="<?php echo home_url(); ?>">EN</a>

Code in functions.php:

function toscho_change_language( $locale ) {
    return \'bn_BD\';
}

if( $_GET[\'lang\'] && $_GET[\'lang\'] == \'bn\' ) add_filter( \'locale\', \'toscho_change_language\' );
要准备好主题翻译,请执行以下操作:

load_theme_textdomain( \'your-theme\', get_template_directory() . \'/lang\' );
我把我的翻译文件bn_BD.po (使用Poedit) 在我的主题中lang 文件夹还有雅拉!

结束

相关推荐

Multi language site

我发现两个最流行的多语言网站插件是WMPL和qTranslate。第一个是商业化的,所以这不是选项,第二个没有能力翻译边栏中的小部件,或者我不知道怎么做。你能建议我使用哪个插件,或者使用什么技巧来实现多语言小部件吗?