/** * Test conversion of a url's locale to a TLD * (make sure a german page shows with a .de extension) */ function testConvertURLLocaleToTLD() { $orig_locale = Translatable::get_current_locale(); Translatable::set_current_locale('en_US'); $url = "http://www.mysite.co.uk:8888/home/"; $expectedResult = "mysite.com"; $newURL = TranslatableDomains::setDomainByPageLocale($url); $newURLTLD = TranslatableDomains::getTLD($newURL); $this->assertTrue($newURLTLD == $expectedResult, "Failed converting {$url} to {$expectedResult}"); Translatable::set_current_locale('de_DE'); $url = "http://mysite.com/home-de/"; $expectedResult = "another.de"; $newURL = TranslatableDomains::setDomainByPageLocale($url); $newURLTLD = TranslatableDomains::getTLD($newURL); $this->assertTrue($newURLTLD == $expectedResult, "Failed converting {$url} to {$expectedResult}"); Translatable::set_current_locale('en_GB'); $url = "http://sub.sub.mysite.com/home-gb/"; $expectedResult = "mysite.co.uk"; $newURL = TranslatableDomains::setDomainByPageLocale($url); $newURLTLD = TranslatableDomains::getTLD($newURL); $this->assertTrue($newURLTLD == $expectedResult, "Failed converting {$url} to {$expectedResult}"); Translatable::set_current_locale('fr_FR'); $url = "http://sub.localhost-jp/home-fr/"; $expectedResult = "localhost-fr"; $newURL = TranslatableDomains::setDomainByPageLocale($url); $newURLTLD = TranslatableDomains::getTLD($newURL); $this->assertTrue($newURLTLD == $expectedResult, "Failed converting {$url} to {$expectedResult}"); Translatable::set_current_locale('ja_JP'); $url = "http://localhost-jp:8888/home-jp/"; $expectedResult = "localhost-jp"; $newURL = TranslatableDomains::setDomainByPageLocale($url); $newURLTLD = TranslatableDomains::getTLD($newURL); $this->assertTrue($newURLTLD == $expectedResult, "Failed converting {$url} to {$expectedResult}"); Translatable::set_current_locale($orig_locale); }
/** * Returns a DataList containing Pages. * The provided links point to their translated pages. * You can use it in templates like this: * * <% loop LanguageChooser %> * $Title, $Current, and any other vars in your page instance * <% end_loop %> * * @return DataList */ public function LanguageChooser() { if (!Controller::curr()) { return; } if ($langs = Translatable::get_allowed_locales()) { $data = ArrayList::create(); foreach ($langs as $key => $code) { if ($code == Translatable::get_current_locale()) { $this->owner->Current = 'current'; $data->push($this->owner); } else { $translation = $this->owner->getTranslation($code); if ($translation) { $data->push($translation); } else { $page = Translatable::get_one_by_locale("SiteTree", $code, "URLSegment LIKE 'home%'"); if ($page) { $data->push($page); } } } } return $data; } return false; }
/** * Get the full form (e.g. /home/) relative link to the home page for the current HTTP_HOST value. Note that the * link is trimmed of leading and trailing slashes before returning to ensure consistency. * * @return string */ public static function get_homepage_link() { if (!self::$cached_homepage_link) { // @todo Move to 'homepagefordomain' module if (class_exists('HomepageForDomainExtension')) { $host = str_replace('www.', null, $_SERVER['HTTP_HOST']); $candidates = SiteTree::get()->where(array('"SiteTree"."HomepageForDomain" LIKE ?' => "%{$host}%")); if ($candidates) { foreach ($candidates as $candidate) { if (preg_match('/(,|^) *' . preg_quote($host) . ' *(,|$)/', $candidate->HomepageForDomain)) { self::$cached_homepage_link = trim($candidate->RelativeLink(true), '/'); } } } } if (!self::$cached_homepage_link) { // TODO Move to 'translatable' module if (class_exists('Translatable') && SiteTree::has_extension('Translatable') && ($link = Translatable::get_homepage_link_by_locale(Translatable::get_current_locale()))) { self::$cached_homepage_link = $link; } else { self::$cached_homepage_link = Config::inst()->get('RootURLController', 'default_homepage_link'); } } } return self::$cached_homepage_link; }
/** * Get a set of content languages (for quick language navigation) * @example * <code> * <!-- in your template --> * <ul class="langNav"> * <% loop Languages %> * <li><a href="$Link" class="$LinkingMode" title="$Title.ATT">$Language</a></li> * <% end_loop %> * </ul> * </code> * * @return ArrayList|null */ public function Languages() { $locales = TranslatableUtility::get_content_languages(); // there's no need to show a navigation when there's less than 2 languages. So return null if (count($locales) < 2) { return null; } $currentLocale = Translatable::get_current_locale(); $homeTranslated = null; if ($home = SiteTree::get_by_link('home')) { /** @var SiteTree $homeTranslated */ $homeTranslated = $home->getTranslation($currentLocale); } /** @var ArrayList $langSet */ $langSet = ArrayList::create(); foreach ($locales as $locale => $name) { Translatable::set_current_locale($locale); /** @var SiteTree $translation */ $translation = $this->owner->hasTranslation($locale) ? $this->owner->getTranslation($locale) : null; $langSet->push(new ArrayData(array('Locale' => $locale, 'RFC1766' => i18n::convert_rfc1766($locale), 'Language' => DBField::create_field('Varchar', strtoupper(i18n::get_lang_from_locale($locale))), 'Title' => DBField::create_field('Varchar', html_entity_decode(i18n::get_language_name(i18n::get_lang_from_locale($locale), true), ENT_NOQUOTES, 'UTF-8')), 'LinkingMode' => $currentLocale == $locale ? 'current' : 'link', 'Link' => $translation ? $translation->AbsoluteLink() : ($homeTranslated ? $homeTranslated->Link() : '')))); } Translatable::set_current_locale($currentLocale); i18n::set_locale($currentLocale); return $langSet; }
/** * Convenience method to use within a locale context. * Eg. by specifying the edit fields with the UploadField. * <code> * $imageUpload = UploadField::create('Image'); * $imageUpload->setFileEditFields('getUploadEditorFields'); * </code> * @return FieldList */ public function getUploadEditorFields() { /** @var FieldList $fields */ $fields = FieldList::create(); $translatedFields = TranslatableDataObject::get_localized_class_fields($this->owner->class); $transformation = null; $defaultLocale = Translatable::default_locale(); if ($defaultLocale != Translatable::get_current_locale()) { /** @var TranslatableFormFieldTransformation $transformation */ $transformation = TranslatableFormFieldTransformation::create($this->owner); } foreach ($translatedFields as $fieldName) { // create the field in the default locale /** @var FormField $field */ $field = $this->owner->getLocalizedFormField($fieldName, $defaultLocale); // use translated title if available $field->setTitle(_t('File.' . $fieldName, $fieldName)); // if not in the default locale, we apply the form field transformation to the field if ($transformation) { $field = $transformation->transformFormField($field); } $fields->push($field); } return $fields; }
/** * Initiate the standard Metadata catalogue search form. The * additional parameter $defaults defines the default values for the form. * * @param Controller $controller The parent controller, necessary to create the appropriate form action tag. * @param String $name The method on the controller that will return this form object. * @param FieldSet $fields All of the fields in the form - a {@link FieldSet} of {@link FormField} objects. * @param FieldSet $actions All of the action buttons in the form - a {@link FieldSet} of {@link FormAction} objects * @param Validator $validator Override the default validator instance (Default: {@link RequiredFields}) * @param Array $defaults Override the default values of the form. */ function __construct($controller, $name, FieldSet $fields = null, FieldSet $actions = null, $validator = null, $defaults = null) { $format = $defaults['format']; $searchTerm = $defaults['searchTerm']; $bboxUpper = $bboxLower = null; if (isset($defaults['bboxUpper']) && isset($defaults['bboxLower'])) { $bboxUpper = $defaults['bboxUpper']; $bboxLower = $defaults['bboxLower']; } $values = CataloguePage_Controller::get_standard_names(); $upperField = new HiddenField('bboxUpper', _t('SearchForm.SEARCH', 'bboxUpper'), $bboxUpper); $upperField->addExtraClass('upper'); $lowerField = new HiddenField('bboxLower', _t('SearchForm.SEARCH', 'bboxLower'), $bboxLower); $lowerField->addExtraClass('lower'); if (!$fields) { $fields = new FieldSet(new TextField('searchTerm', _t('SearchForm.SEARCH', 'Search'), $searchTerm), $upperField, $lowerField, new OptionsetField('format', _t('SearchForm.MetadataStandard', 'Metadata Standard'), $values, $format)); } if (singleton('SiteTree')->hasExtension('Translatable')) { $fields->push(new HiddenField('locale', 'locale', Translatable::get_current_locale())); } if (!$actions) { $actions = new FieldSet(new FormAction("submit", _t('SearchForm.Search', 'Search'))); } parent::__construct($controller, $name, $fields, $actions); $this->setFormMethod('get'); }
public function setUp() { parent::setUp(); //Remap translation group for home pages Translatable::disable_locale_filter(); $default = $this->objFromFixture('Page', 'home'); $defaultFR = $this->objFromFixture('Page', 'home_fr'); $defaultFR->addTranslationGroup($default->ID, true); Translatable::enable_locale_filter(); $this->origLocaleRoutingEnabled = Config::inst()->get('MultilingualRootURLController', 'UseLocaleURL'); Config::inst()->update('MultilingualRootURLController', 'UseLocaleURL', false); $this->origDashLocaleEnabled = Config::inst()->get('MultilingualRootURLController', 'UseDashLocale'); Config::inst()->update('MultilingualRootURLController', 'UseDashLocale', false); $this->origAcceptLanguage = $_SERVER['HTTP_ACCEPT_LANGUAGE']; $_SERVER['HTTP_ACCEPT_LANGUAGE'] = 'en-US,en;q=0.5'; $this->origCookieLocale = Cookie::get('language'); Cookie::force_expiry('language'); $this->origCurrentLocale = Translatable::get_current_locale(); Translatable::set_current_locale('en_US'); $this->origLocale = Translatable::default_locale(); Translatable::set_default_locale('en_US'); $this->origi18nLocale = i18n::get_locale(); i18n::set_locale('en_US'); $this->origAllowedLocales = Translatable::get_allowed_locales(); Translatable::set_allowed_locales(array('en_US', 'fr_FR')); MultilingualRootURLController::reset(); }
public function output() { // TODO: Refactor into a content-type option if (\Director::is_ajax()) { return $this->friendlyErrorMessage; } else { // TODO: Refactor this into CMS if (class_exists('ErrorPage')) { $errorFilePath = \ErrorPage::get_filepath_for_errorcode($this->statusCode, class_exists('Translatable') ? \Translatable::get_current_locale() : null); if (file_exists($errorFilePath)) { $content = file_get_contents($errorFilePath); if (!headers_sent()) { header('Content-Type: text/html'); } // $BaseURL is left dynamic in error-###.html, so that multi-domain sites don't get broken return str_replace('$BaseURL', \Director::absoluteBaseURL(), $content); } } $renderer = \Debug::create_debug_view(); $output = $renderer->renderHeader(); $output .= $renderer->renderInfo("Website Error", $this->friendlyErrorMessage, $this->friendlyErrorDetail); if (\Email::config()->admin_email) { $mailto = \Email::obfuscate(\Email::config()->admin_email); $output .= $renderer->renderParagraph('Contact an administrator: ' . $mailto . ''); } $output .= $renderer->renderFooter(); return $output; } }
public function onBeforeWrite() { parent::onBeforeWrite(); if (!$this->owner->Locale) { $this->owner->Locale = Translatable::get_current_locale(); } }
public function setUp() { parent::setUp(); Translatable::disable_locale_filter(); //Publish all english pages $pages = Page::get()->filter('Locale', 'en_US'); foreach ($pages as $page) { $page->publish('Stage', 'Live'); } //Rewrite the french translation groups and publish french pages $pagesFR = Page::get()->filter('Locale', 'fr_FR'); foreach ($pagesFR as $index => $page) { $page->addTranslationGroup($pages->offsetGet($index)->ID, true); $page->publish('Stage', 'Live'); } Translatable::enable_locale_filter(); $this->origLocaleRoutingEnabled = Config::inst()->get('MultilingualRootURLController', 'UseLocaleURL'); Config::inst()->update('MultilingualRootURLController', 'UseLocaleURL', false); $this->origDashLocaleEnabled = Config::inst()->get('MultilingualRootURLController', 'UseDashLocale'); Config::inst()->update('MultilingualRootURLController', 'UseDashLocale', false); $this->origAcceptLanguage = $_SERVER['HTTP_ACCEPT_LANGUAGE']; $_SERVER['HTTP_ACCEPT_LANGUAGE'] = 'en-US,en;q=0.5'; $this->origCookieLocale = Cookie::get('language'); Cookie::force_expiry('language'); Cookie::set('language', 'en'); $this->origCurrentLocale = Translatable::get_current_locale(); Translatable::set_current_locale('en_US'); $this->origLocale = Translatable::default_locale(); Translatable::set_default_locale('en_US'); $this->origi18nLocale = i18n::get_locale(); i18n::set_locale('en_US'); $this->origAllowedLocales = Translatable::get_allowed_locales(); Translatable::set_allowed_locales(array('en_US', 'fr_FR')); MultilingualRootURLController::reset(); }
/** * Get the full form (e.g. /home/) relative link to the home page for the current HTTP_HOST value. Note that the * link is trimmed of leading and trailing slashes before returning to ensure consistency. * * @return string */ public static function get_homepage_link() { if (!self::$cached_homepage_link) { // TODO Move to 'homepagefordomain' module if (class_exists('HomepageForDomainExtension')) { $host = str_replace('www.', null, $_SERVER['HTTP_HOST']); $SQL_host = Convert::raw2sql($host); $candidates = DataObject::get('SiteTree', "\"HomepageForDomain\" LIKE '%{$SQL_host}%'"); if ($candidates) { foreach ($candidates as $candidate) { if (preg_match('/(,|^) *' . preg_quote($host) . ' *(,|$)/', $candidate->HomepageForDomain)) { self::$cached_homepage_link = trim($candidate->RelativeLink(true), '/'); } } } } if (!self::$cached_homepage_link) { // TODO Move to 'translatable' module if (class_exists('Translatable') && Object::has_extension('SiteTree', 'Translatable') && ($link = Translatable::get_homepage_link_by_locale(Translatable::get_current_locale()))) { self::$cached_homepage_link = $link; } else { self::$cached_homepage_link = self::get_default_homepage_link(); } } } return self::$cached_homepage_link; }
/** * PageByCurrentLocale * gets a page in the default locale and finds its translation in the current locale * * @param string $pageURL url of a page in the default locale * @return DataObject Translated record of the requested page in the current locale, null if none exists. */ function PageByCurrentLocale($pageURL) { if ($pg = Translatable::get_one_by_locale('Page', Translatable::default_locale(), "URLSegment = '{$pageURL}'")) { return $pg->getTranslation(Translatable::get_current_locale()); } return null; }
/** * Creates a form object with a free configurable markup. * Adds the current locale to the custom params. * * @param ContentController $controller the calling controller instance * @param array $params optional parameters * @param array $preferences optional preferences * @param bool $barebone defines if a form should only be instanciated or be used too * * @return CustomHtmlForm * * @author Sebastian Diel <*****@*****.**> * @since 26.06.2013 */ public function __construct($controller, $params = null, $preferences = null, $barebone = false) { if (is_null($params)) { $params = array(); } $params['locale'] = Translatable::get_current_locale(); parent::__construct($controller, $params, $preferences, $barebone); }
function updateLinkForm(&$form) { $field = new LanguageDropdownField('Language', _t('CMSMain.LANGUAGEDROPDOWNLABEL', 'Language')); $field->setValue(Translatable::get_current_locale()); $field->setForm($form); $form->Fields()->insertBefore($field, 'internal'); Requirements::javascript('translatable/javascript/HtmlEditorField.Translatable.js'); }
public function getExtendedResults($pageLength = null, $sort = 'Relevance DESC', $filter = '', $data = null) { // legacy usage: $data was defaulting to $_REQUEST, parameter not passed in doc.silverstripe.org tutorials if (!isset($data) || !is_array($data)) { $data = $_REQUEST; } // set language (if present) if (class_exists('Translatable')) { if (singleton('SiteTree')->hasExtension('Translatable') && isset($data['searchlocale'])) { if ($data['searchlocale'] == "ALL") { Translatable::disable_locale_filter(); } else { $origLocale = Translatable::get_current_locale(); Translatable::set_current_locale($data['searchlocale']); } } } $keywords = $data['Search']; $andProcessor = create_function('$matches', ' return " +" . $matches[2] . " +" . $matches[4] . " "; '); $notProcessor = create_function('$matches', ' return " -" . $matches[3]; '); $keywords = preg_replace_callback('/()("[^()"]+")( and )("[^"()]+")()/i', $andProcessor, $keywords); $keywords = preg_replace_callback('/(^| )([^() ]+)( and )([^ ()]+)( |$)/i', $andProcessor, $keywords); $keywords = preg_replace_callback('/(^| )(not )("[^"()]+")/i', $notProcessor, $keywords); $keywords = preg_replace_callback('/(^| )(not )([^() ]+)( |$)/i', $notProcessor, $keywords); $keywords = $this->addStarsToKeywords($keywords); if (!$pageLength) { $pageLength = $this->owner->pageLength; } $start = isset($_GET['start']) ? (int) $_GET['start'] : 0; if (strpos($keywords, '"') !== false || strpos($keywords, '+') !== false || strpos($keywords, '-') !== false || strpos($keywords, '*') !== false) { $results = DB::getConn()->searchEngine($this->owner->classesToSearch, $keywords, $start, $pageLength, $sort, $filter, true); } else { $results = DB::getConn()->searchEngine($this->owner->classesToSearch, $keywords, $start, $pageLength); } // filter by permission if ($results) { foreach ($results as $result) { if (!$result->canView()) { $results->remove($result); } } } // reset locale if (class_exists('Translatable')) { if (singleton('SiteTree')->hasExtension('Translatable') && isset($data['searchlocale'])) { if ($data['searchlocale'] == "ALL") { Translatable::enable_locale_filter(); } else { Translatable::set_current_locale($origLocale); } } } return $results; }
public function getResults($pageLength = null, $data = null) { // legacy usage: $data was defaulting to $_REQUEST, parameter not passed in doc.silverstripe.org tutorials if (!isset($data) || !is_array($data)) { $data = $_REQUEST; } // set language (if present) if (class_exists('Translatable') && singleton('SiteTree')->hasExtension('Translatable') && isset($data['locale'])) { $origLocale = Translatable::get_current_locale(); Translatable::set_current_locale($data['locale']); } $keywords = $data['Search']; $andProcessor = create_function('$matches', ' return " +" . $matches[2] . " +" . $matches[4] . " "; '); $notProcessor = create_function('$matches', ' return " -" . $matches[3]; '); $keywords = preg_replace_callback('/()("[^()"]+")( and )("[^"()]+")()/i', $andProcessor, $keywords); $keywords = preg_replace_callback('/(^| )([^() ]+)( and )([^ ()]+)( |$)/i', $andProcessor, $keywords); $keywords = preg_replace_callback('/(^| )(not )("[^"()]+")/i', $notProcessor, $keywords); $keywords = preg_replace_callback('/(^| )(not )([^() ]+)( |$)/i', $notProcessor, $keywords); $keywords = $this->addStarsToKeywords($keywords); if (!$pageLength) { $pageLength = $this->pageLength; } $start = isset($_GET['start']) ? (int) $_GET['start'] : 0; $siteFilter = ''; $fileFilter = "ID != 0"; $site = Multisites::inst()->getCurrentSite(); $siteFilter = 'SiteID = ' . $site->ID; if ($this->config()->restrict_files_by_site) { if ($site->FolderID) { $prefix = $site->Folder()->Filename; if (strlen($prefix)) { $fileFilter .= ' AND "Filename" LIKE \'' . Convert::raw2sql($prefix) . '%\''; } } } if (strpos($keywords, '"') !== false || strpos($keywords, '+') !== false || strpos($keywords, '-') !== false || strpos($keywords, '*') !== false) { $results = DB::getConn()->searchEngine($this->classesToSearch, $keywords, $start, $pageLength, "\"Relevance\" DESC", $siteFilter, true, $fileFilter); } else { $results = DB::getConn()->searchEngine($this->classesToSearch, $keywords, $start, $pageLength, '', $siteFilter, false, $fileFilter); } // filter by permission if ($results) { foreach ($results as $result) { if (!$result->canView()) { $results->remove($result); } } } // reset locale if (class_exists('Translatable') && singleton('SiteTree')->hasExtension('Translatable') && isset($data['locale'])) { Translatable::set_current_locale($origLocale); } return $results; }
/** * Get the current locale. * Tries to get the locale from Translatable, Fluent or the default i18n (depending on what is installed) * @return string the locale in use */ public static function get_current_locale() { if (class_exists('Translatable')) { return Translatable::get_current_locale(); } if (class_exists('Fluent')) { return Fluent::current_locale(); } return i18n::get_locale(); }
/** * @return mixed */ public function getLanguageField() { $locale = Translatable::get_current_locale(); if ($member = Member::currentUser()) { if (Permission::checkMember($member, 'VIEW_LANGS')) { return $this->getLanguageDropdownField($locale); } } return LiteralField::create('Locale', i18n::get_locale_name($locale)); }
public function updateEditForm(Form $form) { $locale = isset($_REQUEST['locale']) ? $_REQUEST['locale'] : $_REQUEST['Locale']; if (!empty($locale) && i18n::validate_locale($locale) && singleton('SiteConfig')->has_extension('Translatable') && (Translatable::get_allowed_locales() === null || in_array($locale, (array) Translatable::get_allowed_locales(), false)) && $locale != Translatable::get_current_locale()) { $orig = Translatable::get_current_locale(); Translatable::set_current_locale($locale); $formAction = $form->FormAction(); $form->setFormAction($formAction); Translatable::set_current_locale($orig); } }
public function alternateAbsoluteLink($action = null) { $link = Director::absoluteURL($this->owner->Link($action)); if ($this->owner->hasExtension('Translatable')) { $targetLoc = $this->owner->Locale; $currLoc = Translatable::get_current_locale(); if ($targetLoc != $currLoc) { $link = Controller::join_links(Director::protocol() . LocaleDomains::getHostFromLocale($targetLoc), $this->owner->RelativeLink($action)); } } return $link; }
public function onAfterInit() { if (!Director::isDev()) { // Only on live site $errorcode = $this->owner->failover->ErrorCode ? $this->owner->failover->ErrorCode : 404; $extract = preg_match('/^([a-z0-9\\.\\_\\-\\/]+)/i', $_SERVER['REQUEST_URI'], $rawString); if ($errorcode == 404 && $extract) { $uri = preg_replace('/\\.(aspx?|html?|php[34]?)$/i', '', $rawString[0]); $parts = preg_split('/\\//', $uri, -1, PREG_SPLIT_NO_EMPTY); $page_key = array_pop($parts); $sounds_like = soundex($page_key); // extend ignored classes with child classes $ignoreClassNames = array(); if ($configClasses = Config::inst()->get('Intelligent404', 'intelligent_404_ignored_classes')) { foreach ($configClasses as $class) { $ignoreClassNames = array_merge($ignoreClassNames, array_values(ClassInfo::subclassesFor($class))); } } // get all pages $SiteTree = SiteTree::get()->exclude('ClassName', $ignoreClassNames); // Translatable support if (class_exists('Translatable')) { $SiteTree = $SiteTree->filter('Locale', Translatable::get_current_locale()); } // Multisites support if (class_exists('Multisites')) { $SiteTree = $SiteTree->filter('SiteID', Multisites::inst()->getCurrentSiteId()); } $ExactMatches = new ArrayList(); $PossibleMatches = new ArrayList(); foreach ($SiteTree as $page) { if ($page->URLSegment == $page_key) { $ExactMatches->push($page); } elseif ($sounds_like == soundex($page->URLSegment)) { $PossibleMatches->push($page); } } $ExactCount = $ExactMatches->Count(); $PossibleCount = $PossibleMatches->Count(); $redirectOnSingleMatch = Config::inst()->get('Intelligent404', 'redirect_on_single_match'); if ($ExactCount == 1 && $redirectOnSingleMatch) { return $this->RedirectToPage($ExactMatches->First()->Link()); } elseif ($ExactCount == 0 && $PossibleCount == 1 && $redirectOnSingleMatch) { return $this->RedirectToPage($PossibleMatches->First()->Link()); } elseif ($ExactCount > 1 || $PossibleCount > 1 || !$redirectOnSingleMatch) { $ExactMatches->merge($PossibleMatches); $content = $this->owner->customise(array('Pages' => $ExactMatches))->renderWith(array('Intelligent404Options')); $this->owner->Content .= $content; } } } }
/** * Creates a new silvercart language dropdown field. * * @param string $name The fields name * @param string $title The fields title * @param array $source An map of the dropdown items (will be * @param string $value Current value * @param Form $form Form * @param string $emptyString Empty string * * @return void * * @author Sebastian Diel <*****@*****.**> * @since 27.04.2012 */ public function __construct($name, $title = null, $source = array(), $value = "", $form = null, $emptyString = null) { parent::__construct($name, $title, $source, $value, $form, $emptyString); $this->setController($form->controller); $currentLocale = Translatable::get_current_locale(); $translations = $this->getController()->getTranslations(); $translationSource = array(); $translationSource[$currentLocale] = array('title' => $this->getDisplayLanguage($currentLocale, $currentLocale), 'rel' => $this->getIso2($currentLocale)); foreach ($translations as $translation) { $translationSource[$translation->Locale] = array('title' => $this->getDisplayLanguage($translation->Locale, $currentLocale), 'rel' => $this->getIso2($translation->Locale)); } $this->setSource($translationSource); }
/** * Returns a LanguageDropdownField instance used as a default for form * scaffolding. * * @param string $title Optional. Localized title of the generated instance * @param array $params Optional. * * @return FormField * * @author Sebastian Diel <*****@*****.**> * @since 20.03.2013 */ public function scaffoldFormField($title = null, $params = null) { if (is_null($title)) { $title = _t('SilvercartConfig.TRANSLATION'); } $instance = null; $alreadyTranslatedLocales = array(); $translatingClass = 'SiteTree'; if (array_key_exists('object', $params)) { $translatingClass = $params['object']->ClassName; $instance = $params['object']; } if ($instance) { $alreadyTranslatedLocales = $instance->getTranslatedLocales(); unset($alreadyTranslatedLocales[$instance->Locale]); } $localeDropdown = new LanguageDropdownField($this->name, $title, $alreadyTranslatedLocales, $translatingClass, 'Locale-Native', $instance); $currentLocale = Translatable::get_current_locale(); $localesWithTitle = $localeDropdown->getSource(); $usedLocalesWithTitle = Translatable::get_existing_content_languages('SiteTree'); $languageList = array(); $usedLanguageList = array(); foreach ($localesWithTitle as $locale => $localeTitle) { if (is_array($localeTitle)) { foreach ($localeTitle as $locale2 => $title2) { $title2 = SilvercartLanguageHelper::getLanguageDisplayTitle($locale2, $currentLocale); if (array_key_exists($locale2, $usedLocalesWithTitle)) { $usedLanguageList[$locale2] = $title2; unset($languageList[$locale2]); } else { $languageList[$locale2] = $title2; } } } else { $localeTitle = SilvercartLanguageHelper::getLanguageDisplayTitle($locale, $currentLocale); if (array_key_exists($locale, $usedLocalesWithTitle)) { $usedLanguageList[$locale] = $localeTitle; unset($languageList[$locale]); } else { $languageList[$locale] = $localeTitle; } } } asort($languageList); if (count($usedLanguageList)) { asort($usedLanguageList); $languageList = array(_t('Form.LANGAVAIL', "Available languages") => $usedLanguageList, _t('Form.LANGAOTHER', "Other languages") => $languageList); } $localeDropdown->setSource($languageList); return $localeDropdown; }
/** * Returns a form with all languages with languages already used appearing first. * * @return Form */ public function updateSearchForm(Form $form) { $member = Member::currentUser(); //check to see if the current user can switch langs or not if (Permission::checkMember($member, 'VIEW_LANGS')) { $field = new LanguageDropdownField('Locale', _t('CMSMain.LANGUAGEDROPDOWNLABEL', 'Language'), array(), 'SiteTree', 'Locale-English', singleton('SiteTree')); $field->setValue(Translatable::get_current_locale())->setForm($form); } else { // user doesn't have permission to switch langs // so just show a string displaying current language $field = new LiteralField('Locale', i18n::get_locale_name(Translatable::get_current_locale())); } $form->Fields()->unshift($field); }
/** * Get a {@link SS_HTTPResponse} to response to a HTTP error code if an {@link ErrorPage} for that code is present. * * @param int $statusCode * @return SS_HTTPResponse */ public static function response_for($statusCode) { // first attempt to dynamically generate the error page if ($errorPage = DataObject::get_one('ErrorPage', "\"ErrorCode\" = {$statusCode}")) { return ModelAsController::controller_for($errorPage)->handleRequest(new SS_HTTPRequest('GET', ''), DataModel::inst()); } // then fall back on a cached version $cachedPath = self::get_filepath_for_errorcode($statusCode, class_exists('Translatable') ? Translatable::get_current_locale() : null); if (file_exists($cachedPath)) { $response = new SS_HTTPResponse(); $response->setStatusCode($statusCode); $response->setBody(file_get_contents($cachedPath)); return $response; } }
public static function getLocaleFromHost($host = null) { if (!$host) { $host = $_SERVER["HTTP_HOST"]; } $keys = array_keys(self::$locale_domains, $host); if ($keys && isset($keys[0])) { $locale = $keys[0]; } elseif (DataObject::has_extension('SiteTree', 'Translatable')) { $locale = Translatable::get_current_locale(); } else { $locale = i18n::get_locale(); } return $locale; }
/** * Get the locale for an object that has the Translatable extension. * * @return locale */ public function getLocaleForObject() { $id = (int) $this->getRequest()->requestVar('id'); $class = Convert::raw2sql($this->getRequest()->requestVar('class')); $locale = Translatable::get_current_locale(); if ($id && $class && class_exists($class) && $class::has_extension('Translatable')) { // temporarily disable locale filter so that we won't filter out the object Translatable::disable_locale_filter(); $object = DataObject::get_by_id($class, $id); Translatable::enable_locale_filter(); if ($object) { $locale = $object->Locale; } } return $locale; }
public function onTranslatableCreate($saveTranslation) { if ($saveTranslation) { //create new modules if ($original = $this->owner->getTranslation(Translatable::default_locale())) { foreach ($original->ContentModules() as $module) { //create new module $newModule = Object::create(get_class($module)); $newModule->Title = $module->Title . ' - ' . Translatable::get_current_locale(); $newModule->Locale = Translatable::get_current_locale(); $newModule->OriginalID = $original->ID; $newModule->write(); $this->owner->ContentModules()->add($newModule); } } } }
/** * Get a {@link SS_HTTPResponse} to response to a HTTP error code if an * {@link ErrorPage} for that code is present. First tries to serve it * through the standard SilverStripe request method. Falls back to a static * file generated when the user hit's save and publish in the CMS * * @param int $statusCode * * @return SS_HTTPResponse */ public static function response_for($statusCode) { // first attempt to dynamically generate the error page $errorPage = ErrorPage::get()->filter(array("ErrorCode" => $statusCode))->first(); if ($errorPage) { Requirements::clear(); Requirements::clear_combined_files(); return ModelAsController::controller_for($errorPage)->handleRequest(new SS_HTTPRequest('GET', ''), DataModel::inst()); } // then fall back on a cached version $cachedPath = self::get_filepath_for_errorcode($statusCode, class_exists('Translatable') ? Translatable::get_current_locale() : null); if (file_exists($cachedPath)) { $response = new SS_HTTPResponse(); $response->setStatusCode($statusCode); $response->setBody(file_get_contents($cachedPath)); return $response; } }
/** * Return the URL segment for the current HTTP_HOST value * * @param string $locale * @return string */ static function get_homepage_urlsegment() { $urlSegment = ''; // @todo Temporarily restricted to MySQL database while testing db abstraction if (DB::getConn() instanceof MySQLDatabase) { $host = $_SERVER['HTTP_HOST']; $host = str_replace('www.', '', $host); $SQL_host = str_replace('.', '\\.', Convert::raw2sql($host)); $homePageOBJ = DataObject::get_one("SiteTree", "HomepageForDomain REGEXP '(,|^) *{$SQL_host} *(,|\$)'"); } else { $homePageOBJ = null; } if (singleton('SiteTree')->hasExtension('Translatable') && !$homePageOBJ) { $urlSegment = Translatable::get_homepage_urlsegment_by_locale(Translatable::get_current_locale()); } elseif ($homePageOBJ) { $urlSegment = $homePageOBJ->URLSegment; } return $urlSegment ? $urlSegment : self::get_default_homepage_urlsegment(); }