【发布时间】:2010-08-31 17:44:22
【问题描述】:
我成功地使用 Gettext(称为 es.po 和 es.mo)制作了本地化文件。
据我所知,我可以通过在 wp-config.php 中定义 WPLANG 的值来更改语言(在这种情况下定义 ('WPLANG', 'es'); )
我希望用户通过单击链接来更改他/她的首选语言。
最好的方法是什么?
【问题讨论】:
我成功地使用 Gettext(称为 es.po 和 es.mo)制作了本地化文件。
据我所知,我可以通过在 wp-config.php 中定义 WPLANG 的值来更改语言(在这种情况下定义 ('WPLANG', 'es'); )
我希望用户通过单击链接来更改他/她的首选语言。
最好的方法是什么?
【问题讨论】:
我通过在 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', '');
这个页面会先检查浏览器的默认语言,然后设置语言。如果没有,用户还可以根据他们从帖子中选择的语言来设置语言。语言设置在会话变量中以保持整个访问的状态。
【讨论】:
我的 2 美分:我做了类似的事情,但我也从 URL 中删除了 ?lang=XX 参数。
在完成所有语言检测工作后,我在代码中执行 307 重定向,指向相同的 URL(删除了 ?lang=xxx 或 &lan=xxx),然后是 die()。这使得 URL 清除了 GET 变量,干净并且对于书签可能是安全的。
我还将语言偏好存储在 cookie 中,以便用户在下次访问时看到相同的语言。
【讨论】:
我最好的解决方案是...(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';
}
}
【讨论】: