neam/yii-i18n-attribute-messages

为ActiveRecords提供透明的属性翻译,利用Yii内置的翻译功能来获取已翻译的字段内容。

安装: 676

依赖项: 1

建议者: 0

安全: 0

星标: 1

关注者: 5

分支: 1

开放问题: 0

类型:yii-extension

0.1.0 2013-11-25 12:14 UTC

This package is not auto-updated.

Last update: 2024-09-24 02:16:46 UTC


README

为ActiveRecords提供透明的属性翻译,利用Yii内置的翻译功能来检索已翻译的属性内容。

您只需要将数据库中的字段名从$book->title更改为$book->_title。包含的命令行工具会扫描您的数据库和配置,并创建所有必要重命名迁移。

然后,该行为将透明地将$book->title转换为Yii:t('attributes.Book.title', $book->_title),并将$book->title_de转换为Yii:t('attributes.Book.title', $book->_title, array(), null, 'de'),同时提供通过在模型中分配和保存这些属性来透明地保存翻译(注意:仅限CDbMessageSource)。

功能

  • 简化项目中对用户生成内容的翻译
  • 简化翻译者进行翻译工作的UI创建
  • 在检索翻译时与任何兼容Yii的消息源一起使用
  • 使用CDbMessageSource时保存翻译
  • 控制台命令自动创建必要的数据库更改迁移
  • 源消息保留在模型中以便与Gii兼容(生成的模型将具有正确的验证规则和字段顺序,用于翻译属性)
  • 严格的单元测试
  • 无需担心数据库行大小和/或列数限制,即可使用任意数量的属性/语言

限制

对于应保留在活动记录数据库表中的本地化属性(例如,翻译的外键或多语言查找/搜索列)不适用。对于这些属性,请使用https://github.com/neam/yii-i18n-columns

要求

  • Yii 1.1或更高版本
  • 使用Yii控制台

设置

下载和安装

确保您的composer.json中包含以下内容

"repositories":[
    {
        "type": "vcs",
        "url": "https://github.com/neam/yii-i18n-attribute-messages"
    },
    ...
],
"require":{
    "neam/yii-i18n-attribute-messages":"dev-master",
    ...
},

然后通过composer安装

php composer.phar update neam/yii-i18n-attribute-messages

如果您不使用composer,请将此项目克隆或下载到/path/to/your/app/vendor/neam/yii-i18n-attribute-messages

在main.php和console.php中添加别名

'aliases' => array(
    ...
    'vendor'  => dirname(__FILE__) . '/../../vendor',
    'i18n-attribute-messages' => 'vendor.neam.yii-i18n-attribute-messages',
    ...
),

在main.php中导入行为

'import' => array(
    ...
    'i18n-attribute-messages.behaviors.I18nAttributeMessagesBehavior',
    ...
),

在console.php中引用控制台命令

'commandMap' => array(
    ...
    'i18n-attribute-messages'    => array(
        'class' => 'i18n-attribute-messages.commands.I18nAttributeMessagesCommand',
    ),
    ...
),

配置多语言模型

1. 将行为添加到您想要多语言的模型中

public function behaviors()
{
    return array(
        'i18n-attribute-messages' => array(
             'class' => 'I18nAttributeMessagesBehavior',

             /* The multilingual attributes */
             'translationAttributes' => array(
                  'title',
                  'slug',
                  'book_id',
                  //'etc',
             ),

            /* An array of allowed language/locale ids that are to be used as suffixes, such as title_en, title_de etc */
            //'languageSuffixes' => array_keys(Yii::app()->params["languages"]),

            /* Configure if you want to use another translation component for this behavior. Default is 'messages' */
            //'messageSourceComponent' => 'attributeMessages',

        ),
    );
}

2. 从命令行创建迁移

./yiic i18n-attribute-messages process

使用--verbose运行以查看更详细输出。

3. 应用生成的迁移

./yiic migrate

这将重命名翻译Attributes中定义的字段,并将其更改为_fieldname,这将存储源内容(要翻译的内容)的位置。

示例迁移文件

