From 93bb76dd10bd34ea3525435d04ddedd8c59b7c69 Mon Sep 17 00:00:00 2001 From: Ingo Schommer Date: Wed, 18 Mar 2009 17:13:23 +0000 Subject: [PATCH] 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 git-svn-id: svn://svn.silverstripe.com/silverstripe/open/modules/sapphire/trunk@73342 467b73ca-7a2a-4603-9d3b-597d59a354a9 --- core/model/Translatable.php | 79 ++++++++++++++++++++++++------------- 1 file changed, 51 insertions(+), 28 deletions(-) diff --git a/core/model/Translatable.php b/core/model/Translatable.php index 2aef9c8b0..c8e38923e 100755 --- a/core/model/Translatable.php +++ b/core/model/Translatable.php @@ -18,17 +18,46 @@ * } * * Make sure to rebuild the database through /dev/build after enabling translatable. + * + *

Usage

+ * + * Getting a translation for an existing instance: + * + * $translatedObj = DataObject::get_one_by_lang('MyObject', 'de'); + * + * + * Getting a translation for an existing instance: + * + * $obj = DataObject::get_by_id('MyObject', 99); // original language + * $translatedObj = $obj->getTranslation('de'); + * + * + * Getting translations through {@link Translatable::set_reading_lang()}. + * This is *not* a recommended approach, but sometimes inavoidable (e.g. for {@link Versioned} methods). + * + * $obj = DataObject::get_by_id('MyObject', 99); // original language + * $translatedObj = $obj->getTranslation('de'); + * + * + * Creating a translation: + * + * $obj = new MyObject(); + * $translatedObj = $obj->createTranslation('de'); + * * *

Usage for SiteTree

- * Translatable can be used for pages as well. - * * - *

"Default" languages

- * - * Important: If the "default language" of your site is not english (en_US), - * please ensure to set the appropriate default language for - * your content before building the database with Translatable enabled: - * Translatable::set_default_language(); + * Translatable can be used for subclasses of {@link SiteTree} as well. + * If a child page translation is requested without the parent + * page already having a translation in this language, the extension + * will recursively create translations up the tree. + * Caution: The "URLSegment" property is enforced to be unique across + * languages by auto-appending the language code at the end. + * You'll need to ensure that the appropriate "reading language" is set + * before showing links to other pages on a website: Either + * through setting $_COOKIE['lang'], $_SESSION['lang'] or $_GET['lang']. + * Pages in different languages can have different publication states + * through the {@link Versioned} extension. * *

Translation groups

* @@ -47,6 +76,13 @@ * is stored and represented in UTF-8 (Unicode). Please make sure your database and * HTML-templates adjust to this. * + *

"Default" languages

+ * + * Important: If the "default language" of your site is not english (en_US), + * please ensure to set the appropriate default language for + * your content before building the database with Translatable enabled: + * Translatable::set_default_language(); + * *

Uninstalling/Disabling

* * Disabling Translatable after creating translations will lead to all @@ -578,6 +614,8 @@ class Translatable extends DataObjectDecorator { } // Specific logic for SiteTree subclasses. + // If page has untranslated parents, create (unpublished) translations + // of those as well to avoid having inaccessible children in the sitetree. // Caution: This logic is very sensitve to eternal loops when translation status isn't determined properly if($this->owner->hasField('ParentID')) { if( @@ -585,7 +623,8 @@ class Translatable extends DataObjectDecorator { && $this->owner->ParentID && !$this->owner->Parent()->hasTranslation($this->owner->Lang) ) { - $this->owner->Parent()->createTranslation($this->owner->Lang); + $parentTranslation = $this->owner->Parent()->createTranslation($this->owner->Lang); + $this->owner->ParentID = $parentTranslation->ID; } } @@ -722,23 +761,6 @@ class Translatable extends DataObjectDecorator { } } - $origLangName = i18n::get_language_name($originalRecord->Lang); - - // add link back to original page - $originalRecordLink = sprintf( - _t('Translatable.ORIGINALLINK', 'Show original page in %s', PR_MEDIUM, 'Show in specific language'), - $origLangName - ); - $originalRecordHTML = sprintf('

%s

', - sprintf('admin/show/%d/?lang=%s', $originalRecord->ID, Translatable::default_lang()), - $originalRecordLink - ); - $fields->addFieldsToTab( - 'Root', - new Tab(_t('Translatable.TRANSLATIONS', 'Translations'), - new LiteralField('OriginalTranslationLink', $originalRecordHTML) - ) - ); } elseif($this->owner->isNew()) { $fields->addFieldsToTab( 'Root', @@ -760,14 +782,14 @@ class Translatable extends DataObjectDecorator { // We'd still want to show the default lang though, // as records in this language might have NULL values in their $Lang property // and otherwise wouldn't show up here - $alreadyTranslatedLangs[Translatable::default_lang()] = i18n::get_language_name(Translatable::default_lang()); + //$alreadyTranslatedLangs[Translatable::default_lang()] = i18n::get_language_name(Translatable::default_lang()); // Exclude the current language from being shown. if(Translatable::current_lang() != Translatable::default_lang()) { $currentLangKey = array_search(Translatable::current_lang(), $alreadyTranslatedLangs); if($currentLangKey) unset($alreadyTranslatedLangs[$currentLangKey]); } - + $fields->addFieldsToTab( 'Root', new Tab(_t('Translatable.TRANSLATIONS', 'Translations'), @@ -776,6 +798,7 @@ class Translatable extends DataObjectDecorator { $createButton = new InlineFormAction('createtranslation',_t('Translatable.CREATEBUTTON', 'Create')) ) ); + $createButton->includeDefaultJS(false); if($alreadyTranslatedLangs) { $fields->addFieldToTab(