如何通过单击链接(切换语言)更改Wordpress中的值WPLANG?

时间:2010-08-31 17:44:23

标签: wordpress gettext

我使用Gettext(称为es.po和es.mo)成功制作了本地化文件。

据我所知,我可以通过在 wp-config.php 中定义WPLANG的值来改变语言(在这种情况下定义('WPLANG','es');

我希望用户通过点击链接更改他/她的首选语言。

这样做的最佳方式是什么?

3 个答案:

答案 0 :(得分:3)

我是在http://www.treutech.com/files/wordpress/jLanguage.zip找到的jLanguage插件的基础上完成的。 *该插件已不再可以从作者的网站上获得,因此我正在托管我的更新版本。这允许您使用语法[english][/english]格式化博客帖子和页面。它将查询字符串传递给代码以了解要使用的语言。我开始修改代码,以便它使用标准的双字母语言代码。我也取消了代码用于表示各种语言的标志。但是,在所有这些之后,插件仍然只翻译页面或帖子。我希望根据用户的选择翻译网站的其余部分。

WordPress允许国际化;但是,一旦你选择了一种语言,你就会坚持使用它直到你手动更改它。所以我创建了wp-lang.php。它首先查看用户从可用语言链接中选择的语言,然后将其存储在SESSION变量中,以便状态将是持久的。最后,如果没有选择并且没有SESSION变量,代码将查看浏览器的默认语言。

现在,所有这些更改都取决于您是否下载了与网站上语言选择相对应的语言包。语言MO文件包含WordPress中所有函数名称的翻译。因此,如果用户登录管理面板,则会翻译所有内容。如果您的主题编码正确,那么您的菜单标题和元信息也将被翻译。毕竟,我修改了wp-config文件以包含wp-lang。现在设置的网站将在西班牙语和英语之间切换。

* WP-lang.php

 session_start();
 if ( isset( $_GET['lang'] ) ) {
    $_SESSION['WPLANG'] = $_GET['lang'];
    define ('WPLANG', $_SESSION[WPLANG]);
 } else {
    if(isset($_SESSION['WPLANG'])) {
        define ('WPLANG', $_SESSION['WPLANG']);
        $_GET['lang'] = $_SESSION['WPLANG'];
    } else {
        if ( isset( $_SERVER["HTTP_ACCEPT_LANGUAGE"] ) ) {
            $languages = strtolower( $_SERVER["HTTP_ACCEPT_LANGUAGE"] );
             $languages = explode( ",", $languages );
            $_SESSION['WPLANG'] = $languages[0];
            $_SESSION['WPLANG'] = str_replace("-", "_", $_SESSION['WPLANG']);
            $_GET['lang'] = substr($_SESSION['WPLANG'],0,2);
            define ('WPLANG', $_SESSION[WPLANG]);
        } else {
            define ('WPLANG', '');
        }
    }
 }

* wp-config.php - 找到定义常量WPLANG的部分。在WPLANG声明之前添加以下行。

 require_once(dirname(__FILE__).'/wp-lang.php');
 define ('WPLANG', ''); 

此页面将首先检查浏览器的默认语言,然后设置语言。如果没有,用户还可以根据他们从帖子中选择的语言来设置语言。语言在会话变量中设置,以保持整个访问的状态。

答案 1 :(得分:2)

我的2美分:我做了类似的事情,但我也从网址中删除了?lang=XX参数。

完成语言检测的所有工作后,我在代码中执行307重定向,到相同的URL(从?lang=xxx&lan=xxx中删除),然后die() 。这使得URL清除GET变量,干净且可能对书签安全。

此外,我将语言偏好设置存储在cookie中,以允许用户在下次访问时看到相同的语言。

答案 2 :(得分:0)

我最好的解决方案是......(session_start();在上面)

if( !isset( $_GET['lang'] ) && isset($_SESSION['WPLANG']) ) {
        define ('WPLANG', $_SESSION['WPLANG']);
} else {

    if ( !isset( $_GET['lang'] ) ) {
      if ( isset( $_SERVER["HTTP_ACCEPT_LANGUAGE"] ) ) {
        $languages = strtolower( $_SERVER["HTTP_ACCEPT_LANGUAGE"] );
        $languages = explode( ",", $languages );
        $wplang = str_replace("-", "_", $languages[0]);
        $_GET['lang'] = substr($wplang,0,2);
      }
    }

    $language = isset( $_GET['lang'] ) ? htmlspecialchars($_GET['lang'], ENT_QUOTES) : 'es';
    switch ( $language ) {
        case 'en':
            define( 'WPLANG', 'en_US' );
            $_SESSION['WPLANG'] = 'en_US';
        break;

        case 'es':
        default:
            define( 'WPLANG', 'es_ES' );
            $_SESSION['WPLANG'] = 'es_ES';
    }

}