Newer
Older
<?php
/**
* @file
Dries Buytaert
committed
* Contains \Drupal\Core\Language\LanguageManager.
*/
namespace Drupal\Core\Language;
use Drupal\Component\Utility\String;
Dries Buytaert
committed
use Drupal\Core\DependencyInjection\DependencySerializationTrait;
use Drupal\Core\StringTranslation\TranslationInterface;
* Class responsible for providing language support on language-unaware sites.
Dries Buytaert
committed
class LanguageManager implements LanguageManagerInterface {
use DependencySerializationTrait;
Dries Buytaert
committed
/**
* The string translation service.
Dries Buytaert
committed
*
* @var \Drupal\Core\StringTranslation\TranslationInterface
Dries Buytaert
committed
*/
protected $translation;
/**
* An array of all the available languages keyed by language code.
*
* @var array
*/
protected $languages;
/**
* The default language object.
*
catch
committed
* @var \Drupal\Core\Language\LanguageDefault
*/
protected $defaultLanguage;
catch
committed
/**
* Constructs the language manager.
*
* @param \Drupal\Core\Language\LanguageDefault $default_language
catch
committed
* The default language.
*/
public function __construct(LanguageDefault $default_language) {
$this->defaultLanguage = $default_language;
}
Dries Buytaert
committed
/**
* {@inheritdoc}
Dries Buytaert
committed
*/
public function setTranslation(TranslationInterface $translation) {
$this->translation = $translation;
}
Dries Buytaert
committed
/**
* Translates a string to the current language or to a given language.
Dries Buytaert
committed
*
* @see \Drupal\Core\StringTranslation\TranslationInterface()
Dries Buytaert
committed
*/
protected function t($string, array $args = array(), array $options = array()) {
return $this->translation ? $this->translation->translate($string, $args, $options) : String::format($string, $args);
}
Dries Buytaert
committed
/**
* {@inheritdoc}
*/
public function isMultilingual() {
return FALSE;
}
Dries Buytaert
committed
/**
* {@inheritdoc}
Dries Buytaert
committed
*/
public function getLanguageTypes() {
return array(LanguageInterface::TYPE_INTERFACE, LanguageInterface::TYPE_CONTENT, LanguageInterface::TYPE_URL);
Dries Buytaert
committed
}
/**
* {@inheritdoc}
Dries Buytaert
committed
*/
public function getCurrentLanguage($type = LanguageInterface::TYPE_INTERFACE) {
return $this->getDefaultLanguage();
Dries Buytaert
committed
/**
* {@inheritdoc}
Dries Buytaert
committed
*/
public function reset($type = NULL) {
catch
committed
return $this;
}
/**
* {@inheritdoc}
*/
public function getDefaultLanguage() {
catch
committed
return $this->defaultLanguage->get();
Dries Buytaert
committed
/**
* {@inheritdoc}
Dries Buytaert
committed
*/
public function getLanguages($flags = LanguageInterface::STATE_CONFIGURABLE) {
// Initialize master language list.
if (!isset($this->languages)) {
// No language module, so use the default language only.
$default = $this->getDefaultLanguage();
$this->languages = array($default->id => $default);
// Add the special languages, they will be filtered later if needed.
$this->languages += $this->getDefaultLockedLanguages($default->weight);
Dries Buytaert
committed
}
// Filter the full list of languages based on the value of the $all flag. By
// default we remove the locked languages, but the caller may request for
// those languages to be added as well.
$filtered_languages = array();
// Add the site's default language if flagged as allowed value.
if ($flags & LanguageInterface::STATE_SITE_DEFAULT) {
$default = isset($default) ? $default : $this->getDefaultLanguage();
// Rename the default language.
$default->name = $this->t("Site's default language (@lang_name)", array('@lang_name' => $default->name));
$filtered_languages['site_default'] = $default;
Dries Buytaert
committed
}
foreach ($this->languages as $id => $language) {
if (($language->locked && ($flags & LanguageInterface::STATE_LOCKED)) || (!$language->locked && ($flags & LanguageInterface::STATE_CONFIGURABLE))) {
$filtered_languages[$id] = $language;
}
}
return $filtered_languages;
}
Dries Buytaert
committed
/**
* {@inheritdoc}
Dries Buytaert
committed
*/
public function getLanguage($langcode) {
$languages = $this->getLanguages(LanguageInterface::STATE_ALL);
return isset($languages[$langcode]) ? $languages[$langcode] : NULL;
Dries Buytaert
committed
}
/**
* {@inheritdoc}
*/
public function getLanguageName($langcode) {
if ($langcode == LanguageInterface::LANGCODE_NOT_SPECIFIED) {
return $this->t('None');
}
if ($language = $this->getLanguage($langcode)) {
return $language->name;
}
if (empty($langcode)) {
return $this->t('Unknown');
}
return $this->t('Unknown (@langcode)', array('@langcode' => $langcode));
}
/**
* {@inheritdoc}
*/
public function getDefaultLockedLanguages($weight = 0) {
$languages = array();
$locked_language = array(
'default' => FALSE,
'locked' => TRUE,
$languages[LanguageInterface::LANGCODE_NOT_SPECIFIED] = new Language(array(
'id' => LanguageInterface::LANGCODE_NOT_SPECIFIED,
'name' => $this->t('Not specified'),
'weight' => ++$weight,
) + $locked_language);
$languages[LanguageInterface::LANGCODE_NOT_APPLICABLE] = new Language(array(
'id' => LanguageInterface::LANGCODE_NOT_APPLICABLE,
'name' => $this->t('Not applicable'),
'weight' => ++$weight,
) + $locked_language);
return $languages;
}
/**
* {@inheritdoc}
*/
public function isLanguageLocked($langcode) {
$language = $this->getLanguage($langcode);
return ($language ? $language->locked : FALSE);
}
Dries Buytaert
committed
/**
* {@inheritdoc}
Dries Buytaert
committed
*/
public function getFallbackCandidates(array $context = array()) {
return array(LanguageInterface::LANGCODE_DEFAULT);
Dries Buytaert
committed
}
/**
* {@inheritdoc}
Dries Buytaert
committed
*/
public function getLanguageSwitchLinks($type, $path) {
return array();
Dries Buytaert
committed
}
/**
* Some common languages with their English and native names.
*
* Language codes are defined by the W3C language tags document for
* interoperability. Language codes typically have a language and, optionally,
* a script or regional variant name. See:
* http://www.w3.org/International/articles/language-tags/ for more
* information.
*
* This list is based on languages available from localize.drupal.org. See
* http://localize.drupal.org/issues for information on how to add languages
* there.
*
* The "Left-to-right marker" comments and the enclosed UTF-8 markers are to
* make otherwise strange looking PHP syntax natural (to not be displayed in
* right to left). See http://drupal.org/node/128866#comment-528929.
*
* @return array
* An array of language code to language name information.
* Language name information itself is an array of English and native names.
*/
public static function getStandardLanguageList() {
return array(
'af' => array('Afrikaans', 'Afrikaans'),
'am' => array('Amharic', 'አማርኛ'),
'ar' => array('Arabic', /* Left-to-right marker "" */ 'العربية', LanguageInterface::DIRECTION_RTL),
'ast' => array('Asturian', 'Asturianu'),
'az' => array('Azerbaijani', 'Azərbaycanca'),
'be' => array('Belarusian', 'Беларуская'),
'bg' => array('Bulgarian', 'Български'),
'bn' => array('Bengali', 'বাংলা'),
'bo' => array('Tibetan', 'བོད་སྐད་'),
'bs' => array('Bosnian', 'Bosanski'),
'ca' => array('Catalan', 'Català'),
'cs' => array('Czech', 'Čeština'),
'cy' => array('Welsh', 'Cymraeg'),
'da' => array('Danish', 'Dansk'),
'de' => array('German', 'Deutsch'),
'dz' => array('Dzongkha', 'རྫོང་ཁ'),
'el' => array('Greek', 'Ελληνικά'),
'en' => array('English', 'English'),
'eo' => array('Esperanto', 'Esperanto'),
'es' => array('Spanish', 'Español'),
'et' => array('Estonian', 'Eesti'),
'eu' => array('Basque', 'Euskera'),
'fa' => array('Persian, Farsi', /* Left-to-right marker "" */ 'فارسی', LanguageInterface::DIRECTION_RTL),
'fi' => array('Finnish', 'Suomi'),
'fil' => array('Filipino', 'Filipino'),
'fo' => array('Faeroese', 'Føroyskt'),
'fr' => array('French', 'Français'),
Angie Byron
committed
'fy' => array('Frisian, Western', 'Frysk'),
'ga' => array('Irish', 'Gaeilge'),
'gd' => array('Scots Gaelic', 'Gàidhlig'),
'gl' => array('Galician', 'Galego'),
'gsw-berne' => array('Swiss German', 'Schwyzerdütsch'),
'gu' => array('Gujarati', 'ગુજરાતી'),
'he' => array('Hebrew', /* Left-to-right marker "" */ 'עברית', LanguageInterface::DIRECTION_RTL),
'hi' => array('Hindi', 'हिन्दी'),
'hr' => array('Croatian', 'Hrvatski'),
'ht' => array('Haitian Creole', 'Kreyòl ayisyen'),
'hu' => array('Hungarian', 'Magyar'),
Angie Byron
committed
'hy' => array('Armenian', 'Հայերեն'),
'id' => array('Indonesian', 'Bahasa Indonesia'),
'is' => array('Icelandic', 'Íslenska'),
'it' => array('Italian', 'Italiano'),
'ja' => array('Japanese', '日本語'),
'jv' => array('Javanese', 'Basa Java'),
'ka' => array('Georgian', 'ქართული ენა'),
'kk' => array('Kazakh', 'Қазақ'),
Angie Byron
committed
'km' => array('Khmer', 'ភាសាខ្មែរ'),
'kn' => array('Kannada', 'ಕನ್ನಡ'),
'ko' => array('Korean', '한국어'),
'ku' => array('Kurdish', 'Kurdî'),
'ky' => array('Kyrgyz', 'Кыргызча'),
'lo' => array('Lao', 'ພາສາລາວ'),
'lt' => array('Lithuanian', 'Lietuvių'),
'lv' => array('Latvian', 'Latviešu'),
'mg' => array('Malagasy', 'Malagasy'),
'mk' => array('Macedonian', 'Македонски'),
'ml' => array('Malayalam', 'മലയാളം'),
'mn' => array('Mongolian', 'монгол'),
'mr' => array('Marathi', 'मराठी'),
Angie Byron
committed
'ms' => array('Bahasa Malaysia', 'بهاس ملايو'),
'my' => array('Burmese', 'ဗမာစကား'),
'ne' => array('Nepali', 'नेपाली'),
'nl' => array('Dutch', 'Nederlands'),
'nb' => array('Norwegian Bokmål', 'Bokmål'),
'nn' => array('Norwegian Nynorsk', 'Nynorsk'),
'oc' => array('Occitan', 'Occitan'),
'pa' => array('Punjabi', 'ਪੰਜਾਬੀ'),
'pl' => array('Polish', 'Polski'),
'pt-pt' => array('Portuguese, Portugal', 'Português, Portugal'),
'pt-br' => array('Portuguese, Brazil', 'Português, Brasil'),
'ro' => array('Romanian', 'Română'),
'ru' => array('Russian', 'Русский'),
'sco' => array('Scots', 'Scots'),
'se' => array('Northern Sami', 'Sámi'),
'si' => array('Sinhala', 'සිංහල'),
'sk' => array('Slovak', 'Slovenčina'),
'sl' => array('Slovenian', 'Slovenščina'),
'sq' => array('Albanian', 'Shqip'),
'sr' => array('Serbian', 'Српски'),
'sv' => array('Swedish', 'Svenska'),
Angie Byron
committed
'sw' => array('Swahili', 'Kiswahili'),
'ta' => array('Tamil', 'தமிழ்'),
'ta-lk' => array('Tamil, Sri Lanka', 'தமிழ், இலங்கை'),
'te' => array('Telugu', 'తెలుగు'),
'th' => array('Thai', 'ภาษาไทย'),
'tr' => array('Turkish', 'Türkçe'),
'tyv' => array('Tuvan', 'Тыва дыл'),
'ug' => array('Uyghur', 'Уйғур'),
'uk' => array('Ukrainian', 'Українська'),
'ur' => array('Urdu', /* Left-to-right marker "" */ 'اردو', LanguageInterface::DIRECTION_RTL),
'vi' => array('Vietnamese', 'Tiếng Việt'),
'xx-lolspeak' => array('Lolspeak', 'Lolspeak'),
'zh-hans' => array('Chinese, Simplified', '简体中文'),
'zh-hant' => array('Chinese, Traditional', '繁體中文'),
);
}
/**
* {@inheritdoc}
*
* This function is a noop since the configuration cannot be overridden by
* language unless the Language module is enabled. That replaces the default
* language manager with a configurable language manager.
*
* @see \Drupal\language\ConfigurableLanguageManager::setConfigOverrideLanguage()
*/
public function setConfigOverrideLanguage(LanguageInterface $language = NULL) {
return $this;
}
/**
* {@inheritdoc}
*/
public function getConfigOverrideLanguage() {
return $this->getCurrentLanguage();
}