daoandco/shadow-translate

使用影子表管理翻译内容

安装: 6

依赖: 0

建议者: 0

安全: 0

星级: 0

关注者: 3

分支: 9

类型:cakephp-plugin

1.0.0 2017-03-17 09:54 UTC

This package is not auto-updated.

Last update: 2024-09-14 19:47:54 UTC


README

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),
	body TEXT,
	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.

要点

  • 设置工作稍多
  • 翻译内容存储在主数据表的副本中
  • 查询时每个翻译表一个连接
  • 查询效率更高 - 每个翻译字段可能的连接和索引更少
  • 通过翻译内容查找更简单

路线图

初始版本只有行为,未来计划添加

  • 创建影子表的shell(基于迁移)
  • 从核心的i18n表导入的shell
  • 导出到核心的i18n表的shell

错误

很可能!

如果您不小心发现了一个bug,请随意创建一个包含修复方法(可选附带测试)以及bug描述和解决方式的pull request。

您还可以创建一个带有描述的问题,以提高大家对bug的认识。

支持/问题

如果您遇到问题,如果其他人无法帮助,并且您可以找到他们,也许您可以在IRC的#FriendsOfCake频道找到帮助。