Localization Yii本地化-CDbMessageSource示例
我是Yii的新手。官方文档没有给出CDbMessageSource的任何示例。 问题: 1) 如何/在何处将CDbMessageSource设置为我的MessageSource 2) 在我当前的应用程序中,我将类别存储在一个表中,并将类别的翻译存储在另一个表中。表结构:Localization Yii本地化-CDbMessageSource示例,localization,yii,Localization,Yii,我是Yii的新手。官方文档没有给出CDbMessageSource的任何示例。 问题: 1) 如何/在何处将CDbMessageSource设置为我的MessageSource 2) 在我当前的应用程序中,我将类别存储在一个表中,并将类别的翻译存储在另一个表中。表结构: CATEGORY ---------- cat_id (PK) CATEGORY_TRANSLATION -------------------- cat_id (FK) en ru 现在,如果我引入子类别,
CATEGORY
----------
cat_id (PK)
CATEGORY_TRANSLATION
--------------------
cat_id (FK)
en
ru
现在,如果我引入子类别,我将以这种方式对DB建模:
SUB_CATEGORY
------------
sub_cat_id (PK)
cat_id (FK)
SUB_CATEGORY_TRANSLATION
------------------------
sub_cat_id (FK)
en
ru
我是否正确理解,在Yii中,如果我想使用CDbMessageSource存储翻译,那么我需要将CATEGORY&SUB_CATEGORY合并到一个表中,然后将CATEGORY_TRANSLATION&SUB_CATEGORY_TRANSLATION合并到另一个表中,从而得到以下结构(取自此处):
谢谢大家! 如何启用CDbMessageSource
消息源是名为“messages”的。因此,您可以像应用程序配置文件中的任何其他组件一样配置它:
array(
......
'components'=>array(
......
'messages'=>array(
'class'=>'CDbMessageSource',
// additional parameters for CDbMessageSource here
),
),
),
)
消息源和可本地化模型——不是理想的关系
重要的是要记住,消息源只提供已知消息的翻译。在模型本地化中包含消息源没有多大意义,因为您将如何利用它
假设您有一个id为1的类别。你如何获得它的本地化标题?类似于Yii::t('category'、'title.'.$category->id)
的东西可以工作,但它有点笨拙(不需要语法,您必须将主键信息“烘焙”到显示代码中,等等)。如果你的标题本地化也意味着用户可以修改,这将变得更加复杂。(在任何情况下,如果您想这样做,那么合并两个翻译表并在填充SourceMessage.category
时使用一个单独的值将是最好的选择)
本地化模型的另一种方法
下面简要介绍了如何方便地本地化模型。假设我们有一个房间
模型,该模型具有可本地化的名称
属性。您可以创建一个名为LocalizedString
的新表以及具有类似以下结构的相应模型:
CREATE TABLE IF NOT EXISTS `localized_string` (
`Id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`LocaleCode` char(5) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`StringTemplate` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`Id`,`LocaleCode`),
);
然后,使用LocalizedString
上的关系配置您的Room
模型:
public function relations()
{
$localeCode = Yii::app()->getLanguage();
return array(
'nameStringTemplate' => array(
self::BELONGS_TO, 'LocalizedString', 'NameStringTemplateId',
'condition' => 'nameStringTemplate.LocaleCode = \''.$localeCode.'\''),
);
}
并添加只读属性:
public function getName() {
return $this->nameStringTemplate->StringTemplate;
}
通过这样做,您现在可以在任何地方编写$room->name
,并自动获取应用程序当前语言的本地化翻译
有很多细节需要注意,我在这里已经谈到了,但这个想法应该是显而易见的。谢谢你,乔恩。如果我采用第二种方法,那么就根本不需要CDbMessageSource了?@JevgenijsGolojads:是的,除非你在其他方面也需要它。
public function getName() {
return $this->nameStringTemplate->StringTemplate;
}