Php yii语言将mysql表数据本地化为视图
我已经打开了yii语言本地化,所以我在配置中使用了Php yii语言将mysql表数据本地化为视图,php,mysql,yii,localization,Php,Mysql,Yii,Localization,我已经打开了yii语言本地化,所以我在配置中使用了'language'=>'en', 编写类似于Yii::t('layouts\u main','Home')的内容,并将Home的翻译存储在php文件中。 但除此之外,我还有表格,里面有不同语言的数据。 例如,我有一个必须以不同语言存储在mysql表中的国家列表。 表结构非常简单:id、name\u en、name\u de、name\u es等等。。。 我是这样做的,所以如果语言发生变化,这两个字母必须控制从哪一个sell读取名称 在我的控制器
'language'=>'en',
编写类似于Yii::t('layouts\u main','Home')
的内容,并将Home
的翻译存储在php文件中。
但除此之外,我还有表格,里面有不同语言的数据。
例如,我有一个必须以不同语言存储在mysql表中的国家列表。
表结构非常简单:id、name\u en、name\u de、name\u es
等等。。。
我是这样做的,所以如果语言发生变化,这两个字母必须控制从哪一个sell读取名称
在我的控制器中,我从表到数组获取数据
$tableCountry = Country::model()->findAll();
然后我制作这样一个变量,它将包含“name+”
语言变量,在config中是'en'
$name_lang=“name_.”Yii::app()->语言代码>
所以现在我制作了变量$name\u lang
,它包含name\u en
然后我使用$name\u lang
变量选择正确的销售
$list=CHtml::listData($modelCountry,'id',$name_lang);
使用$name\u lang时,只有name\u en数据才会进入列表。所以,稍后我可以将配置文件中的语言设置切换到“de”,并且只有name_de data将fgo添加到列表中
所以这里一切都很好。
但如果我有一个复杂的表,它包含国家、城市、地区等等
要将这些数据放入列表中,我必须生成3个或更多变量
$country\u name\u lang=“country\u name”。Yii::app()->语言代码>
$city\u name\u lang=“city\u name”。Yii::app()->语言代码>
$region\u name\u lang=“region\u name”。Yii::app()->语言代码>
所以我想知道还有其他更好的方法来做这些事情吗?选项1:您可以在模型中定义另一个名为country\u name(无任何后缀)的变量。您可以在模型中执行此操作,而不必在数据库中创建字段。此变量不需要验证或任何操作。
然后在模型的find方法中,您可以执行以下操作
public function afterFind()
{
$this->country_name = $this->{"country_name_".Yii::app()->Language};
}
请随意在这里添加所有内容
现在,无论在哪里,您都可以使用$model->country\u name,而不必关心语言是什么
选择2是使用神奇的方法。您可以在此处阅读更多内容:
为您的模型定义这样一种方法:
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,因为如果没有id字段,它会有一个回退。选项1:您可以在模型中定义另一个名为country\u name(无任何后缀)的变量。您可以在模型中执行此操作,而不必在数据库中创建字段。此变量不需要验证或任何操作。
然后在模型的find方法中,您可以执行以下操作
public function afterFind()
{
$this->country_name = $this->{"country_name_".Yii::app()->Language};
}
请随意在这里添加所有内容
现在,无论在哪里,您都可以使用$model->country\u name,而不必关心语言是什么
选择2是使用神奇的方法。您可以在此处阅读更多内容:
为您的模型定义这样一种方法:
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,因为如果没有id字段,它会有一个回退。选项1:您可以在模型中定义另一个名为country\u name(无任何后缀)的变量。您可以在模型中执行此操作,而不必在数据库中创建字段。此变量不需要验证或任何操作。
然后在模型的find方法中,您可以执行以下操作
public function afterFind()
{
$this->country_name = $this->{"country_name_".Yii::app()->Language};
}
请随意在这里添加所有内容
现在,无论在哪里,您都可以使用$model->country\u name,而不必关心语言是什么
选择2是使用神奇的方法。您可以在此处阅读更多内容:
为您的模型定义这样一种方法:
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,因为如果没有id字段,它会有一个回退。选项1:您可以在模型中定义另一个名为country\u name(无任何后缀)的变量。您可以在模型中执行此操作,而不必在数据库中创建字段。此变量不需要验证或任何操作。
然后在模型的find方法中,您可以执行以下操作
public function afterFind()
{
$this->country_name = $this->{"country_name_".Yii::app()->Language};
}
请随意在这里添加所有内容
现在,无论在哪里,您都可以使用$model->country\u name,而不必关心语言是什么
选择2是使用神奇的方法。您可以在此处阅读更多内容:
为您的模型定义这样一种方法:
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,因为如果没有id字段,它会有一个回退。如果您的所有表列都有语言后缀,您可以将其放在模型的默认范围中。不幸的是,并非所有表列都有后缀。我的意思是有像“id”、“dateCreated”之类的列,它们没有后缀。顺便说一句,这个后缀也是我关于如何做的想法,我的意思是,如果有另一种方法,也许即使没有它也可以做?我只是不知道怎么做。这是我唯一想到的方法。这是可行的,但我认为会有更好的方法。如果所有表列都有语言后缀,您可以将其放在模型的默认范围中。不幸的是,并非所有表列都有后缀。我的意思是有像“id”、“dateCreated”之类的列,它们没有后缀。顺便说一句,这个后缀也是我关于如何做的想法,我的意思是,如果有另一种方法,也许即使没有它也可以做?我只是不知道怎么做。这是我唯一想到的方法。它正在工作,但我认为会有更好的方法来完成它。如果您的所有表列都有语言后缀,您可以将其放入