2012-02-14 32 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