From d0047ed9bf61fd27a87e01651f57e2b2339f23ac Mon Sep 17 00:00:00 2001 From: Jose Lorenzo Rodriguez Date: Sat, 15 Feb 2014 14:56:31 +0100 Subject: [PATCH] Adding TranslateTrait to facilitate the management of multiple translations --- .../Behavior/Translate/TranslateTrait.php | 60 ++++++++++++++ .../Behavior/Translate/TranslateTraitTest.php | 80 +++++++++++++++++++ 2 files changed, 140 insertions(+) create mode 100644 src/Model/Behavior/Translate/TranslateTrait.php create mode 100644 tests/TestCase/Model/Behavior/Translate/TranslateTraitTest.php diff --git a/src/Model/Behavior/Translate/TranslateTrait.php b/src/Model/Behavior/Translate/TranslateTrait.php new file mode 100644 index 00000000000..339262eab86 --- /dev/null +++ b/src/Model/Behavior/Translate/TranslateTrait.php @@ -0,0 +1,60 @@ +get('_locale')) { + return $this; + } + + $i18n = $this->get('_translations'); + $created = false; + + if (empty($i18n)) { + $i18n = []; + $created = true; + } + + if ($created || empty($i18n[$language]) || !($i18n[$language] instanceof Entity)) { + $i18n[$language] = new Entity(); + $created = true; + } + + if ($created) { + $this->set('_translations', $i18n); + } + + // Assume the user will modify any of the internal translations, helps with saving + $this->dirty('_translations', true); + return $i18n[$language]; + } + +} diff --git a/tests/TestCase/Model/Behavior/Translate/TranslateTraitTest.php b/tests/TestCase/Model/Behavior/Translate/TranslateTraitTest.php new file mode 100644 index 00000000000..52ee5cd2bc7 --- /dev/null +++ b/tests/TestCase/Model/Behavior/Translate/TranslateTraitTest.php @@ -0,0 +1,80 @@ +translation('eng')->set('title', 'My Title'); + $this->assertEquals('My Title', $entity->translation('eng')->get('title')); + + $this->assertTrue($entity->dirty('_translations')); + + $entity->translation('spa')->set('body', 'Contenido'); + $this->assertEquals('My Title', $entity->translation('eng')->get('title')); + $this->assertEquals('Contenido', $entity->translation('spa')->get('body')); + } + +/** + * Tests that modifying existing translation entries work + * + * @return void + */ + public function testTranslationModify() { + $entity = new TestEntity; + $entity->set('_translations', [ + 'eng' => new Entity(['title' => 'My Title']), + 'spa' => new Entity(['title' => 'Titulo']) + ]); + $this->assertEquals('My Title', $entity->translation('eng')->get('title')); + $this->assertEquals('Titulo', $entity->translation('spa')->get('title')); + } + +/** + * Tests that just accessing the translation will mark the property as dirty, this + * is to facilitate the saving process by not having to remember to mark the property + * manually + * + * @return void + */ + public function testTranslationDirty() { + $entity = new TestEntity; + $entity->set('_translations', [ + 'eng' => new Entity(['title' => 'My Title']), + 'spa' => new Entity(['title' => 'Titulo']) + ]); + $entity->clean(); + $this->assertEquals('My Title', $entity->translation('eng')->get('title')); + $this->assertTrue($entity->dirty('_translations')); + } + +}