mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 14:05:37 +02:00
3469e4d22a
------------------------------------------------------------------------ r68900 | sminnee | 2008-12-15 14:30:41 +1300 (Mon, 15 Dec 2008) | 1 line Static caching merges from dnc branch ------------------------------------------------------------------------ r68917 | sminnee | 2008-12-15 14:49:06 +1300 (Mon, 15 Dec 2008) | 1 line Merged Requirements fix from nestedurls branch ------------------------------------------------------------------------ r70033 | aoneil | 2009-01-13 14:03:41 +1300 (Tue, 13 Jan 2009) | 2 lines Add translation migration task ------------------------------------------------------------------------ r70072 | ischommer | 2009-01-13 17:34:27 +1300 (Tue, 13 Jan 2009) | 5 lines API CHANGE Removed obsolete internal Translatable methods: hasOwnTranslatableFields(), allFieldsInTable() ENHANCEMENT Removed $create flag in Translatable::getTranslation() and replaced with explit action createTranslation() ENHANCEMENT Sorting return array of Translatable::getTranslatedLangs() ENHANCEMENT Added a note about saving a page before creating a translation MINOR Added phpdoc to Translatable ------------------------------------------------------------------------ r70073 | ischommer | 2009-01-13 17:34:45 +1300 (Tue, 13 Jan 2009) | 1 line ENHANCEMENT Added basic unit tests to new Translatable API ------------------------------------------------------------------------ r70080 | aoneil | 2009-01-13 18:04:21 +1300 (Tue, 13 Jan 2009) | 3 lines BUGFIX: Fix translatable migration regenerating URLSegments when it shouldn't BUGFIX: Fix translatable migration not writing records to Live properly ------------------------------------------------------------------------ r70118 | ischommer | 2009-01-14 11:28:24 +1300 (Wed, 14 Jan 2009) | 3 lines API CHANGE Removed obsolete Translatable::table_exists() ENHANCEMENT Made Translatable constructor arguments optional, as by default all database fields are marked translatable MINOR More unit tests for Translatable ------------------------------------------------------------------------ r70138 | ischommer | 2009-01-14 17:00:30 +1300 (Wed, 14 Jan 2009) | 1 line BUGFIX Disabled assumption that SQLQuery->filtersOnID() should only kick in when exactly one WHERE clause is given - this is very fragile and hard to test. It would return TRUE on $where = "SiteTree.ID = 5", but not on $where = array("Lang = 'de'", "SiteTree.ID = 5") ------------------------------------------------------------------------ r70214 | ischommer | 2009-01-15 18:56:25 +1300 (Thu, 15 Jan 2009) | 3 lines BUGFIX Falling back to Translatable::current_lang() if no $context object is given, in augmentAllChildrenIncludingDeleted() and AllChildrenIncludingDeleted() MINOR phpdoc for Translatable MINOR Added more Translatable unit tests ------------------------------------------------------------------------ r70306 | ischommer | 2009-01-16 17:14:34 +1300 (Fri, 16 Jan 2009) | 9 lines ENHANCEMENT Recursively creating translations for parent pages to ensure that a translated page is still accessible by traversing the tree, e.g. in "cms translation mode" (in Translatable->onBeforeWrite()) ENHANCEMENT Simplified AllChildrenIncludingDeleted() to not require a special augmentAllChildrenIncludingDeleted() implementation: We don't combine untranslated/translated children any longer (which was used in CMS tree view), but rather just show translated records ENHANCEMENT Ensuring uniqueness of URL segments by appending "-<langcode>" to new translations (in Translatable->onBeforeWrite()) ENHANCEMENT Added Translatable->alternateGetByUrl() as a hook into SiteTree::get_by_url() ENHANCEMENT Adding link back to original page in CMS editform for translations BUGFIX Excluding HiddenField instances from Translatable->updateCMSFields() BUGFIX Don't require a record to be written (through exists()) when checking Translatable->isTranslation() or Translatable->hasTranslation() MINOR Don't use createMethod() shortcut for Translatable->AllChildrenIncludingDeleted() MINOR Added Translatable unit tests ------------------------------------------------------------------------ r70318 | ischommer | 2009-01-19 11:46:16 +1300 (Mon, 19 Jan 2009) | 1 line BUGFIX Reverted special cases for Translatable in Versioned->canBeVersioned() (originally committed in r42119) - was checking for existence of underscores in table names as an indication of the "_lang" suffix, which is no longer needed. It was also a flawed assumption which tripped over classes like TranslatableTest_TestPage ------------------------------------------------------------------------ r70319 | ischommer | 2009-01-19 11:47:02 +1300 (Mon, 19 Jan 2009) | 1 line ENHANCEMENT Disabled Translatab-e>augmentWrite() - was only needed for the blacklist fields implementation which is inactive for the moment ------------------------------------------------------------------------ r70326 | ischommer | 2009-01-19 14:25:23 +1300 (Mon, 19 Jan 2009) | 2 lines ENHANCEMENT Making ErrorPage static HTML files translatable (#2233) ENHANCEMENT Added ErrorPage::$static_filepath to flexibly set location of static error pages (defaults to /assets) ------------------------------------------------------------------------ r70327 | ischommer | 2009-01-19 15:18:41 +1300 (Mon, 19 Jan 2009) | 1 line FEATURE Enabled specifying a language through a hidden field in SearchForm which limits the search to pages in this language (incl. unit tests) ------------------------------------------------------------------------ r71258 | sharvey | 2009-02-03 15:49:34 +1300 (Tue, 03 Feb 2009) | 2 lines BUGFIX: Fix translatable being enabled when it shouldn't be ------------------------------------------------------------------------ r71340 | ischommer | 2009-02-04 14:36:12 +1300 (Wed, 04 Feb 2009) | 1 line BUGFIX Including Hierarchy->children in flushCache() and renamed to _cache_children. This caused problems in TranslatableTest when re-using the same SiteTree->Children() method with different languages on the same object (even with calling flushCache() inbetween the calls) ------------------------------------------------------------------------ r71567 | gmunn | 2009-02-10 13:49:16 +1300 (Tue, 10 Feb 2009) | 1 line 'URLSegment' on line 484 and 494 now escaped ------------------------------------------------------------------------ r72054 | ischommer | 2009-02-23 10:30:41 +1300 (Mon, 23 Feb 2009) | 3 lines BUGFIX Fixed finding a translated homepage without an explicit URLSegment (e.g. http://mysite.com/?lang=de) - see #3540 ENHANCEMENT Added Translatable::get_homepage_urlsegment_by_language() ENHANCEMENT Added RootURLController::get_default_homepage_urlsegment() ------------------------------------------------------------------------ r72367 | ischommer | 2009-03-03 11:13:30 +1300 (Tue, 03 Mar 2009) | 2 lines ENHANCEMENT Added i18n::get_lang_from_locale() and i18n::convert_rfc1766() ENHANCEMENT Using IETF/HTTP compatible "long" language code in SiteTree->MetaTags(). This means the default <meta type="content-language..."> value will be "en-US" instead of "en". The locale can be either set through the Translatable content language, or through i18n::set_locale() ------------------------------------------------------------------------ r73036 | sminnee | 2009-03-14 13:16:32 +1300 (Sat, 14 Mar 2009) | 1 line ENHANCEMENT #3032 ajshort: Use static methods for accessing static data ------------------------------------------------------------------------ r73059 | sminnee | 2009-03-15 14:09:59 +1300 (Sun, 15 Mar 2009) | 2 lines ENHANCEMENT: Added Object::clearCache() to clear a cache BUGFIX: Make object cache testing more robust ------------------------------------------------------------------------ r73338 | ischommer | 2009-03-19 05:13:40 +1300 (Thu, 19 Mar 2009) | 9 lines API CHANGE Added concept of "translation groups" to Translatable- every page can belong to a group of related translations, rather than having an explicit "original", meaning you can have pages in "non-default" languages which have no representation in other language trees. This group is recorded in a new table "<classname>_translationgroups". Translatable->createTranslation() and Translatable->onBeforeWrite() will automatically associate records in this groups. Added Translatable->addTranslationGroup(), Translatable->removeTranslationGroup(), Translatable->getTranslationGroup() API CHANGE Removed Translatable->isTranslation() - after the new "translation group" model, every page is potentially a translation API CHANGE Translatable->findOriginalIDs(), Translatable->setOriginalPage(), Translatable->getOriginalPage() ENHANCEMENT Translatable->getCMSFields() will now always show the "create translation" option, not only on default languages - meaning you can create translations based on other translations ENHANCEMENT Translatable language dropdown in CMS will always show all available languages, rather than filtering by already existing translations ENHANCEMENT Added check for an existing record in Translatable->createTranslation() BUGFIX Removed Translatable->getLang() which overloaded the $db property - it was causing side effects during creation of SiteTree default records. BUGFIX Added check in Translatable->augmentSQL() to avoid reapplying "Lang = ..." filter twice BUGFIX Removed bypass in Translatable->AllChildrenIncludingDeleted() ------------------------------------------------------------------------ r73339 | ischommer | 2009-03-19 05:15:46 +1300 (Thu, 19 Mar 2009) | 1 line BUGFIX Disabled "untranslated" CSS class for SiteTree elements - doesn't apply any longer with the new "translation groups" concept ------------------------------------------------------------------------ r73341 | ischommer | 2009-03-19 06:01:51 +1300 (Thu, 19 Mar 2009) | 1 line BUGFIX Disabled auto-excluding of default language from the "available languages" array in LanguageDropdownField - due to the new "translation groups" its possible to have a translation from another language into the default language ------------------------------------------------------------------------ r73342 | ischommer | 2009-03-19 06:13:23 +1300 (Thu, 19 Mar 2009) | 4 lines BUGFIX Setting ParentID of translated record if recursively creating parents in Translatable::onBeforeWrite() BUGFIX Fixing inline form action for "create translation" BUGFIX Removed link to "original page" for a translation - no longer valid MINOR documentation for Translatable ------------------------------------------------------------------------ r73464 | ischommer | 2009-03-20 20:51:00 +1300 (Fri, 20 Mar 2009) | 1 line MINOR documentation ------------------------------------------------------------------------ r73465 | ischommer | 2009-03-20 20:58:52 +1300 (Fri, 20 Mar 2009) | 1 line BUGFIX Fixed Hierarchy->Children() testing in TranslatableTest - with the new datamodel you can't call Children() in a different language regardless of Translatable::set_reading_lang(), the Children() call has to be made from a parent in the same language ------------------------------------------------------------------------ r73466 | ischommer | 2009-03-20 21:36:40 +1300 (Fri, 20 Mar 2009) | 2 lines ENHANCEMENT Added Translatable::get_locale_from_lang(), Translatable::get_common_locales(), $common_locales and $likely_subtags in preparation to switch Translatable from using short "lang" codes to proper long locales API CHANGE Deprecated Translatable::set_default_lang(), Translatable::default_lang() ------------------------------------------------------------------------ r73467 | ischommer | 2009-03-20 21:38:57 +1300 (Fri, 20 Mar 2009) | 1 line ENHANCEMENT Supporting "Locale-English" and "Locale-Native" as listing arguments in LanguageDropdownField ------------------------------------------------------------------------ r73468 | ischommer | 2009-03-20 21:47:06 +1300 (Fri, 20 Mar 2009) | 7 lines ENHANCEMENT Adjusted SearchForm, Debug, ErrorPage, SiteTree to using locales instead of lang codes API CHANGE Changed Translatable datamodel to use locales ("en_US") instead of lang values ("en). API CHANGE Changed Translatable::$default_lang to $default_locale, Translatable::$reading_lang to $reading_locale API CHANGE Using "locale" instead of "lang" in Translatable::choose_site_lang() to auto-detect language from cookies or GET parameters API CHANGE Deprecated Translatable::is_default_lang(), set_default_lang(), get_default_lang(), current_lang(), set_reading_lang(), get_reading_lang(), get_by_lang(), get_one_by_lang() API CHANGE Removed Translatable::get_original() - with the new "translation groups" concept there no longer is an original for a translation BUGFIX Updated MigrateTranslatableTask to new Locale based datamodel ------------------------------------------------------------------------ r73470 | ischommer | 2009-03-20 21:56:57 +1300 (Fri, 20 Mar 2009) | 1 line MINOR fixed typo ------------------------------------------------------------------------ r73472 | sminnee | 2009-03-21 17:30:04 +1300 (Sat, 21 Mar 2009) | 1 line BUGFIX: Fixed translatable test execution by making protected methods public ------------------------------------------------------------------------ r73473 | sminnee | 2009-03-21 18:10:05 +1300 (Sat, 21 Mar 2009) | 1 line ENHANCEMENT: Added Object::combined_static(), which gets all values of a static property from each class in the hierarchy ------------------------------------------------------------------------ r73883 | ischommer | 2009-04-01 08:32:19 +1300 (Wed, 01 Apr 2009) | 1 line BUGFIX Making $_SINGLETONS a global instead of a static in Core.php so it can be re-used in other places ------------------------------------------------------------------------ r73951 | ischommer | 2009-04-02 05:35:32 +1300 (Thu, 02 Apr 2009) | 3 lines API CHANGE Deprecated Translatable::enable() and i18n::enable()- use Object::add_extension('SiteTree','Translatable'), Deprecated Translatable::disable() and i18n::disable() - use Object::remove_extension('SiteTree','Translatable'), Deprecated Translatable::enabled() - use $myPage->hasExtension('Translatable') API CHANGE Removed Translatable::creating_from() - doesn't apply any longer ENHANCEMENT Translatable extension is no longer hooked up to SiteTree by default, which should improve performance and memory usage for sites not using Translatable. Please use Object::add_extension('SiteTree','Translatable') in your _config.php instead. Adjusted several classes (Image, ErrorPage, RootURLController) to the new behaviour. ------------------------------------------------------------------------ r73882 | ischommer | 2009-04-01 08:31:21 +1300 (Wed, 01 Apr 2009) | 1 line ENHANCEMENT Added DataObjectDecorator->setOwner() ------------------------------------------------------------------------ r73884 | ischommer | 2009-04-01 08:32:51 +1300 (Wed, 01 Apr 2009) | 1 line ENHANCEMENT Added Extension::get_classname_without_arguments() ------------------------------------------------------------------------ r73900 | ischommer | 2009-04-01 11:27:53 +1300 (Wed, 01 Apr 2009) | 7 lines API CHANGE Deprecated Object->extInstance(), use getExtensionInstance() instead ENHANCEMENT Added Object->getExtensionInstances() ENHANCEMENT Added Object::get_extensions() ENHANCEMENT Unsetting class caches when using Object::add_extension() to avoid problems with defineMethods etc. BUGFIX Fixed extension comparison with case sensitivity and stripping arguments in Object::has_extension() BUGFIX Unsetting all cached singletons in Object::remove_extension() to avoid outdated extension_instances MINOR Documentation in Object ------------------------------------------------------------------------ r74017 | ischommer | 2009-04-03 10:49:40 +1300 (Fri, 03 Apr 2009) | 1 line ENHANCEMENT Improved deprecated fallbacks in Translatable by auto-converting short language codes to long locales and vice versa through i18n::get_lang_from_locale()/i18n::get_locale_from_lang() ------------------------------------------------------------------------ r74030 | ischommer | 2009-04-03 11:41:26 +1300 (Fri, 03 Apr 2009) | 1 line MINOR Re-added Translatable::default_lang() for more graceful fallback to Translatable::default_locale() ------------------------------------------------------------------------ r74065 | ischommer | 2009-04-04 05:38:51 +1300 (Sat, 04 Apr 2009) | 1 line BUGFIX Re-added Translatable->isTranslation() for more friendly deprecation (originally removed in r73338) ------------------------------------------------------------------------ r74069 | ischommer | 2009-04-04 09:43:01 +1300 (Sat, 04 Apr 2009) | 1 line BUGFIX Fixed legacy handling of Translatable::enable(),Translatable::disable() and Translatable::is_enabled() - applying extension to SiteTree instead of Page to avoid datamodel clashes ------------------------------------------------------------------------ r74070 | ischommer | 2009-04-04 10:23:51 +1300 (Sat, 04 Apr 2009) | 1 line API CHANGE Deprecated Translatable::choose_site_lang(), use choose_site_locale() ------------------------------------------------------------------------ r74941 | ischommer | 2009-04-22 15:22:09 +1200 (Wed, 22 Apr 2009) | 2 lines ENHANCEMENT Adding SapphireTest::set_up_once() and SapphireTest::tear_down_once() for better test performance with state that just needs to be initialized once per test case (not per test method). Added new SapphireTestSuite to support this through PHPUnit. ENHANCEMENT Using set_up_once() in TranslatableTest and TranslatableSearchFormTest for better test run performance ------------------------------------------------------------------------ r74942 | ischommer | 2009-04-22 15:24:50 +1200 (Wed, 22 Apr 2009) | 1 line BUGFIX Fixed TranslatableSearchFormTest->setUp() method ------------------------------------------------------------------------ r73509 | ischommer | 2009-03-23 11:59:14 +1300 (Mon, 23 Mar 2009) | 1 line MINOR phpdoc documentation ------------------------------------------------------------------------ git-svn-id: svn://svn.silverstripe.com/silverstripe/open/modules/sapphire/branches/2.3@74986 467b73ca-7a2a-4603-9d3b-597d59a354a9
684 lines
23 KiB
PHP
684 lines
23 KiB
PHP
<?php
|
|
/**
|
|
* @todo Test Versioned getters
|
|
*
|
|
* @package sapphire
|
|
* @subpackage tests
|
|
*/
|
|
class TranslatableTest extends FunctionalTest {
|
|
|
|
static $fixture_file = 'sapphire/tests/model/TranslatableTest.yml';
|
|
|
|
/**
|
|
* @todo Necessary because of monolithic Translatable design
|
|
*/
|
|
static protected $origTranslatableSettings = array();
|
|
|
|
static function set_up_once() {
|
|
// needs to recreate the database schema with language properties
|
|
self::kill_temp_db();
|
|
|
|
// store old defaults
|
|
self::$origTranslatableSettings['has_extension'] = singleton('SiteTree')->hasExtension('Translatable');
|
|
self::$origTranslatableSettings['default_locale'] = Translatable::default_locale();
|
|
|
|
// overwrite locale
|
|
Translatable::set_default_locale("en_US");
|
|
|
|
// refresh the decorated statics - different fields in $db with Translatable enabled
|
|
if(!self::$origTranslatableSettings['has_extension']) Object::add_extension('SiteTree', 'Translatable');
|
|
Object::add_extension('TranslatableTest_DataObject', 'Translatable');
|
|
|
|
// clear singletons, they're caching old extension info which is used in DatabaseAdmin->doBuild()
|
|
global $_SINGLETONS;
|
|
$_SINGLETONS = array();
|
|
|
|
// @todo Hack to refresh statics on the newly decorated classes
|
|
$newSiteTree = new SiteTree();
|
|
foreach($newSiteTree->getExtensionInstances() as $extInstance) {
|
|
$extInstance->loadExtraStatics();
|
|
}
|
|
// @todo Hack to refresh statics on the newly decorated classes
|
|
$TranslatableTest_DataObject = new TranslatableTest_DataObject();
|
|
foreach($TranslatableTest_DataObject->getExtensionInstances() as $extInstance) {
|
|
$extInstance->loadExtraStatics();
|
|
}
|
|
|
|
// recreate database with new settings
|
|
$dbname = self::create_temp_db();
|
|
DB::set_alternative_database_name($dbname);
|
|
|
|
parent::set_up_once();
|
|
}
|
|
|
|
static function tear_down_once() {
|
|
if(!self::$origTranslatableSettings['has_extension']) Object::remove_extension('SiteTree', 'Translatable');
|
|
|
|
Translatable::set_default_locale(self::$origTranslatableSettings['default_locale']);
|
|
|
|
self::kill_temp_db();
|
|
self::create_temp_db();
|
|
|
|
parent::tear_down_once();
|
|
}
|
|
|
|
function testTranslationGroups() {
|
|
// first in french
|
|
$frPage = new SiteTree();
|
|
$frPage->Locale = 'fr_FR';
|
|
$frPage->write();
|
|
|
|
// second in english (from french "original")
|
|
$enPage = $frPage->createTranslation('en_US');
|
|
|
|
// third in spanish (from the english translation)
|
|
$esPage = $enPage->createTranslation('es_ES');
|
|
|
|
// test french
|
|
$this->assertEquals(
|
|
$frPage->getTranslations()->column('Locale'),
|
|
array('en_US','es_ES')
|
|
);
|
|
$this->assertNotNull($frPage->getTranslation('en_US'));
|
|
$this->assertEquals(
|
|
$frPage->getTranslation('en_US')->ID,
|
|
$enPage->ID
|
|
);
|
|
$this->assertNotNull($frPage->getTranslation('es_ES'));
|
|
$this->assertEquals(
|
|
$frPage->getTranslation('es_ES')->ID,
|
|
$esPage->ID
|
|
);
|
|
|
|
// test english
|
|
$this->assertEquals(
|
|
$enPage->getTranslations()->column('Locale'),
|
|
array('fr_FR','es_ES')
|
|
);
|
|
$this->assertNotNull($frPage->getTranslation('fr_FR'));
|
|
$this->assertEquals(
|
|
$enPage->getTranslation('fr_FR')->ID,
|
|
$frPage->ID
|
|
);
|
|
$this->assertNotNull($frPage->getTranslation('es_ES'));
|
|
$this->assertEquals(
|
|
$enPage->getTranslation('es_ES')->ID,
|
|
$esPage->ID
|
|
);
|
|
|
|
// test spanish
|
|
$this->assertEquals(
|
|
$esPage->getTranslations()->column('Locale'),
|
|
array('fr_FR','en_US')
|
|
);
|
|
$this->assertNotNull($esPage->getTranslation('fr_FR'));
|
|
$this->assertEquals(
|
|
$esPage->getTranslation('fr_FR')->ID,
|
|
$frPage->ID
|
|
);
|
|
$this->assertNotNull($esPage->getTranslation('en_US'));
|
|
$this->assertEquals(
|
|
$esPage->getTranslation('en_US')->ID,
|
|
$enPage->ID
|
|
);
|
|
}
|
|
|
|
function testGetTranslationOnSiteTree() {
|
|
$origPage = $this->objFromFixture('Page', 'testpage_en');
|
|
|
|
$translatedPage = $origPage->createTranslation('fr_FR');
|
|
$getTranslationPage = $origPage->getTranslation('fr_FR');
|
|
|
|
$this->assertNotNull($getTranslationPage);
|
|
$this->assertEquals($getTranslationPage->ID, $translatedPage->ID);
|
|
}
|
|
|
|
function testGetTranslatedLanguages() {
|
|
$origPage = $this->objFromFixture('Page', 'testpage_en');
|
|
|
|
// through createTranslation()
|
|
$translationAf = $origPage->createTranslation('af_ZA');
|
|
|
|
// create a new language on an unrelated page which shouldnt be returned from $origPage
|
|
$otherPage = new Page();
|
|
$otherPage->write();
|
|
$otherTranslationEs = $otherPage->createTranslation('es_ES');
|
|
|
|
$this->assertEquals(
|
|
$origPage->getTranslatedLangs(),
|
|
array(
|
|
'af_ZA',
|
|
//'en_US', // default language is not included
|
|
),
|
|
'Language codes are returned specifically for the queried page through getTranslatedLangs()'
|
|
);
|
|
|
|
$pageWithoutTranslations = new Page();
|
|
$pageWithoutTranslations->write();
|
|
$this->assertEquals(
|
|
$pageWithoutTranslations->getTranslatedLangs(),
|
|
array(),
|
|
'A page without translations returns empty array through getTranslatedLangs(), ' .
|
|
'even if translations for other pages exist in the database'
|
|
);
|
|
|
|
// manual creation of page without an original link
|
|
$translationDeWithoutOriginal = new Page();
|
|
$translationDeWithoutOriginal->Locale = 'de_DE';
|
|
$translationDeWithoutOriginal->write();
|
|
$this->assertEquals(
|
|
$translationDeWithoutOriginal->getTranslatedLangs(),
|
|
array(),
|
|
'A translated page without an original doesn\'t return anything through getTranslatedLang()'
|
|
);
|
|
}
|
|
|
|
function testTranslationCanHaveSameURLSegment() {
|
|
$origPage = $this->objFromFixture('Page', 'testpage_en');
|
|
$translatedPage = $origPage->createTranslation('de_DE');
|
|
$translatedPage->URLSegment = 'testpage';
|
|
|
|
$this->assertEquals($origPage->URLSegment, $translatedPage->URLSegment);
|
|
}
|
|
|
|
function testUpdateCMSFieldsOnSiteTree() {
|
|
$pageOrigLang = $this->objFromFixture('Page', 'testpage_en');
|
|
|
|
// first test with default language
|
|
$fields = $pageOrigLang->getCMSFields();
|
|
$this->assertType(
|
|
'TextField',
|
|
$fields->dataFieldByName('Title'),
|
|
'Translatable doesnt modify fields if called in default language (e.g. "non-translation mode")'
|
|
);
|
|
$this->assertNull(
|
|
$fields->dataFieldByName('Title_original'),
|
|
'Translatable doesnt modify fields if called in default language (e.g. "non-translation mode")'
|
|
);
|
|
|
|
// then in "translation mode"
|
|
$pageTranslated = $pageOrigLang->createTranslation('fr_FR');
|
|
$fields = $pageTranslated->getCMSFields();
|
|
$this->assertType(
|
|
'TextField',
|
|
$fields->dataFieldByName('Title'),
|
|
'Translatable leaves original formfield intact in "translation mode"'
|
|
);
|
|
$readonlyField = $fields->dataFieldByName('Title')->performReadonlyTransformation();
|
|
$this->assertType(
|
|
$readonlyField->class,
|
|
$fields->dataFieldByName('Title_original'),
|
|
'Translatable adds the original value as a ReadonlyField in "translation mode"'
|
|
);
|
|
|
|
}
|
|
|
|
function testDataObjectGetWithReadingLanguage() {
|
|
$origTestPage = $this->objFromFixture('Page', 'testpage_en');
|
|
$otherTestPage = $this->objFromFixture('Page', 'othertestpage_en');
|
|
$translatedPage = $origTestPage->createTranslation('de_DE');
|
|
|
|
// test in default language
|
|
$resultPagesDefaultLang = DataObject::get(
|
|
'Page',
|
|
sprintf("`SiteTree`.`MenuTitle` = '%s'", 'A Testpage')
|
|
);
|
|
$this->assertEquals($resultPagesDefaultLang->Count(), 2);
|
|
$this->assertContains($origTestPage->ID, $resultPagesDefaultLang->column('ID'));
|
|
$this->assertContains($otherTestPage->ID, $resultPagesDefaultLang->column('ID'));
|
|
$this->assertNotContains($translatedPage->ID, $resultPagesDefaultLang->column('ID'));
|
|
|
|
// test in custom language
|
|
Translatable::set_reading_locale('de_DE');
|
|
$resultPagesCustomLang = DataObject::get(
|
|
'Page',
|
|
sprintf("`SiteTree`.`MenuTitle` = '%s'", 'A Testpage')
|
|
);
|
|
$this->assertEquals($resultPagesCustomLang->Count(), 1);
|
|
$this->assertNotContains($origTestPage->ID, $resultPagesCustomLang->column('ID'));
|
|
$this->assertNotContains($otherTestPage->ID, $resultPagesCustomLang->column('ID'));
|
|
// casting as a workaround for types not properly set on duplicated dataobjects from createTranslation()
|
|
$this->assertContains((string)$translatedPage->ID, $resultPagesCustomLang->column('ID'));
|
|
|
|
Translatable::set_reading_locale('en_US');
|
|
}
|
|
|
|
function testDataObjectGetByIdWithReadingLanguage() {
|
|
$origPage = $this->objFromFixture('Page', 'testpage_en');
|
|
$translatedPage = $origPage->createTranslation('de_DE');
|
|
$compareOrigPage = DataObject::get_by_id('Page', $origPage->ID);
|
|
|
|
$this->assertEquals(
|
|
$origPage->ID,
|
|
$compareOrigPage->ID,
|
|
'DataObject::get_by_id() should work independently of the reading language'
|
|
);
|
|
}
|
|
|
|
function testDataObjectGetOneWithReadingLanguage() {
|
|
$origPage = $this->objFromFixture('Page', 'testpage_en');
|
|
$translatedPage = $origPage->createTranslation('de_DE');
|
|
|
|
// running the same query twice with different
|
|
Translatable::set_reading_locale('de_DE');
|
|
$compareTranslatedPage = DataObject::get_one(
|
|
'Page',
|
|
sprintf("`SiteTree`.`Title` = '%s'", $translatedPage->Title)
|
|
);
|
|
$this->assertNotNull($compareTranslatedPage);
|
|
$this->assertEquals(
|
|
$translatedPage->ID,
|
|
$compareTranslatedPage->ID,
|
|
"Translated page is found through get_one() when reading lang is not the default language"
|
|
);
|
|
|
|
// reset language to default
|
|
Translatable::set_reading_locale('de_DE');
|
|
}
|
|
|
|
function testModifyTranslationWithDefaultReadingLang() {
|
|
$origPage = $this->objFromFixture('Page', 'testpage_en');
|
|
$translatedPage = $origPage->createTranslation('de_DE');
|
|
|
|
Translatable::set_reading_locale('en_US');
|
|
$translatedPage->Title = 'De Modified';
|
|
$translatedPage->write();
|
|
$savedTranslatedPage = $origPage->getTranslation('de_DE');
|
|
$this->assertEquals(
|
|
$savedTranslatedPage->Title,
|
|
'De Modified',
|
|
'Modifying a record in language which is not the reading language should still write the record correctly'
|
|
);
|
|
$this->assertEquals(
|
|
$origPage->Title,
|
|
'Home',
|
|
'Modifying a record in language which is not the reading language does not modify the original record'
|
|
);
|
|
}
|
|
|
|
function testSiteTreePublication() {
|
|
$origPage = $this->objFromFixture('Page', 'testpage_en');
|
|
$translatedPage = $origPage->createTranslation('de_DE');
|
|
|
|
Translatable::set_reading_locale('en_US');
|
|
$origPage->Title = 'En Modified';
|
|
$origPage->write();
|
|
// modifying a record in language which is not the reading language should still write the record correctly
|
|
$translatedPage->Title = 'De Modified';
|
|
$translatedPage->write();
|
|
$origPage->publish('Stage', 'Live');
|
|
$liveOrigPage = Versioned::get_one_by_stage('Page', 'Live', "`SiteTree`.ID = {$origPage->ID}");
|
|
$this->assertEquals(
|
|
$liveOrigPage->Title,
|
|
'En Modified',
|
|
'Publishing a record in its original language publshes correct properties'
|
|
);
|
|
}
|
|
|
|
function testDeletingTranslationKeepsOriginal() {
|
|
$origPage = $this->objFromFixture('Page', 'testpage_en');
|
|
$translatedPage = $origPage->createTranslation('de_DE');
|
|
$translatedPageID = $translatedPage->ID;
|
|
$translatedPage->delete();
|
|
|
|
$translatedPage->flushCache();
|
|
$origPage->flushCache();
|
|
|
|
$this->assertNull($origPage->getTranslation('de_DE'));
|
|
$this->assertNotNull(DataObject::get_by_id('Page', $origPage->ID));
|
|
}
|
|
|
|
function testHierarchyChildren() {
|
|
$parentPage = $this->objFromFixture('Page', 'parent');
|
|
$child1Page = $this->objFromFixture('Page', 'child1');
|
|
$child2Page = $this->objFromFixture('Page', 'child2');
|
|
$child3Page = $this->objFromFixture('Page', 'child3');
|
|
$grandchildPage = $this->objFromFixture('Page', 'grandchild');
|
|
|
|
$parentPageTranslated = $parentPage->createTranslation('de_DE');
|
|
$child4PageTranslated = new SiteTree();
|
|
$child4PageTranslated->Locale = 'de_DE';
|
|
$child4PageTranslated->ParentID = $parentPageTranslated->ID;
|
|
$child4PageTranslated->write();
|
|
|
|
Translatable::set_reading_locale('en_US');
|
|
$this->assertEquals(
|
|
$parentPage->Children()->column('ID'),
|
|
array(
|
|
$child1Page->ID,
|
|
$child2Page->ID,
|
|
$child3Page->ID
|
|
),
|
|
"Showing Children() in default language doesnt show children in other languages"
|
|
);
|
|
|
|
Translatable::set_reading_locale('de_DE');
|
|
$parentPage->flushCache();
|
|
$this->assertEquals(
|
|
$parentPageTranslated->Children()->column('ID'),
|
|
array($child4PageTranslated->ID),
|
|
"Showing Children() in translation mode doesnt show children in default languages"
|
|
);
|
|
|
|
// reset language
|
|
Translatable::set_reading_locale('en_US');
|
|
}
|
|
|
|
function testHierarchyLiveStageChildren() {
|
|
$parentPage = $this->objFromFixture('Page', 'parent');
|
|
$child1Page = $this->objFromFixture('Page', 'child1');
|
|
$child1Page->publish('Stage', 'Live');
|
|
$child2Page = $this->objFromFixture('Page', 'child2');
|
|
$child3Page = $this->objFromFixture('Page', 'child3');
|
|
$grandchildPage = $this->objFromFixture('Page', 'grandchild');
|
|
|
|
$parentPageTranslated = $parentPage->createTranslation('de_DE');
|
|
|
|
$child4PageTranslated = new SiteTree();
|
|
$child4PageTranslated->Locale = 'de_DE';
|
|
$child4PageTranslated->ParentID = $parentPageTranslated->ID;
|
|
$child4PageTranslated->write();
|
|
$child4PageTranslated->publish('Stage', 'Live');
|
|
|
|
$child5PageTranslated = new SiteTree();
|
|
$child5PageTranslated->Locale = 'de_DE';
|
|
$child5PageTranslated->ParentID = $parentPageTranslated->ID;
|
|
$child5PageTranslated->write();
|
|
|
|
Translatable::set_reading_locale('en_US');
|
|
$this->assertNotNull($parentPage->liveChildren());
|
|
$this->assertEquals(
|
|
$parentPage->liveChildren()->column('ID'),
|
|
array(
|
|
$child1Page->ID
|
|
),
|
|
"Showing liveChildren() in default language doesnt show children in other languages"
|
|
);
|
|
$this->assertNotNull($parentPage->stageChildren());
|
|
$this->assertEquals(
|
|
$parentPage->stageChildren()->column('ID'),
|
|
array(
|
|
$child1Page->ID,
|
|
$child2Page->ID,
|
|
$child3Page->ID
|
|
),
|
|
"Showing stageChildren() in default language doesnt show children in other languages"
|
|
);
|
|
|
|
Translatable::set_reading_locale('de_DE');
|
|
$parentPage->flushCache();
|
|
$this->assertNotNull($parentPageTranslated->liveChildren());
|
|
$this->assertEquals(
|
|
$parentPageTranslated->liveChildren()->column('ID'),
|
|
array($child4PageTranslated->ID),
|
|
"Showing liveChildren() in translation mode doesnt show children in default languages"
|
|
);
|
|
$this->assertNotNull($parentPageTranslated->stageChildren());
|
|
$this->assertEquals(
|
|
$parentPageTranslated->stageChildren()->column('ID'),
|
|
array(
|
|
$child4PageTranslated->ID,
|
|
$child5PageTranslated->ID,
|
|
),
|
|
"Showing stageChildren() in translation mode doesnt show children in default languages"
|
|
);
|
|
|
|
// reset language
|
|
Translatable::set_reading_locale('en_US');
|
|
}
|
|
|
|
function testTranslatablePropertiesOnSiteTree() {
|
|
$origObj = $this->objFromFixture('TranslatableTest_Page', 'testpage_en');
|
|
|
|
$translatedObj = $origObj->createTranslation('fr_FR');
|
|
$translatedObj->TranslatableProperty = 'fr_FR';
|
|
$translatedObj->write();
|
|
|
|
$this->assertEquals(
|
|
$origObj->TranslatableProperty,
|
|
'en_US',
|
|
'Creating a translation doesnt affect database field on original object'
|
|
);
|
|
$this->assertEquals(
|
|
$translatedObj->TranslatableProperty,
|
|
'fr_FR',
|
|
'Translated object saves database field independently of original object'
|
|
);
|
|
}
|
|
|
|
function testCreateTranslationOnSiteTree() {
|
|
$origPage = $this->objFromFixture('Page', 'testpage_en');
|
|
$translatedPage = $origPage->createTranslation('de_DE');
|
|
|
|
$this->assertEquals($translatedPage->Locale, 'de_DE');
|
|
$this->assertNotEquals($translatedPage->ID, $origPage->ID);
|
|
|
|
$subsequentTranslatedPage = $origPage->createTranslation('de_DE');
|
|
$this->assertEquals(
|
|
$translatedPage->ID,
|
|
$subsequentTranslatedPage->ID,
|
|
'Subsequent calls to createTranslation() dont cause new records in database'
|
|
);
|
|
}
|
|
|
|
function testTranslatablePropertiesOnDataObject() {
|
|
$origObj = $this->objFromFixture('TranslatableTest_DataObject', 'testobject_en');
|
|
$translatedObj = $origObj->createTranslation('fr_FR');
|
|
$translatedObj->TranslatableProperty = 'fr_FR';
|
|
$translatedObj->TranslatableDecoratedProperty = 'fr_FR';
|
|
$translatedObj->write();
|
|
|
|
$this->assertEquals(
|
|
$origObj->TranslatableProperty,
|
|
'en_US',
|
|
'Creating a translation doesnt affect database field on original object'
|
|
);
|
|
$this->assertEquals(
|
|
$origObj->TranslatableDecoratedProperty,
|
|
'en_US',
|
|
'Creating a translation doesnt affect decorated database field on original object'
|
|
);
|
|
$this->assertEquals(
|
|
$translatedObj->TranslatableProperty,
|
|
'fr_FR',
|
|
'Translated object saves database field independently of original object'
|
|
);
|
|
$this->assertEquals(
|
|
$translatedObj->TranslatableDecoratedProperty,
|
|
'fr_FR',
|
|
'Translated object saves decorated database field independently of original object'
|
|
);
|
|
}
|
|
|
|
function testCreateTranslationWithoutOriginal() {
|
|
$origParentPage = $this->objFromFixture('Page', 'testpage_en');
|
|
$translatedParentPage = $origParentPage->createTranslation('de_DE');
|
|
|
|
$translatedPageWithoutOriginal = new SiteTree();
|
|
$translatedPageWithoutOriginal->ParentID = $translatedParentPage->ID;
|
|
$translatedPageWithoutOriginal->Locale = 'de_DE';
|
|
$translatedPageWithoutOriginal->write();
|
|
|
|
Translatable::set_reading_locale('de_DE');
|
|
$this->assertEquals(
|
|
$translatedParentPage->stageChildren()->column('ID'),
|
|
array(
|
|
$translatedPageWithoutOriginal->ID
|
|
),
|
|
"Children() still works on a translated page even if no translation group is set"
|
|
);
|
|
|
|
Translatable::set_reading_locale('en_US');
|
|
}
|
|
|
|
function testCreateTranslationTranslatesUntranslatedParents() {
|
|
$parentPage = $this->objFromFixture('Page', 'parent');
|
|
$child1Page = $this->objFromFixture('Page', 'child1');
|
|
$child1PageOrigID = $child1Page->ID;
|
|
$grandchildPage = $this->objFromFixture('Page', 'grandchild');
|
|
|
|
$this->assertFalse($grandchildPage->hasTranslation('de_DE'));
|
|
$this->assertFalse($child1Page->hasTranslation('de_DE'));
|
|
$this->assertFalse($parentPage->hasTranslation('de_DE'));
|
|
|
|
$translatedGrandChildPage = $grandchildPage->createTranslation('de_DE');
|
|
$this->assertTrue($grandchildPage->hasTranslation('de_DE'));
|
|
$this->assertTrue($child1Page->hasTranslation('de_DE'));
|
|
$this->assertTrue($parentPage->hasTranslation('de_DE'));
|
|
}
|
|
|
|
function testHierarchyAllChildrenIncludingDeleted() {
|
|
// Original tree in 'en_US':
|
|
// parent
|
|
// child1 (Live only, deleted from stage)
|
|
// child2 (Stage only, never published)
|
|
// child3 (Stage only, never published, untranslated)
|
|
// Translated tree in 'de_DE':
|
|
// parent
|
|
// child1 (Live only, deleted from stage)
|
|
// child2 (Stage only)
|
|
|
|
// Create parent
|
|
$parentPage = $this->objFromFixture('Page', 'parent');
|
|
$parentPageID = $parentPage->ID;
|
|
|
|
// Create parent translation
|
|
$translatedParentPage = $parentPage->createTranslation('de_DE');
|
|
$translatedParentPageID = $translatedParentPage->ID;
|
|
|
|
// Create child1
|
|
$child1Page = $this->objFromFixture('Page', 'child1');
|
|
$child1PageID = $child1Page->ID;
|
|
$child1Page->publish('Stage', 'Live');
|
|
|
|
// Create child1 translation
|
|
$child1PageTranslated = $child1Page->createTranslation('de_DE');
|
|
$child1PageTranslatedID = $child1PageTranslated->ID;
|
|
$child1PageTranslated->publish('Stage', 'Live');
|
|
$child1PageTranslated->deleteFromStage('Stage'); // deleted from stage only, record still exists on live
|
|
$child1Page->deleteFromStage('Stage'); // deleted from stage only, record still exists on live
|
|
|
|
// Create child2
|
|
$child2Page = $this->objFromFixture('Page', 'child2');
|
|
$child2PageID = $child2Page->ID;
|
|
|
|
// Create child2 translation
|
|
$child2PageTranslated = $child2Page->createTranslation('de_DE');
|
|
$child2PageTranslatedID = $child2PageTranslated->ID;
|
|
|
|
// Create child3
|
|
$child3Page = $this->objFromFixture('Page', 'child3');
|
|
$child3PageID = $child3Page->ID;
|
|
|
|
// on original parent in default language
|
|
Translatable::set_reading_locale('en_US');
|
|
SiteTree::flush_and_destroy_cache();
|
|
$parentPage = $this->objFromFixture('Page', 'parent');
|
|
$children = $parentPage->AllChildrenIncludingDeleted();
|
|
$this->assertEquals(
|
|
$parentPage->AllChildrenIncludingDeleted()->column('ID'),
|
|
array(
|
|
$child2PageID,
|
|
$child3PageID,
|
|
$child1PageID // $child1Page was deleted from stage, so the original record doesn't have the ID set
|
|
),
|
|
"Showing AllChildrenIncludingDeleted() in default language doesnt show deleted children in other languages"
|
|
);
|
|
|
|
// on original parent in translation mode
|
|
Translatable::set_reading_locale('de_DE');
|
|
SiteTree::flush_and_destroy_cache();
|
|
$parentPage = $this->objFromFixture('Page', 'parent');
|
|
$this->assertEquals(
|
|
$parentPage->AllChildrenIncludingDeleted()->column('ID'),
|
|
array(
|
|
$child2PageTranslatedID,
|
|
$child1PageTranslatedID // $child1PageTranslated was deleted from stage, so the original record doesn't have the ID set
|
|
),
|
|
"Showing AllChildrenIncludingDeleted() in translation mode with parent page in default language shows children in default language"
|
|
);
|
|
|
|
// @todo getTranslation() doesn't switch languages for future calls, its handled statically through set_reading_locale()
|
|
// // on translated page in translation mode using getTranslation()
|
|
// SiteTree::flush_and_destroy_cache();
|
|
// $parentPage = $this->objFromFixture('Page', 'parent');
|
|
// $translatedParentPage = $parentPage->getTranslation('de_DE');
|
|
// $this->assertEquals(
|
|
// $translatedParentPage->AllChildrenIncludingDeleted()->column('ID'),
|
|
// array(
|
|
// $child2PageTranslatedID,
|
|
// $child1PageTranslatedID,
|
|
// ),
|
|
// "Showing AllChildrenIncludingDeleted() in translation mode with translated parent page shows only translated children"
|
|
// );
|
|
|
|
// reset language
|
|
Translatable::set_reading_locale('en_US');
|
|
}
|
|
|
|
function testRootUrlDefaultsToTranslatedUrlSegment() {
|
|
$_originalHost = $_SERVER['HTTP_HOST'];
|
|
|
|
$origPage = $this->objFromFixture('Page', 'homepage_en');
|
|
$origPage->publish('Stage', 'Live');
|
|
$translationDe = $origPage->createTranslation('de_DE');
|
|
$translationDe->URLSegment = 'heim';
|
|
$translationDe->write();
|
|
$translationDe->publish('Stage', 'Live');
|
|
|
|
// test with translatable enabled
|
|
$_SERVER['HTTP_HOST'] = '/?locale=de';
|
|
Translatable::set_reading_locale('de_DE');
|
|
$this->assertEquals(
|
|
RootURLController::get_homepage_urlsegment(),
|
|
'heim',
|
|
'Homepage with different URLSegment in non-default language is found'
|
|
);
|
|
|
|
// @todo Fix add/remove extension
|
|
// test with translatable disabled
|
|
// Object::remove_extension('Page', 'Translatable');
|
|
// $_SERVER['HTTP_HOST'] = '/';
|
|
// $this->assertEquals(
|
|
// RootURLController::get_homepage_urlsegment(),
|
|
// 'home',
|
|
// 'Homepage is showing in default language if ?lang GET variable is left out'
|
|
// );
|
|
// Object::add_extension('Page', 'Translatable');
|
|
|
|
// setting back to default
|
|
Translatable::set_reading_locale('en_US');
|
|
$_SERVER['HTTP_HOST'] = $_originalHost;
|
|
}
|
|
}
|
|
|
|
class TranslatableTest_DataObject extends DataObject implements TestOnly {
|
|
// add_extension() used to add decorator at end of file
|
|
|
|
static $db = array(
|
|
'TranslatableProperty' => 'Text'
|
|
);
|
|
}
|
|
|
|
class TranslatableTest_Decorator extends DataObjectDecorator implements TestOnly {
|
|
|
|
function extraStatics() {
|
|
return array(
|
|
'db' => array(
|
|
'TranslatableDecoratedProperty' => 'Text'
|
|
)
|
|
);
|
|
}
|
|
}
|
|
|
|
class TranslatableTest_Page extends Page implements TestOnly {
|
|
// static $extensions is inherited from SiteTree,
|
|
// we don't need to explicitly specify the fields
|
|
|
|
static $db = array(
|
|
'TranslatableProperty' => 'Text'
|
|
);
|
|
}
|
|
|
|
DataObject::add_extension('TranslatableTest_DataObject', 'TranslatableTest_Decorator');
|
|
?>
|