2012-02-14 28 views
3

我正在运行CI版本2.1,并且最近安装了CodeIgniter 2.1国际化i18n(原作者:JérômeJaglale)。代码说明在这里:http://codeigniter.com/wiki/URI_Language_Identifier/CodeIgniter 2.1国际化i18n - 如果用户数据存在,则覆盖默认语言

它运行良好,但我想重写默认语言,如果用户在上次访问网站时设置他的语言偏好(这将存储在数据库中的表中)。

我的问题是,你是如何做到这一点的?

我相信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 cookies读取里面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]; 
} 
+0

请记住,在lang()方法中,必须添加用于发送包含所选“lang”值的cookie的代码。 – Henry8 2014-03-24 19:04:27

回答

2

如果是我,我会使用Cookie来,与其在数据库中存储如此。这将更快,更容易管理。

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

如果你需要的数据库存储,你可以尝试用挂钩: http://codeigniter.com/user_guide/general/hooks.html

在“post_controller_constructor”挂钩,加载时使用的语言存储数据库模型,让用户设置语言和加载你想要的语言文件。

+0

谢谢condradk,会做! – 2012-02-15 08:32:12