【问题标题】:CodeIgniter 2.1 internationalization i18n - Override default language if user data existsCodeIgniter 2.1 国际化 i18n - 如果存在用户数据,则覆盖默认语言
【发布时间】:2012-02-14 19:26:01
【问题描述】:

我正在运行 CI 版本 2.1,并且我最近安装了 CodeIgniter 2.1 国际化 i18n(原作者:Jérôme Jaglale)。代码说明在这里: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]; 
}

【问题讨论】:

  • 请记住,在 lang() 方法中,必须添加用于发送包含所选“lang”值的 cookie 的代码。

标签: php codeigniter


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多