More globalisation

This commit is contained in:
Ingo Schommer 2013-10-30 13:43:59 +01:00
parent dcae115723
commit 5ff3b691d7
11 changed files with 221 additions and 83 deletions

View File

@ -12,7 +12,11 @@ class SubsiteReportWrapper extends SS_ReportWrapper {
$subsites = Subsite::accessible_sites('CMS_ACCESS_CMSMain', true); $subsites = Subsite::accessible_sites('CMS_ACCESS_CMSMain', true);
$options = $subsites->toDropdownMap('ID', 'Title'); $options = $subsites->toDropdownMap('ID', 'Title');
$subsiteField = new TreeMultiselectField('Subsites', 'Sites', $options); $subsiteField = new TreeMultiselectField(
'Subsites',
_t('SubsiteReportWrapper.ReportDropdown', 'Sites'),
$options
);
$subsiteField->setValue(array_keys($options)); $subsiteField->setValue(array_keys($options));
// We don't need to make the field editable if only one subsite is available // We don't need to make the field editable if only one subsite is available

View File

@ -24,7 +24,7 @@ class SubsitesVirtualPage extends VirtualPage {
$subsiteSelectionField = new DropdownField( $subsiteSelectionField = new DropdownField(
"CopyContentFromID_SubsiteID", "CopyContentFromID_SubsiteID",
"Subsite", _t('SubsitesVirtualPage.SubsiteField',"Subsite"),
$subsites->map('ID', 'Title'), $subsites->map('ID', 'Title'),
($this->CopyContentFromID) ? $this->CopyContentFrom()->SubsiteID : Session::get('SubsiteID') ($this->CopyContentFromID) ? $this->CopyContentFrom()->SubsiteID : Session::get('SubsiteID')
); );
@ -66,13 +66,51 @@ class SubsitesVirtualPage extends VirtualPage {
} }
$fields->addFieldToTab('Root.Main', new TextField('CustomMetaTitle', 'Title (overrides inherited value from the source)'), 'MetaTitle'); $fields->addFieldToTab(
$fields->addFieldToTab('Root.Main', new TextareaField('CustomMetaKeywords', 'Keywords (overrides inherited value from the source)'), 'MetaKeywords'); 'Root.Main',
$fields->addFieldToTab('Root.Main', new TextareaField('CustomMetaDescription', 'Description (overrides inherited value from the source)'), 'MetaDescription'); TextField::create(
$fields->addFieldToTab('Root.Main', new TextField('CustomExtraMeta', 'Custom Meta Tags (overrides inherited value from the source)'), 'ExtraMeta'); 'CustomMetaTitle',
$this->fieldLabel('CustomMetaTitle')
)->setDescription(_t('SubsitesVirtualPage.OverrideNote', 'Overrides inherited value from the source')),
'MetaTitle'
);
$fields->addFieldToTab(
'Root.Main',
TextareaField::create(
'CustomMetaKeywords',
$this->fieldLabel('CustomMetaTitle')
)->setDescription(_t('SubsitesVirtualPage.OverrideNote')),
'MetaKeywords'
);
$fields->addFieldToTab(
'Root.Main',
TextareaField::create(
'CustomMetaDescription',
$this->fieldLabel('CustomMetaTitle')
)->setDescription(_t('SubsitesVirtualPage.OverrideNote')),
'MetaDescription'
);
$fields->addFieldToTab(
'Root.Main',
TextField::create(
'CustomExtraMeta',
$this->fieldLabel('CustomMetaTitle')
)->setDescription(_t('SubsitesVirtualPage.OverrideNote')),
'ExtraMeta'
);
return $fields; return $fields;
} }
public function fieldLabels($includerelations = true) {
$labels = parent::fieldLabels($includerelations);
$labels['CustomMetaTitle'] = _t('Subsite.CustomMetaTitle','Title');
$labels['CustomMetaKeywords'] = _t('Subsite.CustomMetaKeywords','Keywords');
$labels['CustomMetaDescription'] = _t('Subsite.CustomMetaDescription','Description');
$labels['CustomExtraMeta'] = _t('Subsite.CustomExtraMeta','Custom Meta Tags');
return $labels;
}
public function getVirtualFields() { public function getVirtualFields() {
$fields = parent::getVirtualFields(); $fields = parent::getVirtualFields();

View File

@ -30,21 +30,26 @@ class FileSubsites extends DataExtension {
if($this->owner instanceof Folder) { if($this->owner instanceof Folder) {
$sites = Subsite::accessible_sites('CMS_ACCESS_AssetAdmin'); $sites = Subsite::accessible_sites('CMS_ACCESS_AssetAdmin');
$values = array(); $values = array();
$values[0] = 'All sites'; $values[0] = _t('FileSubsites.AllSitesDropdownOpt','All sites');
foreach ($sites as $site) { foreach ($sites as $site) {
$values[$site->ID] = $site->Title; $values[$site->ID] = $site->Title;
} }
ksort($values); ksort($values);
if($sites){ if($sites){
//Dropdown needed to move folders between subsites //Dropdown needed to move folders between subsites
$fields->push($dropdown = new DropdownField('SubsiteID', 'Subsite', $values)); $dropdown = new DropdownField(
'SubsiteID',
_t('FileSubsites.SubsiteFieldLabel','Subsite'),
$values
);
$dropdown->addExtraClass('subsites-move-dropdown');
$fields->push($dropdown);
$fields->push(new LiteralField( $fields->push(new LiteralField(
'Message', 'Message',
'<p class="message notice">'. '<p class="message notice">'.
_t('ASSETADMIN.SUBSITENOTICE', 'Folders and files created in the main site are accessible by all subsites.') _t('ASSETADMIN.SUBSITENOTICE', 'Folders and files created in the main site are accessible by all subsites.')
.'</p>' .'</p>'
)); ));
$dropdown->addExtraClass('subsites-move-dropdown');
} }
} }
} }

View File

@ -93,7 +93,8 @@ class GroupSubsites extends DataExtension implements PermissionProvider {
*/ */
function alternateTreeTitle() { function alternateTreeTitle() {
if($this->owner->AccessAllSubsites) { if($this->owner->AccessAllSubsites) {
return htmlspecialchars($this->owner->Title, ENT_QUOTES) . ' <i>(global group)</i>'; $title = _t('GroupSubsites.GlobalGroup', 'global group');
return htmlspecialchars($this->owner->Title, ENT_QUOTES) . ' <i>(' . $title . ')</i>';
} else { } else {
$subsites = Convert::raw2xml(implode(", ", $this->owner->Subsites()->column('Title'))); $subsites = Convert::raw2xml(implode(", ", $this->owner->Subsites()->column('Title')));
return htmlspecialchars($this->owner->Title) . " <i>($subsites)</i>"; return htmlspecialchars($this->owner->Title) . " <i>($subsites)</i>";

View File

@ -40,6 +40,10 @@ class LeftAndMainSubsites extends Extension {
* @return ArrayList of {@link Subsite} instances. * @return ArrayList of {@link Subsite} instances.
*/ */
function sectionSites($includeMainSite = true, $mainSiteTitle = "Main site", $member = null) { function sectionSites($includeMainSite = true, $mainSiteTitle = "Main site", $member = null) {
if($mainSiteTitle == 'Main site') {
$mainSiteTitle = _t('Subsites.MainSiteTitle', 'Main site');
}
// Rationalise member arguments // Rationalise member arguments
if(!$member) $member = Member::currentUser(); if(!$member) $member = Member::currentUser();
if(!$member) return new ArrayList(); if(!$member) return new ArrayList();

View File

@ -112,8 +112,8 @@ class SiteTreeSubsites extends DataExtension {
if(!$sc) { if(!$sc) {
$sc = new SiteConfig(); $sc = new SiteConfig();
$sc->SubsiteID = $this->owner->SubsiteID; $sc->SubsiteID = $this->owner->SubsiteID;
$sc->Title = 'Your Site Name'; $sc->Title = _t('Subsite.SiteConfigTitle','Your Site Name');
$sc->Tagline = 'your tagline here'; $sc->Tagline = _t('Subsite.SiteConfigSubtitle','Your tagline here');
$sc->write(); $sc->write();
} }
return $sc; return $sc;

View File

@ -63,23 +63,11 @@ class Subsite extends DataObject implements PermissionProvider {
); );
private static $searchable_fields = array( private static $searchable_fields = array(
'Title' => array( 'Title',
'title' => 'Subsite Name' 'Domains.Domain',
), 'IsPublic',
'Domains.Domain' => array(
'title' => 'Domain name'
),
'IsPublic' => array(
'title' => 'Active subsite',
),
); );
private static $summary_fields = array(
'Title' => 'Subsite Name',
'PrimaryDomain' => 'Primary Domain',
'IsPublic' => 'Active subsite',
);
/** /**
* Memory cache of accessible sites * Memory cache of accessible sites
*/ */
@ -204,12 +192,24 @@ class Subsite extends DataObject implements PermissionProvider {
*/ */
function getCMSFields() { function getCMSFields() {
if($this->ID!=0) { if($this->ID!=0) {
$domainTable = new GridField("Domains", "Domains", $this->Domains(), GridFieldConfig_RecordEditor::create(10)); $domainTable = new GridField(
"Domains",
_t('Subsite.DomainsListTitle',"Domains"),
$this->Domains(),
GridFieldConfig_RecordEditor::create(10)
);
}else { }else {
$domainTable = new LiteralField('Domains', '<p>'._t('Subsite.DOMAINSAVEFIRST', 'You can only add domains after saving for the first time').'</p>'); $domainTable = new LiteralField(
'Domains',
'<p>'._t('Subsite.DOMAINSAVEFIRST', 'You can only add domains after saving for the first time').'</p>'
);
} }
$languageSelector = new DropdownField('Language', 'Language', i18n::get_common_locales()); $languageSelector = new DropdownField(
'Language',
$this->fieldLabel('Language'),
i18n::get_common_locales()
);
$pageTypeMap = array(); $pageTypeMap = array();
$pageTypes = SiteTree::page_type_classes(); $pageTypes = SiteTree::page_type_classes();
@ -220,18 +220,22 @@ class Subsite extends DataObject implements PermissionProvider {
$fields = new FieldList( $fields = new FieldList(
$subsiteTabs = new TabSet('Root', $subsiteTabs = new TabSet('Root',
new Tab('Configuration', new Tab(
'Configuration',
_t('Subsite.TabTitleConfig', 'Configuration'),
new HeaderField($this->getClassName() . ' configuration', 2), new HeaderField($this->getClassName() . ' configuration', 2),
new TextField('Title', 'Name of subsite:', $this->Title), new TextField('Title', $this->fieldLabel('Title'), $this->Title),
new HeaderField("Domains for this subsite"), new HeaderField(
_t('Subsite.DomainsHeadline',"Domains for this subsite")
),
$domainTable, $domainTable,
$languageSelector, $languageSelector,
// new TextField('RedirectURL', 'Redirect to URL', $this->RedirectURL), // new TextField('RedirectURL', 'Redirect to URL', $this->RedirectURL),
new CheckboxField('DefaultSite', 'Default site', $this->DefaultSite), new CheckboxField('DefaultSite', $this->fieldLabel('DefaultSite'), $this->DefaultSite),
new CheckboxField('IsPublic', 'Enable public access', $this->IsPublic), new CheckboxField('IsPublic', $this->fieldLabel('IsPublic'), $this->IsPublic),
new DropdownField('Theme','Theme', $this->allowedThemes(), $this->Theme), new DropdownField('Theme',$this->fieldLabel('Theme'), $this->allowedThemes(), $this->Theme),
new LiteralField( new LiteralField(
@ -258,6 +262,29 @@ class Subsite extends DataObject implements PermissionProvider {
return $fields; return $fields;
} }
public function fieldLabels($includerelations = true) {
$labels = parent::fieldLabels($includerelations);
$labels['Title'] = _t('Subsites.TitleFieldLabel', 'Subsite Name');
$labels['RedirectURL'] = _t('Subsites.RedirectURLFieldLabel', 'Redirect URL');
$labels['DefaultSite'] = _t('Subsites.DefaultSiteFieldLabel', 'Default site');
$labels['Theme'] = _t('Subsites.ThemeFieldLabel', 'Theme');
$labels['Language'] = _t('Subsites.LanguageFieldLabel', 'Language');
$labels['IsPublic'] = _t('Subsites.IsPublicFieldLabel', 'Enable public access');
$labels['PageTypeBlacklist'] = _t('Subsites.PageTypeBlacklistFieldLabel', 'Page Type Blacklist');
$labels['Domains.Domain'] = _t('Subsites.DomainFieldLabel', 'Domain');
$labels['PrimaryDomain'] = _t('Subsites.PrimaryDomainFieldLabel', 'Primary Domain');
return $labels;
}
public function summaryFields() {
return array(
'Title' => $this->fieldLabel('Title'),
'PrimaryDomain' => $this->fieldLabel('PrimaryDomain'),
'IsPublic' => _t('Subsite.IsPublicHeaderField','Active subsite'),
);
}
/** /**
* @todo getClassName is redundant, already stored as a database field? * @todo getClassName is redundant, already stored as a database field?
*/ */
@ -267,15 +294,25 @@ class Subsite extends DataObject implements PermissionProvider {
function getCMSActions() { function getCMSActions() {
return new FieldList( return new FieldList(
new FormAction('callPageMethod', "Create copy", null, 'adminDuplicate') new FormAction(
'callPageMethod',
_t('Subsite.ButtonLabelCopy',"Create copy"),
null,
'adminDuplicate'
)
); );
} }
function adminDuplicate() { function adminDuplicate() {
$newItem = $this->duplicate(); $newItem = $this->duplicate();
$JS_title = Convert::raw2js($this->Title); $message = _t(
'Subsite.CopyMessage',
'Created a copy of {title}',
array('title' => Convert::raw2js($this->Title))
);
return <<<JS return <<<JS
statusMessage('Created a copy of $JS_title', 'good'); statusMessage($message, 'good');
$('Form_EditForm').loadURLFromServer('admin/subsites/show/$newItem->ID'); $('Form_EditForm').loadURLFromServer('admin/subsites/show/$newItem->ID');
JS; JS;
} }

View File

@ -12,8 +12,8 @@ class SubsiteDomain extends DataObject {
); );
private static $summary_fields=array( private static $summary_fields=array(
'Domain'=>'Domain', 'Domain',
'IsPrimary'=>'Is Primary Domain' 'IsPrimary',
); );
/** /**
@ -27,8 +27,16 @@ class SubsiteDomain extends DataObject {
public function getCMSFields() { public function getCMSFields() {
return new FieldList( return new FieldList(
new TextField('Domain', _t('SubsiteDomain.DOMAIN', 'Domain'), null, 255), new TextField('Domain', $this->fieldLabel('Domain'), null, 255),
new CheckboxField('IsPrimary', _t('SubsiteDomain.IS_PRIMARY', 'Is Primary Domain')) new CheckboxField('IsPrimary', $this->fieldLabel('IsPrimary'))
); );
} }
public function fieldLabels($includerelations = true) {
$labels = parent::fieldLabels($includerelations);
$labels['Domain'] = _t('SubsiteDomain.DOMAIN', 'Domain');
$labels['IsPrimary'] = _t('SubsiteDomain.IS_PRIMARY', 'Is Primary Domain');
return $labels;
}
} }

View File

@ -1,39 +1,81 @@
en: en:
SubsiteAdmin: SubsiteAdmin:
MENUTITLE: "Subsites" MENUTITLE: Subsites
GroupSubsites: SubsiteXHRController:
ACCESSALL: "All subsites" MENUTITLE: SubsiteXHRController
ACCESSONLY: "Only these subsites" ASSETADMIN:
ACCESSRADIOTITLE: "Give this group access to" SUBSITENOTICE: 'Folders and files created in the main site are accessible by all subsites.'
SECURITYTABTITLE: "Subsites" FileSubsites:
ModelAdmin: AllSitesDropdownOpt: 'All sites'
LOADEDFOREDITING: "Loaded \'%s\' for editing." SubsiteFieldLabel: Subsite
RelatedPageLink: GridFieldAddFromTemplateButton:
PLURALNAME: "Related Page Links" AddFromTemplate: 'Add New from Template'
SINGULARNAME: "Related Page Link" GroupSubsites:
Subsite: ACCESSALL: 'All subsites'
PLURALNAME: "Subsits" ACCESSONLY: 'Only these subsites'
SINGULARNAME: "Subsite" ACCESSRADIOTITLE: 'Give this group access to'
DOMAINSAVEFIRST: "You can only add domains after saving for the first time" GlobalGroup: 'global group'
SubsiteDomain: MANAGE_SUBSITES: 'Manage subsites for groups'
PLURALNAME: "Subsite Domains" MANAGE_SUBSITES_HELP: 'Ability to limit the permissions for a group to one or more subsites.'
SINGULARNAME: "Subsite Domain" SECURITYTABTITLE: Subsites
DOMAIN: "Domain" LeftAndMainSubsites:
IS_PRIMARY: "Is Primary Domain" Saved: 'Saved, please update related pages.'
Subsite_Template: LeftAndMain_Menu.ss:
PLURALNAME: "Subsite Templats" Hello: Hi
SINGULARNAME: "Subsite Template" LOGOUT: 'Log out'
SubsitesVirtualPage: Permissions:
PLURALNAME: "Subsites Virtual Pags" PERMISSIONS_CATEGORY: 'Roles and access permissions'
SINGULARNAME: "Subsites Virtual Page" SiteTree:
VirtualPage: PLURALNAME: Pages
CHOOSE: "Choose a page to link to" SINGULARNAME: Page
EDITCONTENT: "Click here to edit the content" SiteTreeSubsites:
GridFieldAddFromTemplateButton: CopyAction: Copy
AddFromTemplate: "Add New from Template" CopyToSubsite: 'Copy page to subsite'
GridFieldAddFromTemplate: Subsite:
NewFromTemplate: "New %s from template" ButtonLabelCopy: 'Create copy'
TEMPLATE_NOT_FOUND: "The selected template could not be found" COPYSTRUCTURE: 'Copy structure from:'
TEMPLATE: "Template" CopyMessage: 'Created a copy of {title}'
LeftAndMainSubsites: CustomExtraMeta: 'Custom Meta Tags'
DEFAULT_SITE: "Default Site" CustomMetaDescription: Description
CustomMetaKeywords: Keywords
CustomMetaTitle: Title
DOMAINSAVEFIRST: 'You can only add domains after saving for the first time'
DomainsHeadline: 'Domains for this subsite'
DomainsListTitle: Domains
IsPublicHeaderField: 'Active subsite'
MANAGE_ASSETS: 'Manage assets for subsites'
MANAGE_ASSETS_HELP: 'Ability to select the subsite to which an asset folder belongs. Requires "Access to Files & Images."'
NOTEMPLATE: 'No template'
PLURALNAME: Subsits
PageTypeBlacklistField: 'Disallow page types?'
SINGULARNAME: Subsite
SiteConfigSubtitle: 'Your tagline here'
SiteConfigTitle: 'Your Site Name'
TabTitleConfig: Configuration
ValidateTitle: 'Please add a "Title"'
SubsiteDomain:
DOMAIN: Domain
IS_PRIMARY: 'Is Primary Domain'
PLURALNAME: 'Subsite Domains'
SINGULARNAME: 'Subsite Domain'
SubsiteReportWrapper:
ReportDropdown: Sites
Subsites:
DefaultSiteFieldLabel: 'Default site'
DomainFieldLabel: Domain
IsPublicFieldLabel: 'Enable public access'
LanguageFieldLabel: Language
MainSiteTitle: 'Main site'
PageTypeBlacklistFieldLabel: 'Page Type Blacklist'
PrimaryDomainFieldLabel: 'Primary Domain'
RedirectURLFieldLabel: 'Redirect URL'
ThemeFieldLabel: Theme
TitleFieldLabel: 'Subsite Name'
SubsitesVirtualPage:
DESCRIPTION: 'Displays the content of a page on another subsite'
PLURALNAME: 'Base Pages'
SINGULARNAME: 'Subsites Virtual Page'
SubsiteField: Subsite
VirtualPage:
CHOOSE: 'Choose a page to link to'
EDITCONTENT: 'Click here to edit the content'

View File

@ -1 +1 @@
<a href="$NewFromTemplateLink" class="action ss-ui-action-constructive ss-ui-button ui-button ui-widget ui-state-default ui-corner-all new new-link" data-icon="add"><% _t('GridFieldAddFromTemplateButton.AddFromTemplate', '_Add New from Template') %></a> <a href="$NewFromTemplateLink" class="action ss-ui-action-constructive ss-ui-button ui-button ui-widget ui-state-default ui-corner-all new new-link" data-icon="add"><% _t('GridFieldAddFromTemplateButton.AddFromTemplate', 'Add New from Template') %></a>

View File

@ -105,7 +105,6 @@ class SubsiteAdminFunctionalTest extends FunctionalTest {
// Check forbidden site, on a section that's not allowed on any other subsite // Check forbidden site, on a section that's not allowed on any other subsite
$this->getAndFollowAll("admin/assets/?SubsiteID=0"); $this->getAndFollowAll("admin/assets/?SubsiteID=0");
$this->assertEquals(Subsite::currentSubsiteID(), $subsite1->ID, 'Is redirected to first permitted subsite.'); $this->assertEquals(Subsite::currentSubsiteID(), $subsite1->ID, 'Is redirected to first permitted subsite.');
var_dump($this->mainSession->lastUrl());
$this->assertNotRegExp('#^Security/login.*#', $this->mainSession->lastUrl(), 'Is not denied access'); $this->assertNotRegExp('#^Security/login.*#', $this->mainSession->lastUrl(), 'Is not denied access');
// Check the standalone XHR controller. // Check the standalone XHR controller.