mirror of
https://github.com/silverstripe/silverstripe-translatable
synced 2024-10-22 11:05:59 +02:00
616a123ddc
Adds a language dropdown to the link form in the html editor, so that linking to pages in different locales is possible.
108 lines
3.7 KiB
PHP
Executable File
108 lines
3.7 KiB
PHP
Executable File
<?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) && Object::has_extension($class, '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;
|
|
}
|
|
|
|
} |