diff core/lib/Drupal/Core/Language/LanguageManager.php @ 0:4c8ae668cc8c

Initial import (non-working)
author Chris Cannam
date Wed, 29 Nov 2017 16:09:58 +0000
parents
children 1fec387a4317
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/core/lib/Drupal/Core/Language/LanguageManager.php	Wed Nov 29 16:09:58 2017 +0000
@@ -0,0 +1,422 @@
+<?php
+
+namespace Drupal\Core\Language;
+
+use Drupal\Core\DependencyInjection\DependencySerializationTrait;
+use Drupal\Core\StringTranslation\TranslatableMarkup;
+use Drupal\Core\Url;
+
+/**
+ * Class responsible for providing language support on language-unaware sites.
+ */
+class LanguageManager implements LanguageManagerInterface {
+  use DependencySerializationTrait;
+
+  /**
+   * A static cache of translated language lists.
+   *
+   * Array of arrays to cache the result of self::getLanguages() keyed by the
+   * language the list is translated to (first level) and the flags provided to
+   * the method (second level).
+   *
+   * @var \Drupal\Core\Language\LanguageInterface[]
+   *
+   * @see \Drupal\Core\Language\LanguageManager::getLanguages()
+   */
+  protected $languages = [];
+
+  /**
+   * The default language object.
+   *
+   * @var \Drupal\Core\Language\LanguageDefault
+   */
+  protected $defaultLanguage;
+
+  /**
+   * Constructs the language manager.
+   *
+   * @param \Drupal\Core\Language\LanguageDefault $default_language
+   *   The default language.
+   */
+  public function __construct(LanguageDefault $default_language) {
+    $this->defaultLanguage = $default_language;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function isMultilingual() {
+    return FALSE;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getLanguageTypes() {
+    return [LanguageInterface::TYPE_INTERFACE, LanguageInterface::TYPE_CONTENT, LanguageInterface::TYPE_URL];
+  }
+
+  /**
+   * Returns information about all defined language types.
+   *
+   * Defines the three core language types:
+   * - Interface language is the only configurable language type in core. It is
+   *   used by t() as the default language if none is specified.
+   * - Content language is by default non-configurable and inherits the
+   *   interface language negotiated value. It is used by the Field API to
+   *   determine the display language for fields if no explicit value is
+   *   specified.
+   * - URL language is by default non-configurable and is determined through the
+   *   URL language negotiation method or the URL fallback language negotiation
+   *   method if no language can be detected. It is used by l() as the default
+   *   language if none is specified.
+   *
+   * @return array
+   *   An associative array of language type information arrays keyed by
+   *   language type machine name, in the format of
+   *   hook_language_types_info().
+   */
+  public function getDefinedLanguageTypesInfo() {
+    $this->definedLanguageTypesInfo = [
+      LanguageInterface::TYPE_INTERFACE => [
+        'name' => new TranslatableMarkup('Interface text'),
+        'description' => new TranslatableMarkup('Order of language detection methods for interface text. If a translation of interface text is available in the detected language, it will be displayed.'),
+        'locked' => TRUE,
+      ],
+      LanguageInterface::TYPE_CONTENT => [
+        'name' => new TranslatableMarkup('Content'),
+        'description' => new TranslatableMarkup('Order of language detection methods for content. If a version of content is available in the detected language, it will be displayed.'),
+        'locked' => TRUE,
+      ],
+      LanguageInterface::TYPE_URL => [
+        'locked' => TRUE,
+      ],
+    ];
+
+    return $this->definedLanguageTypesInfo;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getCurrentLanguage($type = LanguageInterface::TYPE_INTERFACE) {
+    return $this->getDefaultLanguage();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function reset($type = NULL) {
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getDefaultLanguage() {
+    return $this->defaultLanguage->get();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getLanguages($flags = LanguageInterface::STATE_CONFIGURABLE) {
+    $static_cache_id = $this->getCurrentLanguage()->getId();
+    if (!isset($this->languages[$static_cache_id][$flags])) {
+      // If this language manager is used, there are no configured languages.
+      // The default language and locked languages comprise the full language
+      // list.
+      $default = $this->getDefaultLanguage();
+      $languages = [$default->getId() => $default];
+      $languages += $this->getDefaultLockedLanguages($default->getWeight());
+
+      // Filter the full list of languages based on the value of $flags.
+      $this->languages[$static_cache_id][$flags] = $this->filterLanguages($languages, $flags);
+    }
+    return $this->languages[$static_cache_id][$flags];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getNativeLanguages() {
+    // In a language unaware site we don't have translated languages.
+    return $this->getLanguages();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getLanguage($langcode) {
+    $languages = $this->getLanguages(LanguageInterface::STATE_ALL);
+    return isset($languages[$langcode]) ? $languages[$langcode] : NULL;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getLanguageName($langcode) {
+    if ($langcode == LanguageInterface::LANGCODE_NOT_SPECIFIED) {
+      return new TranslatableMarkup('None');
+    }
+    if ($language = $this->getLanguage($langcode)) {
+      return $language->getName();
+    }
+    if (empty($langcode)) {
+      return new TranslatableMarkup('Unknown');
+    }
+    return new TranslatableMarkup('Unknown (@langcode)', ['@langcode' => $langcode]);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getDefaultLockedLanguages($weight = 0) {
+    $languages = [];
+
+    $locked_language = [
+      'default' => FALSE,
+      'locked' => TRUE,
+      'direction' => LanguageInterface::DIRECTION_LTR,
+    ];
+    // This is called very early while initializing the language system. Prevent
+    // early t() calls by using the TranslatableMarkup.
+    $languages[LanguageInterface::LANGCODE_NOT_SPECIFIED] = new Language([
+      'id' => LanguageInterface::LANGCODE_NOT_SPECIFIED,
+      'name' => new TranslatableMarkup('Not specified'),
+      'weight' => ++$weight,
+    ] + $locked_language);
+
+    $languages[LanguageInterface::LANGCODE_NOT_APPLICABLE] = new Language([
+      'id' => LanguageInterface::LANGCODE_NOT_APPLICABLE,
+      'name' => new TranslatableMarkup('Not applicable'),
+      'weight' => ++$weight,
+    ] + $locked_language);
+
+    return $languages;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function isLanguageLocked($langcode) {
+    $language = $this->getLanguage($langcode);
+    return ($language ? $language->isLocked() : FALSE);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getFallbackCandidates(array $context = []) {
+    return [LanguageInterface::LANGCODE_DEFAULT];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getLanguageSwitchLinks($type, Url $url) {
+    return [];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function getStandardLanguageList() {
+    // 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 https://www.drupal.org/node/128866#comment-528929.
+    return [
+      'af' => ['Afrikaans', 'Afrikaans'],
+      'am' => ['Amharic', 'አማርኛ'],
+      'ar' => ['Arabic', /* Left-to-right marker "‭" */ 'العربية', LanguageInterface::DIRECTION_RTL],
+      'ast' => ['Asturian', 'Asturianu'],
+      'az' => ['Azerbaijani', 'Azərbaycanca'],
+      'be' => ['Belarusian', 'Беларуская'],
+      'bg' => ['Bulgarian', 'Български'],
+      'bn' => ['Bengali', 'বাংলা'],
+      'bo' => ['Tibetan', 'བོད་སྐད་'],
+      'bs' => ['Bosnian', 'Bosanski'],
+      'ca' => ['Catalan', 'Català'],
+      'cs' => ['Czech', 'Čeština'],
+      'cy' => ['Welsh', 'Cymraeg'],
+      'da' => ['Danish', 'Dansk'],
+      'de' => ['German', 'Deutsch'],
+      'dz' => ['Dzongkha', 'རྫོང་ཁ'],
+      'el' => ['Greek', 'Ελληνικά'],
+      'en' => ['English', 'English'],
+      'en-x-simple' => ['Simple English', 'Simple English'],
+      'eo' => ['Esperanto', 'Esperanto'],
+      'es' => ['Spanish', 'Español'],
+      'et' => ['Estonian', 'Eesti'],
+      'eu' => ['Basque', 'Euskera'],
+      'fa' => ['Persian, Farsi', /* Left-to-right marker "‭" */ 'فارسی', LanguageInterface::DIRECTION_RTL],
+      'fi' => ['Finnish', 'Suomi'],
+      'fil' => ['Filipino', 'Filipino'],
+      'fo' => ['Faeroese', 'Føroyskt'],
+      'fr' => ['French', 'Français'],
+      'fy' => ['Frisian, Western', 'Frysk'],
+      'ga' => ['Irish', 'Gaeilge'],
+      'gd' => ['Scots Gaelic', 'Gàidhlig'],
+      'gl' => ['Galician', 'Galego'],
+      'gsw-berne' => ['Swiss German', 'Schwyzerdütsch'],
+      'gu' => ['Gujarati', 'ગુજરાતી'],
+      'he' => ['Hebrew', /* Left-to-right marker "‭" */ 'עברית', LanguageInterface::DIRECTION_RTL],
+      'hi' => ['Hindi', 'हिन्दी'],
+      'hr' => ['Croatian', 'Hrvatski'],
+      'ht' => ['Haitian Creole', 'Kreyòl ayisyen'],
+      'hu' => ['Hungarian', 'Magyar'],
+      'hy' => ['Armenian', 'Հայերեն'],
+      'id' => ['Indonesian', 'Bahasa Indonesia'],
+      'is' => ['Icelandic', 'Íslenska'],
+      'it' => ['Italian', 'Italiano'],
+      'ja' => ['Japanese', '日本語'],
+      'jv' => ['Javanese', 'Basa Java'],
+      'ka' => ['Georgian', 'ქართული ენა'],
+      'kk' => ['Kazakh', 'Қазақ'],
+      'km' => ['Khmer', 'ភាសាខ្មែរ'],
+      'kn' => ['Kannada', 'ಕನ್ನಡ'],
+      'ko' => ['Korean', '한국어'],
+      'ku' => ['Kurdish', 'Kurdî'],
+      'ky' => ['Kyrgyz', 'Кыргызча'],
+      'lo' => ['Lao', 'ພາສາລາວ'],
+      'lt' => ['Lithuanian', 'Lietuvių'],
+      'lv' => ['Latvian', 'Latviešu'],
+      'mg' => ['Malagasy', 'Malagasy'],
+      'mk' => ['Macedonian', 'Македонски'],
+      'ml' => ['Malayalam', 'മലയാളം'],
+      'mn' => ['Mongolian', 'монгол'],
+      'mr' => ['Marathi', 'मराठी'],
+      'ms' => ['Bahasa Malaysia', 'بهاس ملايو'],
+      'my' => ['Burmese', 'ဗမာစကား'],
+      'ne' => ['Nepali', 'नेपाली'],
+      'nl' => ['Dutch', 'Nederlands'],
+      'nb' => ['Norwegian Bokmål', 'Norsk, bokmål'],
+      'nn' => ['Norwegian Nynorsk', 'Norsk, nynorsk'],
+      'oc' => ['Occitan', 'Occitan'],
+      'pa' => ['Punjabi', 'ਪੰਜਾਬੀ'],
+      'pl' => ['Polish', 'Polski'],
+      'pt-pt' => ['Portuguese, Portugal', 'Português, Portugal'],
+      'pt-br' => ['Portuguese, Brazil', 'Português, Brasil'],
+      'ro' => ['Romanian', 'Română'],
+      'ru' => ['Russian', 'Русский'],
+      'sco' => ['Scots', 'Scots'],
+      'se' => ['Northern Sami', 'Sámi'],
+      'si' => ['Sinhala', 'සිංහල'],
+      'sk' => ['Slovak', 'Slovenčina'],
+      'sl' => ['Slovenian', 'Slovenščina'],
+      'sq' => ['Albanian', 'Shqip'],
+      'sr' => ['Serbian', 'Српски'],
+      'sv' => ['Swedish', 'Svenska'],
+      'sw' => ['Swahili', 'Kiswahili'],
+      'ta' => ['Tamil', 'தமிழ்'],
+      'ta-lk' => ['Tamil, Sri Lanka', 'தமிழ், இலங்கை'],
+      'te' => ['Telugu', 'తెలుగు'],
+      'th' => ['Thai', 'ภาษาไทย'],
+      'tr' => ['Turkish', 'Türkçe'],
+      'tyv' => ['Tuvan', 'Тыва дыл'],
+      'ug' => ['Uyghur', /* Left-to-right marker "‭" */ 'ئۇيغۇرچە', LanguageInterface::DIRECTION_RTL],
+      'uk' => ['Ukrainian', 'Українська'],
+      'ur' => ['Urdu', /* Left-to-right marker "‭" */ 'اردو', LanguageInterface::DIRECTION_RTL],
+      'vi' => ['Vietnamese', 'Tiếng Việt'],
+      'xx-lolspeak' => ['Lolspeak', 'Lolspeak'],
+      'zh-hans' => ['Chinese, Simplified', '简体中文'],
+      'zh-hant' => ['Chinese, Traditional', '繁體中文'],
+    ];
+  }
+
+  /**
+   * The 6 official languages used at the United Nations.
+   *
+   * This list is based on
+   * http://www.un.org/en/sections/about-un/official-languages/index.html and it
+   * uses the same format as getStandardLanguageList().
+   *
+   * @return array
+   *   An array with language codes as keys, and English and native language
+   *   names as values.
+   */
+  public static function getUnitedNationsLanguageList() {
+    return [
+      'ar' => ['Arabic', /* Left-to-right marker "‭" */ 'العربية', LanguageInterface::DIRECTION_RTL],
+      'zh-hans' => ['Chinese, Simplified', '简体中文'],
+      'en' => ['English', 'English'],
+      'fr' => ['French', 'Français'],
+      'ru' => ['Russian', 'Русский'],
+      'es' => ['Spanish', 'Español'],
+    ];
+  }
+
+  /**
+   * {@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();
+  }
+
+  /**
+   * Filters the full list of languages based on the value of the flag.
+   *
+   * The locked languages are removed by default.
+   *
+   * @param \Drupal\Core\Language\LanguageInterface[] $languages
+   *   Array with languages to be filtered.
+   * @param int $flags
+   *   (optional) Specifies the state of the languages that have to be returned.
+   *   It can be: LanguageInterface::STATE_CONFIGURABLE,
+   *   LanguageInterface::STATE_LOCKED, or LanguageInterface::STATE_ALL.
+   *
+   * @return \Drupal\Core\Language\LanguageInterface[]
+   *   An associative array of languages, keyed by the language code.
+   */
+  protected function filterLanguages(array $languages, $flags = LanguageInterface::STATE_CONFIGURABLE) {
+    // STATE_ALL means we don't actually filter, so skip the rest of the method.
+    if ($flags == LanguageInterface::STATE_ALL) {
+      return $languages;
+    }
+
+    $filtered_languages = [];
+    // Add the site's default language if requested.
+    if ($flags & LanguageInterface::STATE_SITE_DEFAULT) {
+
+      // Setup a language to have the defaults with data appropriate of the
+      // default language only for runtime.
+      $defaultLanguage = $this->getDefaultLanguage();
+      $default = new Language(
+        [
+          'id' => $defaultLanguage->getId(),
+          'name' => new TranslatableMarkup("Site's default language (@lang_name)",
+            ['@lang_name' => $defaultLanguage->getName()]),
+          'direction' => $defaultLanguage->getDirection(),
+          'weight' => $defaultLanguage->getWeight(),
+        ]
+      );
+      $filtered_languages[LanguageInterface::LANGCODE_SITE_DEFAULT] = $default;
+    }
+
+    foreach ($languages as $id => $language) {
+      if (($language->isLocked() && ($flags & LanguageInterface::STATE_LOCKED)) || (!$language->isLocked() && ($flags & LanguageInterface::STATE_CONFIGURABLE))) {
+        $filtered_languages[$id] = $language;
+      }
+    }
+
+    return $filtered_languages;
+  }
+
+}