123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427 |
- <?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'],
- ];
- }
- /**
- * Sets the configuration override language.
- *
- * 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.
- *
- * @param \Drupal\Core\Language\LanguageInterface $language
- * The language to override configuration with.
- *
- * @return $this
- *
- * @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;
- }
- }
|