如何在CakePHP中使用TranslateBehavior?
时间:2020-03-06 14:20:25 来源:igfitidea点击:
cakephp.org上没有文档,我无法在Google上找到任何文档。请给我链接一些文件或者提供一个文件!
解决方案
转换行为是CakePHP的另一个非常有用的功能,但文献记载很少。我已经在多语言网站上成功实施了几次,并遵循以下原则。
首先,转换行为只会使我们网站的数据库内容国际化。如果我们还有更多静态内容,则需要查看Cake的____('string')包装函数和gettext(这里有一些有用的信息)
假设我们要使用以下数据库表来翻译目录:
CREATE TABLE `contents` ( `id` int(11) unsigned NOT NULL auto_increment, `title` varchar(255) default NULL, `body` text, PRIMARY KEY (`id`), ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
content.php模型将具有:
var $actsAs = array('Translate' => array('title' => 'titleTranslation', 'body' => 'bodyTranslation' ));
在其定义中。然后,我们需要将i18n表添加到数据库中:
CREATE TABLE `i18n` ( `id` int(10) NOT NULL auto_increment, `locale` varchar(6) NOT NULL, `model` varchar(255) NOT NULL, `foreign_key` int(10) NOT NULL, `field` varchar(255) NOT NULL, `content` mediumtext, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
然后,在将数据保存到控制器中的数据库时,将语言环境设置为所需的语言(此示例适用于波兰语):
$this->Content->locale = 'pol'; $result = $this->Content->save($this->data);
这将在i18n表中为pol语言环境的title和body字段创建条目。 Finds将根据用户浏览器中当前设置的语言环境进行查找,并返回类似以下的数组:
[Content] [id] [titleTranslation] [bodyTranslation]
我们使用出色的p28n组件来实现一种语言转换解决方案,该解决方案与gettext和转换行为非常兼容。
这不是一个完美的系统,因为它会动态创建HABTM关系,它可能会导致我们可能手动创建的其他关系出现一些问题,但是如果我们小心一点,它会很好地工作。