Mercurial > hg > isophonics-drupal-site
diff core/modules/locale/src/LocaleTranslation.php @ 0:4c8ae668cc8c
Initial import (non-working)
author | Chris Cannam |
---|---|
date | Wed, 29 Nov 2017 16:09:58 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/core/modules/locale/src/LocaleTranslation.php Wed Nov 29 16:09:58 2017 +0000 @@ -0,0 +1,156 @@ +<?php + +namespace Drupal\locale; + +use Drupal\Core\Cache\CacheBackendInterface; +use Drupal\Core\Config\ConfigFactoryInterface; +use Drupal\Core\DestructableInterface; +use Drupal\Core\Language\LanguageInterface; +use Drupal\Core\Language\LanguageManagerInterface; +use Drupal\Core\Lock\LockBackendInterface; +use Drupal\Core\StringTranslation\Translator\TranslatorInterface; +use Symfony\Component\HttpFoundation\RequestStack; + +/** + * String translator using the locale module. + * + * Full featured translation system using locale's string storage and + * database caching. + */ +class LocaleTranslation implements TranslatorInterface, DestructableInterface { + + /** + * Storage for strings. + * + * @var \Drupal\locale\StringStorageInterface + */ + protected $storage; + + /** + * The configuration factory. + * + * @var \Drupal\Core\Config\ConfigFactoryInterface + */ + protected $configFactory; + + /** + * Cached translations. + * + * @var array + * Array of \Drupal\locale\LocaleLookup objects indexed by language code + * and context. + */ + protected $translations = []; + + /** + * The cache backend that should be used. + * + * @var \Drupal\Core\Cache\CacheBackendInterface + */ + protected $cache; + + /** + * The lock backend that should be used. + * + * @var \Drupal\Core\Lock\LockBackendInterface + */ + protected $lock; + + /** + * The translate english configuration value. + * + * @var bool + */ + protected $translateEnglish; + + /** + * The language manager. + * + * @var \Drupal\Core\Language\LanguageManagerInterface + */ + protected $languageManager; + + /** + * The request stack. + * + * @var \Symfony\Component\HttpFoundation\RequestStack + */ + protected $requestStack; + + /** + * Constructs a translator using a string storage. + * + * @param \Drupal\locale\StringStorageInterface $storage + * Storage to use when looking for new translations. + * @param \Drupal\Core\Cache\CacheBackendInterface $cache + * The cache backend. + * @param \Drupal\Core\Lock\LockBackendInterface $lock + * The lock backend. + * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory + * The config factory. + * @param \Drupal\Core\Language\LanguageManagerInterface $language_manager + * The language manager. + * @param \Symfony\Component\HttpFoundation\RequestStack $request_stack + * The request stack. + */ + public function __construct(StringStorageInterface $storage, CacheBackendInterface $cache, LockBackendInterface $lock, ConfigFactoryInterface $config_factory, LanguageManagerInterface $language_manager, RequestStack $request_stack) { + $this->storage = $storage; + $this->cache = $cache; + $this->lock = $lock; + $this->configFactory = $config_factory; + $this->languageManager = $language_manager; + $this->requestStack = $request_stack; + } + + /** + * {@inheritdoc} + */ + public function getStringTranslation($langcode, $string, $context) { + // If the language is not suitable for locale module, just return. + if ($langcode == LanguageInterface::LANGCODE_SYSTEM || ($langcode == 'en' && !$this->canTranslateEnglish())) { + return FALSE; + } + // Strings are cached by langcode, context and roles, using instances of the + // LocaleLookup class to handle string lookup and caching. + if (!isset($this->translations[$langcode][$context])) { + $this->translations[$langcode][$context] = new LocaleLookup($langcode, $context, $this->storage, $this->cache, $this->lock, $this->configFactory, $this->languageManager, $this->requestStack); + } + $translation = $this->translations[$langcode][$context]->get($string); + return $translation === TRUE ? FALSE : $translation; + } + + /** + * Gets translate english configuration value. + * + * @return bool + * TRUE if english should be translated, FALSE if not. + */ + protected function canTranslateEnglish() { + if (!isset($this->translateEnglish)) { + $this->translateEnglish = $this->configFactory->get('locale.settings')->get('translate_english'); + } + return $this->translateEnglish; + } + + /** + * {@inheritdoc} + */ + public function reset() { + unset($this->translateEnglish); + $this->translations = []; + } + + /** + * {@inheritdoc} + */ + public function destruct() { + foreach ($this->translations as $context) { + foreach ($context as $lookup) { + if ($lookup instanceof DestructableInterface) { + $lookup->destruct(); + } + } + } + } + +}