使用CakePHP一次保存多个翻译

时间:2013-11-26 17:24:12

标签: php cakephp internationalization cakephp-2.3

我有一个标签式表单,在每个标签中都有一组相同的字段,这些字段的语言不同。例如,我在每个选项卡中都有一个名称和描述字段,我将使用CakePHP的表单助手以下列方式创建每个输入:

英文标签

$this->Form->input("Service.en.name");
$this->Form->input("Service.en.description");

法国标签

$this->Form->input("Service.fr.name");
$this->Form->input("Service.fr.description");

之后(这可能是错误的但它有效)我会将特定字段的值设置为包含各种语言环境键入的值的数组。

我正在使用TranslateBehavior,直到我升级到最新的CakePHP(2.3.3中的2.4.3)之前一切都很顺利。现在每当我尝试保存时,我都会收到错误消息:未知列“数组”

我找不到一次保存多种语言的内容。任何想法将不胜感激!!

更新1

我也尝试过将语言环境移到最后:

$this->Form->input("Service.name.en")

结果相同

更新2

根据xdebug,这是SQL:

UPDATE `cc_dev`.`services` SET `name` = Array, `description` = Array, `duration` = 60, `category_id` = 1, `backend_only` = "0", `id` = 1, `vendor_id` = 116, `updated` = "2013-11-26 18:46:11"  WHERE `cc_dev`.`services`.`id` = "1"

它在保存期间发生。我只是检查以确保请求数据首先不是空的,仅此而已。

if (!empty($this->request->data)) {
    $this->Service->save($this->request->data);
}

更新3

提交的请求数据的内容,目前采用Update 1中指定的格式

<pre>Array (
[Service] => Array
    (
        [name] => Array
            (
                [en] => One-to-One Session
                [fr] => Séance individuelle
            )

        [description] => Array
            (
                [en] => Choose a personalized training session of 45 minutes.
                [fr] => Choisissez une séance de formation individuelle de 45 minutes.
            )

        [duration] => 60
        [category_id] => 1
    )
)
</pre>

2 个答案:

答案 0 :(得分:2)

好的,我终于开始工作了。

CakePHP的新首选语言环境格式基于ISO 639-2,因此我更新了所有当前语言环境记录以进行匹配。当在Cake中使用gettext作为* .po文件的文件夹发生变化时,这一点尤其重要(不完全相关,但很高兴知道)。

之后我将表单的结构更改为:

$this->Form->input("Service.name.eng");
$this->Form->input("Service.description.eng");

最后,我现在必须调用saveMany,而不是简单地调用save注意saveMany需要一个记录数组。

if (!empty($this->request->data)) {
    $this->Service->saveMany(array($this->request->data));
}

所以现在我可以再次保存大量翻译。

答案 1 :(得分:0)

区域设置不需要在ISO 639-2中,默认情况下,Cake2使用它,但在我的情况下,Configure:write('Config.language') = 'en'所以我的表单是:

$this->Form->input("Service.name.en");
$this->Form->input("Service.description.en");

它工作得很好,我遇到的唯一问题是以正确的格式从db收集数据以自动适应此表单。 在find函数之前,我使用了CakePhp docs中所述的bindTranslation():

$this->Service->bindTranslation(array('name'=>'nameTranslation'));  

删除或调整包含或添加recursive = 1,它获取翻译,但最后,必须将nameTranslations移动到数组中的服务索引,使其格式正确,以便CakeMagic Forms可以工作。

'Service' => array(
        'id' => '108',
        'name' => 'Hugs',
        'created' => '1391082480',
        'locale' => 'en'
    ),
    'nameTranslation' => array(
        (int) 0 => array(
            'content' => 'Hugs',
            'locale' => 'en',
            'foreign_key' => '108'
        ),
        (int) 1 => array(
            'content' => 'Abrazos',
            'locale' => 'es',
            'foreign_key' => '108'
        )
    )
)

如您所见,该数组格式很明确,但绝对无效,因此我必须添加以下foreach来移动值并进行清理。

$this->request->data['Service']['name'] = array();
foreach($this->request->data['nameTranslation'] as $translation)
     $this->request->data['Service']['name'][$translation['locale']] = $translation['content'];

unset($this->request->data['nameTranslation'],$this->request->data['Service']['locale']);

结果正是我所寻找的:

'Service' => array(
        'id' => '108',
        'name' => array(
            'en' => 'Hugs',
            'es' => 'Abrazos'
        ),
        'created' => '1391082480'
    )

完成并在线,但必须有更好的方法。