<?php /** * An extension to dropdown field, pre-configured to list languages. * The languages already used in the site will be on top. * * @package translatable */ class LanguageDropdownField extends GroupedDropdownField { /** * Create a new LanguageDropdownField * @param string $name * @param string $title * @param array $excludeLocales List of locales that won't be included * @param string $translatingClass Name of the class with translated instances * where to look for used languages * @param string $list Indicates the source language list. * Can be either Common-English, Common-Native, Locale-English, Locale-Native */ function __construct($name, $title, $excludeLocales = array(), $translatingClass = 'SiteTree', $list = 'Common-English', $instance = null ) { $usedLocalesWithTitle = Translatable::get_existing_content_languages($translatingClass); $usedLocalesWithTitle = array_diff_key($usedLocalesWithTitle, $excludeLocales); if('Common-English' == $list) $allLocalesWithTitle = i18n::get_common_languages(); else if('Common-Native' == $list) $allLocalesWithTitle = i18n::get_common_languages(true); else if('Locale-English' == $list) $allLocalesWithTitle = i18n::get_common_locales(); else if('Locale-Native' == $list) $allLocalesWithTitle = i18n::get_common_locales(true); else $allLocalesWithTitle = i18n::get_locale_list(); if(isset($allLocales[Translatable::default_locale()])) { unset($allLocales[Translatable::default_locale()]); } // Limit to allowed locales if defined // Check for canTranslate() if an $instance is given $allowedLocales = Translatable::get_allowed_locales(); foreach($allLocalesWithTitle as $locale => $localeTitle) { if( ($allowedLocales && !in_array($locale, $allowedLocales)) || ($excludeLocales && in_array($locale, $excludeLocales)) || ($usedLocalesWithTitle && array_key_exists($locale, $usedLocalesWithTitle)) ) { unset($allLocalesWithTitle[$locale]); } } // instance specific permissions foreach($allLocalesWithTitle as $locale => $localeTitle) { if($instance && !$instance->canTranslate(null, $locale)) { unset($allLocalesWithTitle[$locale]); } } foreach($usedLocalesWithTitle as $locale => $localeTitle) { if($instance && !$instance->canTranslate(null, $locale)) { unset($usedLocalesWithTitle[$locale]); } } // Sort by title (array value) asort($allLocalesWithTitle); if(count($usedLocalesWithTitle)) { asort($usedLocalesWithTitle); $source = array( _t('Form.LANGAVAIL', "Available languages") => $usedLocalesWithTitle, _t('Form.LANGAOTHER', "Other languages") => $allLocalesWithTitle ); } else { $source = $allLocalesWithTitle; } parent::__construct($name, $title, $source); } function Type() { return 'languagedropdown dropdown'; } public function getAttributes() { return array_merge( parent::getAttributes(), array('data-locale-url' => $this->Link('getLocaleForObject')) ); } /** * Get the locale for an object that has the Translatable extension. * * @return locale */ 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; } }