我打开了yii语言本地化,所以我在config 'language'=>'en',
中使用
并编写Yii::t('layouts_main','Home')
之类的内容,并将Home
的翻译存储在php文件中。
但除此之外,我有表格,里面有不同语言的数据。
例如,我有一个国家列表,必须以不同语言存储在mysql表中。
表结构非常简单:id, name_en,name_de,name_es
等......
我是这样做的,所以如果语言改变,那两个字母必须控制哪个卖出来读取名字。
在我的控制器中,我从表到数组获取数据
$tableCountry = Country::model()->findAll();
然后我正在制作这样的变量,它会在配置中包含"name+"
语言变量'en'
$name_lang ="name_".Yii::app()->Language;
所以现在我创建了包含$name_lang
name_en
然后我使用$name_lang
变量
$list=CHtml::listData($modelCountry,'id',$name_lang);
仅使用$ name_lang name_en数据将转到List。所以稍后我可以将配置文件中的语言设置切换为“de”,只有name_de数据会转到列表。
所以一切都很好。 但是如果我有复杂的表包含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 :(得分:3)
选项1:您可以在模型中定义另一个名为country_name的变量(不带任何后缀)。您可以在模型中执行此操作,您也不必在数据库中创建字段。无需验证或此变量的任何内容。 然后在你的模型的后查找方法中你可以做
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');
}
现在你应该能够使用$ model-> country_name(),你将再次使用正确的语言获取变量。您也可以使用$ model-> id(),如果没有id_en字段,您也会获得正确的ID,因为它有后备。