1

我是 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 合并到另一个表中,以便我得到以下结构(取自这里http://www.yiiframework.com/doc/api/1.1/CDbMessageSource):

CREATE TABLE SourceMessage
(
    id INTEGER PRIMARY KEY,
    category VARCHAR(32),
    message TEXT
);
CREATE TABLE Message
(
    id INTEGER,
    language VARCHAR(16),
    translation TEXT,
    PRIMARY KEY (id, language),
    CONSTRAINT FK_Message_SourceMessage FOREIGN KEY (id)
         REFERENCES SourceMessage (id) ON DELETE CASCADE ON UPDATE RESTRICT
);

谢谢 !

4

1 回答 1

3

如何启用CDbMessageSource

消息源是一个名为“消息”的应用程序组件。因此,您可以像配置应用程序配置文件中的任何其他组件一样配置它:

array(
    ......
    'components'=>array(
        ......
        'messages'=>array(
            'class'=>'CDbMessageSource',
            // additional parameters for CDbMessageSource here
            ),
        ),
    ),
)

消息源和可本地化模型——不是理想的关系

请务必记住,消息源仅提供已知消息的翻译。将消息源包含在模型本地化中没有多大意义,因为您将如何使用它?

假设您有一个类别为id = 1. 您将如何获得其本地化标题?类似的东西Yii::t('category', 'title_'.$category->id)可以工作,但它有点笨拙(不是理想的语法,你必须将你的主键信息“烘焙”到你的显示代码中,等等)。如果您的标题本地化也意味着用户可以修改,这将变得更加复杂。(无论如何,如果您想这样做,那么合并两个翻译表并在填充时使用单独的值SourceMessage.category将是可行的方法)。

本地化模型的另一种方法

下面简要介绍了如何方便地本地化模型。假设我们有一个Room具有可本地化name属性的模型。您可以创建一个名为的新表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`),
);

然后,Room使用以下关系配置您的模型LocalizedString

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在任何地方书写,并且您将自动获取应用程序当前语言的本地化翻译。

有许多细节需要注意,我在这里略过,但这个想法应该是显而易见的。

于 2012-08-01T14:07:52.337 回答