daoandco / shadow-translate
使用影子表管理翻译内容
Requires
- cakephp/i18n: ~3.0
- cakephp/orm: ~3.0
Requires (Dev)
- cakephp/cakephp: ~3.1
- cakephp/cakephp-codesniffer: dev-master
- phpunit/phpunit: *
This package is not auto-updated.
Last update: 2024-09-14 19:47:54 UTC
README
此插件使用影子表来存储翻译内容,而不是使用核心的更灵活(但可能效率较低)的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频道找到帮助。