ad7six / shadow-translate
使用影子表管理翻译内容
Requires
- cakephp/i18n: ^3.5
- cakephp/orm: ^3.5
Requires (Dev)
- cakephp/cakephp: ^3.5
- cakephp/cakephp-codesniffer: ^3.0
- phpunit/phpunit: ^5.7.14|^6.0
README
自CakePHP 4.0起,可以通过核心的Translate
行为本身使用影子表来存储翻译内容。有关更多详细信息,请参阅CakePHP 手册。
影子翻译 #已存档#
此插件使用影子表来存储翻译内容,而不是核心的更灵活(但也可能相当低效)的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 上找到帮助。