2014-02-27 43 views
0

我有yii語言本地化打開,所以我用在配置'language'=>'en', 和寫的東西,如Yii::t('layouts_main','Home')和商店翻譯Home在php文件中。 但除此之外,我有表格,並且裏面有不同語言的數據。 例如,我有一個國家的列表,必須以不同的語言存儲在MySQL表中。 表格結構非常簡單:id, name_en,name_de,name_es etc ... 我這樣做,所以如果語言改變這兩個字母必須控制從哪個賣書讀取名稱。yii語言本地化的MySQL表數據到視圖

在我的控制,我得到我的數據,從表到陣列

$tableCountry = Country::model()->findAll(); 

然後我做這樣的變量,它containt "name+"語言變量,它是在配置 $name_lang ="name_".Yii::app()->Language;

'en'所以現在我做了變量$name_lang其中包含name_en

然後我選擇合適的銷售使用$name_lang變量

$list=CHtml::listData($modelCountry,'id',$name_lang); 

僅使用$ name_lang name_en數據將轉到List。因此,稍後我可以將配置文件中的語言設置切換爲「de」,並且只有name_de數據將會轉到List。

所以一切都很好。 但如果我有複雜的表包含country_name_en,city_name_en,region_name_en等等

爲了把這個數據到名單上有使3級或更多的變量

$country_name_lang ="country_name_".Yii::app()->Language;

$city_name_lang ="city_name_".Yii::app()->Language;

$region_name_lang ="region_name_".Yii::app()->Language;

所以我想知道有沒有其他更好的方法來做這樣的事情?

+0

如果所有表格列都有語言後綴,則可以將其置於模型的默認範圍內 – tinybyte

+0

不是,不幸的是,並非所有的都有後綴。我的意思是有像'id','dateCreated'等列,他們沒有後綴。順便說一句,這個後綴也只是我關於如何做到這一點的想法,我的意思是如果有另一種方法,也許有可能做到這一點,甚至沒有?我只是不知道如何。這是我找到的唯一方法。它在工作,但只是認爲會有更好的方式來做到這一點。 – David

回答

3

選項1:您可以在模型中定義另一個名爲country_name的變量(不帶任何後綴)。你可以在模型中做到這一點,你不必在db中創建一個字段。不需要進行驗證或任何此變量。 然後在該模型的後find方法,你可以做

public function afterFind() 
{ 
    $this->country_name = $this->{"country_name_".Yii::app()->Language}; 
} 

隨意添加在這裏的一切。

現在無處不在,您應該可以毫無顧慮地使用$ model-> country_name語言。

選項2將使用魔術方法。你可以從他們在這裏閱讀更多:http://www.php.net/manual/en/language.oop5.magic.php 定義模型這樣的方法:

public function __call($name, $arguments) 
{ 
    if(isset($this->{$name. "_".Yii::app()->Language})) 
     return $this->{$name. "_".Yii::app()->Language} 
    elseif(isset($this->$name)) 
     return $this->{$name} 
    else 
     throw new Exception(xxx, 'We couldn\'t find the variable'); 
} 

現在,你應該能夠使用基於模型$> COUNTRY_NAME(),您將再次獲得該變量在適當的語言。你也可以使用$ model-> id(),如果沒有id_en字段,你也會得到正確的id,因爲它有一個後備。