2013-03-10 15 views
0

我找不到這個問題的答案...我正在製作一個基於Codeigniter和MySQL數據庫的多語言網站。對於靜態語言文本,我使用內置的lang函數,並根據URL/en// fr/...的第一段加載相應的語言文件,但是如何加載並顯示相應的數據從數據庫?我怎樣才能保存數據庫中的數據?我有產品表,一半的條目是數值,但另一半是應保存在2或3種語言中的文本。如何使用Codeigniter從多語言網站的數據庫中讀取不同的條目?

我有我的邏輯來保持name_en和name_fr,description_en和description_fr ...所有這些在同一個表中,所以我會加倍這些行,因爲我添加新的語言。 當我將做一個Select查詢時,我會將段「en」傳遞給查詢並在name_或description_結尾處進行concanate,以便它變成name_en或description_fr或category_es。

我希望有更好的辦法,並且你們中有些人已經與我一起工作,這將幫助我通過。

回答

0

我正在使用兩個表來支持multilangage。第一個表格包含項目字段。例如日期,投票等。語言字段的第二個表格。

CREATE TABLE `item` (
    `item_id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `nested_category_id` int(11) DEFAULT NULL, 
    `image_file` varchar(100) NOT NULL, 
    `date` varchar(0) DEFAULT NULL, 
    PRIMARY KEY (`item_id`) 
); 

CREATE TABLE `item_lang` (
    `item_lang_id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `lang_id` varchar(2) NOT NULL, 
    `item_id` int(11) unsigned NOT NULL, 
    `url_name` varchar(255) NOT NULL DEFAULT '', 
    `meta_title` varchar(255) DEFAULT NULL, 
    `meta_description` text, 
    `meta_keywords` varchar(255) DEFAULT NULL, 
    `name` varchar(255) NOT NULL, 
    `title` varchar(255) DEFAULT NULL, 
    `description` text, 
    PRIMARY KEY (`item_lang_id`) 
); 

如果你需要連續試試這樣的話。

function get_row($id, $lg='tr'){ 

     $arr = array($id, $lg); 

     $sql = " SELECT ".$this->_table.".*, ".$this->_table_lang.".* 
        FROM ".$this->_table." 
       LEFT JOIN ".$this->_table_lang." 
         ON ".$this->_table.".".$this->_table."_id = ".$this->_table_lang.".".$this->_table."_id 
        WHERE ".$this->_table.".".$this->_table."_id = ? 
         AND ".$this->_table_lang.".lang_id=?"; 

     $data = $this->db->query($sql, $arr); 

     return ($data->row()); 
    } 
+0

這是我指出的更優化的解決方案嗎?實際上,我在網站上保留了多少行,因爲我在網站上有語言? – MarkC 2013-03-10 21:11:21

+0

我認爲你必須在表格列中使用變量值。不在表名中。它對未來不是一個好策略。 – 2015-02-23 10:44:23