Skip to content

Commit b6ab4da

Browse files
committed
Fixes issue where translations other than default were not saved.
Fixes #4726
1 parent d5a189d commit b6ab4da

File tree

2 files changed

+38
-1
lines changed

2 files changed

+38
-1
lines changed

src/Model/Behavior/TranslateBehavior.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,7 @@ public function beforeSave(Event $event, Entity $entity, ArrayObject $options) {
173173
$options['associated'] = $newOptions + $options['associated'];
174174

175175
$this->_bundleTranslatedFields($entity);
176+
$bundled = $entity->get('_i18n') ?: [];
176177

177178
if ($locale === $this->config('defaultLocale')) {
178179
return;
@@ -204,7 +205,7 @@ public function beforeSave(Event $event, Entity $entity, ArrayObject $options) {
204205
]);
205206
}
206207

207-
$entity->set('_i18n', array_values($modified + $new));
208+
$entity->set('_i18n', array_merge($bundled, array_values($modified + $new)));
208209
$entity->set('_locale', $locale, ['setter' => false]);
209210
$entity->dirty('_locale', false);
210211

tests/TestCase/Model/Behavior/TranslateBehaviorTest.php

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,19 @@
1818
use Cake\Event\Event;
1919
use Cake\I18n\I18n;
2020
use Cake\Model\Behavior\TranslateBehavior;
21+
use Cake\Model\Behavior\Translate\TranslateTrait;
2122
use Cake\ORM\Entity;
2223
use Cake\ORM\TableRegistry;
2324
use Cake\TestSuite\TestCase;
2425

26+
/**
27+
* Stub entity class
28+
*/
29+
class Article extends Entity {
30+
31+
use TranslateTrait;
32+
}
33+
2534
/**
2635
* Translate behavior test case
2736
*/
@@ -758,4 +767,31 @@ public function testUseCountInFindTranslations() {
758767
$this->assertNotEmpty($article->get('_translations'));
759768
}
760769

770+
/**
771+
* Tests that multiple translations saved when having a default locale
772+
* are correclty saved
773+
*
774+
* @return void
775+
*/
776+
public function testSavingWithNonDefaultLocale() {
777+
$table = TableRegistry::get('Articles');
778+
$table->addBehavior('Translate', ['fields' => ['title', 'body']]);
779+
$table->entityClass(__NAMESPACE__ . '\Article');
780+
I18n::locale('fra');
781+
$translations = [
782+
'fra' => ['title' => 'Un article'],
783+
'spa' => ['title' => 'Un artículo']
784+
];
785+
786+
$article = $table->get(1);
787+
foreach ($translations as $lang => $data) {
788+
$article->translation($lang)->set($data, ['guard' => false]);
789+
}
790+
791+
$table->save($article);
792+
$article = $table->find('translations')->where(['Articles.id' => 1])->first();
793+
$this->assertEquals('Un article', $article->translation('fra')->title);
794+
$this->assertEquals('Un artículo', $article->translation('spa')->title);
795+
}
796+
761797
}

0 commit comments

Comments
 (0)