<?php
class m131115_204413_i18n extends CDbMigration
{
    public function up()
    {
        $this->renameColumn('book', 'title', '_title');
        $this->renameColumn('book', 'slug', '_slug');
        $this->renameColumn('chapter', 'title', '_title');
        $this->renameColumn('chapter', 'slug', '_slug');
        $this->dropForeignKey('fk_chapter_book', 'chapter');
        $this->renameColumn('chapter', 'book_id', '_book_id');
        $this->addForeignKey('fk_chapter_book', 'chapter', '_book_id', 'book', 'id', 'NO ACTION', 'NO ACTION');
    }

    public function down()
    {
      $this->renameColumn('book', '_title', 'title');
      $this->renameColumn('book', '_slug', 'slug');
      $this->renameColumn('chapter', '_title', 'title');
      $this->renameColumn('chapter', '_slug', 'slug');
      $this->dropForeignKey('fk_chapter_book', 'chapter');
      $this->renameColumn('chapter', '_book_id', 'book_id');
      $this->addForeignKey('fk_chapter_book', 'chapter', 'book_id', 'book', 'id', 'NO ACTION', 'NO ACTION');
    }
}

4. 添加保存支持

保存支持仅在您使用CDbMessageSource时启用。配置您的应用程序以使用它,并确保以下表(注意:带有自增的SourceMessage)存在

CREATE TABLE `SourceMessage` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `category` VARCHAR(32) NULL DEFAULT NULL,
  `message` TEXT NULL DEFAULT NULL,
  PRIMARY KEY (`id`))
COLLATE = utf8_bin;

CREATE TABLE `Message` (
  `id` INT(11) NOT NULL DEFAULT '0',
  `language` VARCHAR(16) NOT NULL DEFAULT '',
  `translation` TEXT NULL DEFAULT NULL,
  PRIMARY KEY (`id`, `language`),
  CONSTRAINT `FK_Message_SourceMessage`
    FOREIGN KEY (`id`)
    REFERENCES `SourceMessage` (`id`)
    ON DELETE CASCADE)
COLLATE = utf8_bin;

提示:您仍然可以将CPhpMessageSource保留为应用程序的默认消息组件,并配置CDbMessageSource仅用于属性消息。

您的应用程序配置应配置了两个消息源组件

'components' => array(
    ...
    // Static messages
    'messages' => array(
        'class' => 'CPhpMessageSource',
    ),
    // Attribute messages
    'attributeMessages' => array(
        'class' => 'CDbMessageSource',
    ),
    ...
),

在配置行为时,设置适当的'messageSourceComponent'配置选项(请参阅上面的示例配置)。

5. 重新生成模型

按照官方文档使用Gii。为了能够保存翻译,您还需要生成Message和SourceMessage模型。

用法

使用具有多语言标题属性的Book模型示例。

所有翻译将通过属性后缀提供,例如英文翻译为$book->title_en,瑞典文翻译为$book->title_sv$book->title将作为当前选中语言的翻译的别名。

读取和保存翻译

获取翻译

 $book = Book::model()->findByPk(1);
 Yii::app()->language = 'en';
 echo $book->title; // Outputs 'The Alchemist'
 Yii::app()->language = 'sv';
 echo $book->title; // Outputs 'Alkemisten'
 echo $book->title_en; // Outputs 'The Alchemist'

保存单个翻译

 Yii::app()->language = 'sv';
 $book->title = 'Djävulen bär Prada';
 $book->save(); // Saves 'Djävulen bär Prada' as if it was assigned to Book.title_sv

保存多个翻译

 $book->title_en = 'The Devil Wears Prada';
 $book->title_sv = 'Djävulen bär Prada';
 $book->save(); // Saves both translations

更多示例

...可以在tests/codeception/unit/BasicTest.php中找到。

为翻译者创建UI

配置

当缺少翻译时,默认行为是返回源消息。当我们构建翻译UI时,我们希望字段在没有翻译时为null

'import' => array(
    ...
    'i18n-attribute-messages.components.MissingTranslationHandler',
    ...
),

'components' => array(
    ...
    'attributeMessages' => array(
        'class' => 'CDbMessageSource',
        'onMissingTranslation' => array('MissingTranslationHandler', 'returnNull'),
    ),
    ...
),

