Localization Yii本地化-CDbMessageSource示例

Localization Yii本地化-CDbMessageSource示例,localization,yii,Localization,Yii,我是Yii的新手。官方文档没有给出CDbMessageSource的任何示例。 问题: 1) 如何/在何处将CDbMessageSource设置为我的MessageSource 2) 在我当前的应用程序中,我将类别存储在一个表中,并将类别的翻译存储在另一个表中。表结构: CATEGORY ---------- cat_id (PK) CATEGORY_TRANSLATION -------------------- cat_id (FK) en ru 现在,如果我引入子类别,

我是Yii的新手。官方文档没有给出CDbMessageSource的任何示例。 问题: 1) 如何/在何处将CDbMessageSource设置为我的MessageSource

2) 在我当前的应用程序中,我将类别存储在一个表中,并将类别的翻译存储在另一个表中。表结构:

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;
}