ad7six/shadow-translate

此包已被废弃且不再维护。没有推荐替代包。

使用影子表管理翻译内容

安装次数: 58,400

依赖者: 0

建议者: 0

安全性: 0

星标: 42

关注者: 8

分支: 12

开放问题: 0

类型:cakephp-plugin

1.0.1 2019-11-15 14:13 UTC

This package is not auto-updated.

Last update: 2022-07-09 04:49:12 UTC


README

自CakePHP 4.0起,可以通过核心的Translate行为本身使用影子表来存储翻译内容。有关更多详细信息,请参阅CakePHP 手册

影子翻译 #已存档#

Build Status Coverage Status Total Downloads License

此插件使用影子表来存储翻译内容,而不是核心的更灵活(但也可能相当低效)的EAV风格翻译行为。影子翻译行为旨在与核心的翻译行为具有相同的API,使其在用法上成为即插即用的替代品。

快速入门

首先使用composer为您的应用程序安装插件

php composer.phar require ad7six/shadow-translate

通过在应用程序的config/bootstrap.php中添加以下语句来加载插件

Plugin::load('ShadowTranslate');

影子翻译行为期望每个表都有自己的翻译表。以博客教程为例,以下表已经存在

CREATE TABLE posts (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(50),
    body TEXT,
    created DATETIME DEFAULT NULL,
    modified DATETIME DEFAULT NULL
);

为了使用影子翻译行为,将创建以下表

CREATE TABLE posts_translations (
    id INT UNSIGNED,
    locale VARCHAR(5),
    title VARCHAR(50) DEFAULT NULL,
    body TEXT DEFAULT NULL,
    PRIMARY KEY (id, locale)
);

请注意,id与posts表的数据类型相同,但主键是id和locale的组合键。

用法与核心的行为非常相似,例如

class PostsTable extends Table {

    public function initialize(array $config) {
        $this->addBehavior('ShadowTranslate.ShadowTranslate');
    }
}

您可以在翻译表中指定字段,但如果您不指定,它们将从翻译表模式中派生出来。从这一点开始,请参阅核心翻译行为的文档,影子翻译行为应该表现相同,如果不相同,请参见下文。

为什么使用影子翻译

标准翻译行为使用EAV风格的翻译表,并为每个字段进行一次连接。默认情况下,所有翻译都存储在同一个翻译表中。以下是一个示例,核心翻译行为生成的SQL形式

SELECT
    posts.*,
    posts_title_translations.title,
    posts_title_translations.content,
    etc.
FROM
    posts
LEFT JOIN
    i18n as posts_title_translations ON (
        posts_title_translations.locale = "xx" AND
        posts_title_translations.model = "Posts" AND
        posts_title_translations.foreign_key = posts.id AND
        posts_title_translations.field = 'title'
   )
LEFT JOIN
    i18n as posts_body_translations ON (
        posts_body_translations.locale = "xx" AND
        posts_body_translations.model = "Posts" AND
        posts_body_translations.foreign_key = posts.id AND
        posts_body_translations.field = 'body'
   )
etc.

核心翻译行为的设置很简单,但无设置的代价是SQL的复杂性,对于每个翻译字段来说更复杂。根据需要翻译的数据量,这种数据结构可能导致查询缓慢;它还使通过翻译字段值查找记录变得更加复杂。

要点

  • 易于设置
  • 所有翻译内容存储在同一表中
  • 查询时每个翻译字段进行一次连接
  • 查询效率较低 - 更多的连接和所有内容的一个索引
  • 通过翻译内容查找更困难

相比之下,影子翻译行为不使用EAV风格的翻译表,翻译存储在主要数据表的副本中。这以付出每个表一些设置步骤的代价换取了更简单的SQL。影子翻译行为生成的SQL形式

SELECT
    posts.*,
    posts_translations.*
FROM
    posts
LEFT JOIN
    posts_translations ON (
        posts_translations.locale = "xx" AND
        posts_translations.id = posts.id
)
// no etc.

要点

  • (略)需要更多的工作来设置
  • 翻译内容存储在主要数据表的副本中
  • 每个翻译表进行一次连接
  • 更高效的查询 - 每个翻译字段可以减少连接和索引的数量
  • 通过翻译内容更容易查找

路线图

初始版本仅包含行为,计划在未来添加更多功能

  • 用于创建阴影表(基于迁移)的脚本
  • 用于从核心的 i18n 表导入的脚本
  • 用于导出到核心的 i18n 表的脚本

错误

很可能!

如果你发现了一个错误,请随时创建一个带有修复(可选的测试)、错误描述以及解决方法 pull request。

你也可以创建一个带有描述的问题来引起对错误的关注。

支持/问题

如果你遇到问题,如果其他人无法帮助,如果你能找到他们,也许你可以在 #FriendsOfCake 频道在 IRC 上找到帮助。