diff --git a/core/model/Translatable.php b/core/model/Translatable.php index 4deee51d4..9d74c5b35 100755 --- a/core/model/Translatable.php +++ b/core/model/Translatable.php @@ -371,6 +371,27 @@ class Translatable extends DataObjectDecorator implements PermissionProvider { return array(); }; } + + /** + * Gets all locales that a member can access + * as defined by {@link $allowed_locales} + * and {@link canTranslate()}. + * If {@link $allowed_locales} is not set and + * the user has the `TRANSLATE_ALL` permission, + * the method will return all available locales in the system. + * + * @param Member $member + * @return array Map of locales + */ + function getAllowedLocalesForMember($member) { + $locales = self::get_allowed_locales(); + if(!$locales) $locales = i18n::get_common_locales(); + if($locales) foreach($locales as $k => $locale) { + if(!$this->canTranslate($member, $locale)) unset($locales[$k]); + } + + return $locales; + } /** * Get a list of languages in which a given element has been translated. diff --git a/tests/model/TranslatableTest.php b/tests/model/TranslatableTest.php index 3dc7f3df2..8dbf784b3 100644 --- a/tests/model/TranslatableTest.php +++ b/tests/model/TranslatableTest.php @@ -789,6 +789,28 @@ class TranslatableTest extends FunctionalTest { Translatable::set_allowed_locales($origAllowedLocales); } + function testLocalesForMember() { + $origAllowedLocales = Translatable::get_allowed_locales(); + Translatable::set_allowed_locales(array('de_DE', 'ja_JP')); + + $cmseditor = $this->objFromFixture('Member', 'cmseditor'); + $translator = $this->objFromFixture('Member', 'germantranslator'); + + $this->assertEquals( + array('de_DE', 'ja_JP'), + singleton('SiteTree')->getAllowedLocalesForMember($cmseditor), + 'Members with TRANSLATE_ALL permission can edit all locales' + ); + + $this->assertEquals( + array('de_DE'), + singleton('SiteTree')->getAllowedLocalesForMember($translator), + 'Members with TRANSLATE_ permission cant edit all locales' + ); + + Translatable::set_allowed_locales($origAllowedLocales); + } + function testSavePageInCMS() { $adminUser = $this->objFromFixture('Member', 'admin'); $enPage = $this->objFromFixture('Page', 'testpage_en');