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(