我正在运行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];
}
答案 0 :(得分:2)
如果是我,我会使用cookie而不是将其存储在数据库中。它会更快更容易管理。
大多数用户不会删除cookie,至少不会删除所有常常。它可以解决您的问题:“我无法加载数据库以查找用户是否具有首选语言”。
如果您需要数据库存储,可以尝试使用Hook: http://codeigniter.com/user_guide/general/hooks.html
在“post_controller_constructor”挂钩中,加载用于语言存储的数据库模型,获取用户设置的语言并加载所需的语言文件。