CodeIgniter 2.1 internationalization i18n - 如果存在用户数据,则覆盖默认语言

时间:2012-02-14 19:26:02

标签: php codeigniter

我正在运行CI 2.1版,我最近安装了CodeIgniter 2.1 internationalization i18n(原作者:JérômeJaglale)。代码说明如下:http://codeigniter.com/wiki/URI_Language_Identifier/

它运行正常但我想覆盖默认语言,如果用户在之前访问网站时设置了他的语言首选项(这将存储在数据库的表中)。

我的问题是,你是怎么做到的?

我相信MY_Lang.php(加载了默认语言)实际上是在CodeIgniter MY_Controller之前加载的,所以我无法加载数据库来查找用户是否有首选语言。

默认语言在MY_Lang.php处配置:

function default_lang()
{
    $browser_lang = !empty($_SERVER['HTTP_ACCEPT_LANGUAGE']) ? strtok(strip_tags($_SERVER['HTTP_ACCEPT_LANGUAGE']), ',') : '';
    $browser_lang = substr($browser_lang, 0,2);
    $default_lang = array_splice(array_keys($this->languages), 0,1); 
    return (array_key_exists($browser_lang, $this->languages)) ? $browser_lang : $default_lang[0]; 
}

但是,我无法覆盖它,因为我无法访问$this->session->userdata('language')

提前致谢!


在这里回答:


发现您可以使用本机PHP cookie来读取MY_Lang.php文件中的cookie。如果您尝试使用cookie帮助程序,它将无法正常工作,因此请确保使用$ _COOKIE代替并在获取内容之前运行相应的过滤器。

然后,在MY_Lang.php中更改此内容:

return (array_key_exists($browser_lang, $this->languages)) ? $browser_lang : $default_lang[0]; 

对此:

if($_COOKIE['int_lang']) {
$preferred_lang = filter_var($_COOKIE['int_lang'], FILTER_SANITIZE_STRING);
return (array_key_exists($preferred_lang, $this->languages)) ? $preferred_lang : $default_lang[0];
}
else
{
return (array_key_exists($browser_lang, $this->languages)) ? $browser_lang : $default_lang[0]; 
}

1 个答案:

答案 0 :(得分:2)

如果是我,我会使用cookie而不是将其存储在数据库中。它会更快更容易管理。

大多数用户不会删除cookie,至少不会删除所有常常。它可以解决您的问题:“我无法加载数据库以查找用户是否具有首选语言”。

如果您需要数据库存储,可以尝试使用Hook: http://codeigniter.com/user_guide/general/hooks.html

在“post_controller_constructor”挂钩中,加载用于语言存储的数据库模型,获取用户设置的语言并加载所需的语言文件。