创建一个输入来更改“标题”字段的源语言内容

<div class="row">
    <?php echo $form->labelEx($model,'_title'); ?>
    <?php echo $form->textField($model,'_title'); ?>
    <?php echo $form->error($model,'_title'); ?>
</div>

注意:此字段由Gii自动生成。

创建一个输入来设置/更新“标题”字段的瑞典文翻译

<div class="row">
    <?php echo $form->labelEx($model,'title_sv'); ?>
    <?php echo $form->textField($model,'title_sv'); ?>
    <?php echo $form->error($model,'title_sv'); ?>
</div>

提示:您可能希望在翻译字段旁边显示源语言内容,如下所示

<div class="row">
    <?php echo Yii::t('app', 'Content to translate'); ?>: <?php echo CHtml::encode($model->_title); ?>
</div>
<div class="row">
    <?php echo $form->labelEx($model,'title_sv'); ?>
    <?php echo $form->textField($model,'title_sv'); ?>
    <?php echo $form->error($model,'title_sv'); ?>
</div>

此外,别忘了调整虚拟翻译字段的验证规则(安全、必填等)。

创建一个输入来设置/更新当前应用语言的“标题”字段翻译

<div class="row">
    <?php echo $form->labelEx($model,'title'); ?>
    <?php echo $form->textField($model,'title'); ?>
    <?php echo $form->error($model,'title'); ?>
</div>

更多示例

只需查看Yii中任何其他表单构建示例。由于已翻译的属性是普通模型属性,您可以使用将数据保存到和从模型属性读取的核心或第三方扩展来构建您的翻译UI。

变更日志

0.1.0

  • 简化项目中对用户生成内容的翻译
  • 简化翻译者进行翻译工作的UI创建
  • 在检索翻译时与任何兼容Yii的消息源一起使用
  • 使用CDbMessageSource时保存翻译
  • 控制台命令自动创建必要的数据库更改迁移
  • 源消息保留在模型中以便与Gii兼容(生成的模型将具有正确的验证规则和字段顺序,用于翻译属性)
  • 严格的单元测试

0.0.0

测试扩展

一次性准备

切换到扩展的根目录

cd vendor/neam/yii-i18n-attribute-messages

在您的本地mysql服务器安装中创建一个名为yiam_test的数据库。创建一个名为yiam_test的用户,密码为yiam_test,并确保此用户有权限访问本地数据库。

之后,您可以通过以下常规来测试扩展

测试命令

1. 设置测试数据库

将tests/db/unmodified.sql加载到数据库中。

2. 运行控制台命令

tests/app/protected/yiic i18n-attribute-messages process

3. 应用迁移

tests/app/protected/yiic migrate

测试行为

运行单元测试

php codecept.phar run unit

您应该得到类似的输出

Codeception PHP Testing Framework v1.6.2
Powered by PHPUnit 3.7.19 by Sebastian Bergmann.

Suite unit started
Trying to ensure empty db (BasicTest::ensureEmptyDb) - Ok
Trying to ensure known source language (BasicTest::ensureKnownSourceLanguage) - Ok
Trying to see behavior (BasicTest::seeBehavior) - Ok
Trying to interpret language suffix (BasicTest::interpretLanguageSuffix) - Ok
Trying to get (BasicTest::get) - Ok
Trying to set without suffix (BasicTest::setWithoutSuffix) - Ok
Trying to set with suffix (BasicTest::setWithSuffix) - Ok
Trying to save single with source message (BasicTest::saveSingleWithSourceMessage) - Ok
Trying to save single without source message (BasicTest::saveSingleWithoutSourceMessage) - Ok
Trying to fetch single without suffix (BasicTest::fetchSingleWithoutSuffix) - Ok
Trying to reuse previous translation (BasicTest::reusePreviousTranslation) - Ok
Trying to update existing (BasicTest::updateExisting) - Ok
Trying to further fallback behavior tests (BasicTest::furtherFallbackBehaviorTests) - Ok
Trying to test test suite (EmptyTest::testTestSuite) - Ok


Time: 0 seconds, Memory: 14.25Mb

OK (14 tests, 124 assertions)