yii将mysql表数据语言本地化到视图中

时间:2014-02-27 19:18:47

标签: php mysql yii localization

我打开了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;

所以我想知道还有其他更好的办法吗?

1 个答案:

答案 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,因为它有后备。