MikeHaertl/translatable

translatable 是一个 Yii 扩展,可以透明地翻译 ActiveRecord 属性。

安装: 26,979

依赖项: 3

建议者: 0

安全: 0

星标: 3

关注者: 2

分支: 5

公开问题: 2

类型:yii-extension

1.1.0 2013-10-26 10:04 UTC

This package is auto-updated.

Last update: 2024-08-24 03:42:45 UTC


README

ActiveRecords 的透明属性翻译。

特性

  • 将属性从翻译表映射到主记录
  • 如果未找到翻译,则提供可选的回退语言或回退列
  • 默认情况下自动加载应用程序语言
  • 按需加载其他语言

以下是一个基本示例

<?php

// Load a record in application default language ...
$car = New Car;
$car->manufacturer_id = 123;

// Set a description, e.g. in english if this is the app language
$car->description = 'English description';

// Save both: the new car record and a related translation record
$car->save();

// Change language
$car->language = 'de';
$car->description = 'German description';

// We could again call save() here, but we only want to save the translation record
$car->saveTranslation();


// Load a record in a specific language
$car = Car::model()->language('de')->findByPk(1);

// Output: 'German description'
echo $car->description;

$car->language = 'en';

// Output: 'English description'
echo $car->description;

安装

只需将包解压到您的 protected/extensions 目录,并将其重命名为 translatable

如何使用

1. 将可翻译列移动到单独的表中

此行为需要您将所有希望翻译的列从原始表移动到专用翻译表中。因此,如果您有一个名为 books 的表,并希望翻译 titleabstract,您需要修改您的数据库模式

    +--------------+        +--------------+        +-------------------+
    |    books     |        |    books     |        | book_translations |
    +--------------+        +--------------+        +-------------------+
    |           id |        |           id |        |                id |
    | publisher_id |  --->  | publisher_id |   +    |           book_id |
    |    author_id |        |    author_id |        |          language |
    |        title |        |   created_at |        |             title |
    |     abstract |        |   updated_at |        |          abstract |
    |   created_at |        +--------------+        +-------------------+
    |   updated_at |
    +--------------+

2. 将行为附加到您的 ActiveRecord 模型

使用上述数据库设置,您现在可以将行为附加到 Books ActiveRecord。

<?php
public function behaviors()
{
    return array(
        // IMPORTANT: Always use 'Translatable' as key
        'Translatable' => array(
            'class'                 => 'ext.translatable.Translatable',
            'translationAttributes' => array('title','abstract'),

            // Optional configuration with their defaults
            'translationRelation'   => 'translation',
            'languageColumn'        => 'language',
        ),
    );
}

3. 定义主记录与翻译记录之间的关系

您还必须创建翻译表的记录(例如 BookTranslations)并在 Books 模型中为其定义一个 HAS_MANY 关系。

<?php
public function relations()
{
    return array(
        // IMPORTANT: Use the language column as `index`
        'translations' => array(self::HAS_MANY, 'BookTranslations', 'book_id', 'index'=>'language'),
    );
}

4. 在主记录中创建验证规则

您还希望为这些属性在 Books 记录中创建一些规则。

<?php
public function rules()
{
    return array(
        array('publisher_id,author_id,title,abstract', 'required'),
    );
}

高级示例

使用回退语言

待办事项

使用回退列

待办事项

多语言表格编辑

待办事项

API

属性

  • fallbackColumns:主表中默认列的名称,按属性名称索引。如果在翻译表中未找到翻译,则使用主表中此列的值。示例:array('name'=>'defaultName')
  • languageColumn:包含翻译表中语言代码的列的名称。
  • translationAttributes:位于翻译表中的可翻译属性数组。这些属性将作为主记录的属性提供。
  • translationRelation:用于翻译表的关系的名称。

方法

  • allLanguages($languages=null):一个命名范围,用于加载在 $languages 数组中指定的所有语言。如果没有提供语言,则加载所有可用的语言记录。
  • getLanguage():返回当前模型语言代码,例如 enen_gb
  • getFallbackLanguage():当前回退语言或 null(如果没有)。
  • getTranslationModel($language=null):返回当前模型语言中的翻译表记录或指定的 $language。如果没有设置语言,则使用当前应用程序语言。如果没有为该语言创建翻译记录,则返回一个新的记录,其中设置了当前语言。
  • saveTranslation():保存当前翻译模型。当在主记录上调用 save() 时也会自动发生。
  • setFallbackLanguage($value):设置模型的重试语言。当在没有当前模型语言的翻译时,将使用回退语言中的属性值。
  • setLanguage($value) : 设置模型的语言。

注意:在行为配置中不能设置 fallbackLanguage。它只应在已加载的模型上设置。

关于

本扩展的开发得到了德国斯图加特herzog kommunikation GmbH的慷慨赞助。herzog kommunikation GmbH

变更日志

1.0.1

  • translationRelation 的默认值更改为 translations

1.0.0

  • 初始发布