Code Coverage  | 
     ||||||||||
Classes and Traits  | 
      Functions and Methods  | 
      Lines  | 
     ||||||||
| Total |         | 
      0.00%  | 
      0 / 1  | 
              | 
      33.33%  | 
      1 / 3  | 
      CRAP |         | 
      61.90%  | 
      26 / 42  | 
     
| LocaleLookup |         | 
      0.00%  | 
      0 / 1  | 
              | 
      33.33%  | 
      1 / 3  | 
      22.34 |         | 
      61.90%  | 
      26 / 42  | 
     
| __construct |         | 
      0.00%  | 
      0 / 1  | 
      2 |         | 
      0.00%  | 
      0 / 10  | 
     |||
| getCid |         | 
      0.00%  | 
      0 / 1  | 
      12 |         | 
      0.00%  | 
      0 / 6  | 
     |||
| resolveCacheMiss |         | 
      100.00%  | 
      1 / 1  | 
      9 |         | 
      100.00%  | 
      26 / 26  | 
     |||
| <?php | |
| /** | |
| * @file | |
| * Contains \Drupal\locale\LocaleLookup. | |
| */ | |
| namespace Drupal\locale; | |
| use Drupal\Core\Cache\CacheBackendInterface; | |
| use Drupal\Core\Cache\CacheCollector; | |
| use Drupal\Core\Config\ConfigFactoryInterface; | |
| use Drupal\Core\Language\LanguageManagerInterface; | |
| use Drupal\Core\Lock\LockBackendInterface; | |
| use Symfony\Component\HttpFoundation\RequestStack; | |
| /** | |
| * A cache collector to allow for dynamic building of the locale cache. | |
| */ | |
| class LocaleLookup extends CacheCollector { | |
| /** | |
| * A language code. | |
| * | |
| * @var string | |
| */ | |
| protected $langcode; | |
| /** | |
| * The msgctxt context. | |
| * | |
| * @var string | |
| */ | |
| protected $context; | |
| /** | |
| * The locale storage. | |
| * | |
| * @var \Drupal\locale\StringStorageInterface | |
| */ | |
| protected $stringStorage; | |
| /** | |
| * 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 configuration factory. | |
| * | |
| * @var \Drupal\Core\Config\ConfigFactoryInterface | |
| */ | |
| protected $configFactory; | |
| /** | |
| * The language manager. | |
| * | |
| * @var \Drupal\Core\Language\LanguageManagerInterface | |
| */ | |
| protected $languageManager; | |
| /** | |
| * The request stack. | |
| * | |
| * @var \Symfony\Component\HttpFoundation\RequestStack | |
| */ | |
| protected $requestStack; | |
| /** | |
| * Constructs a LocaleLookup object. | |
| * | |
| * @param string $langcode | |
| * The language code. | |
| * @param string $context | |
| * The string context. | |
| * @param \Drupal\locale\StringStorageInterface $string_storage | |
| * The string storage. | |
| * @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($langcode, $context, StringStorageInterface $string_storage, CacheBackendInterface $cache, LockBackendInterface $lock, ConfigFactoryInterface $config_factory, LanguageManagerInterface $language_manager, RequestStack $request_stack) { | |
| $this->langcode = $langcode; | |
| $this->context = (string) $context; | |
| $this->stringStorage = $string_storage; | |
| $this->configFactory = $config_factory; | |
| $this->languageManager = $language_manager; | |
| $this->cache = $cache; | |
| $this->lock = $lock; | |
| $this->tags = array('locale'); | |
| $this->requestStack = $request_stack; | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| protected function getCid() { | |
| if (!isset($this->cid)) { | |
| // Add the current user's role IDs to the cache key, this ensures that, | |
| // for example, strings for admin menu items and settings forms are not | |
| // cached for anonymous users. | |
| $user = \Drupal::currentUser(); | |
| $rids = $user ? implode(':', $user->getRoles()) : ''; | |
| $this->cid = "locale:{$this->langcode}:{$this->context}:$rids"; | |
| // Getting the roles from the current user might have resulted in t() | |
| // calls that attempted to get translations from the locale cache. In that | |
| // case they would not go into this method again as | |
| // CacheCollector::lazyLoadCache() already set the loaded flag. They would | |
| // however call resolveCacheMiss() and add that string to the list of | |
| // cache misses that need to be written into the cache. Prevent that by | |
| // resetting that list. All that happens in such a case are a few uncached | |
| // translation lookups. | |
| $this->keysToPersist = array(); | |
| } | |
| return $this->cid; | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| protected function resolveCacheMiss($offset) { | |
| $translation = $this->stringStorage->findTranslation(array( | |
| 'language' => $this->langcode, | |
| 'source' => $offset, | |
| 'context' => $this->context, | |
| )); | |
| if ($translation) { | |
| $value = !empty($translation->translation) ? $translation->translation : TRUE; | |
| } | |
| else { | |
| // We don't have the source string, update the {locales_source} table to | |
| // indicate the string is not translated. | |
| $this->stringStorage->createString(array( | |
| 'source' => $offset, | |
| 'context' => $this->context, | |
| 'version' => \Drupal::VERSION, | |
| ))->addLocation('path', $this->requestStack->getCurrentRequest()->getRequestUri())->save(); | |
| $value = TRUE; | |
| } | |
| // If there is no translation available for the current language then use | |
| // language fallback to try other translations. | |
| if ($value === TRUE) { | |
| $fallbacks = $this->languageManager->getFallbackCandidates(array('langcode' => $this->langcode, 'operation' => 'locale_lookup', 'data' => $offset)); | |
| if (!empty($fallbacks)) { | |
| foreach ($fallbacks as $langcode) { | |
| $translation = $this->stringStorage->findTranslation(array( | |
| 'language' => $langcode, | |
| 'source' => $offset, | |
| 'context' => $this->context, | |
| )); | |
| if ($translation && !empty($translation->translation)) { | |
| $value = $translation->translation; | |
| break; | |
| } | |
| } | |
| } | |
| } | |
| $this->storage[$offset] = $value; | |
| // Disabling the usage of string caching allows a module to watch for | |
| // the exact list of strings used on a page. From a performance | |
| // perspective that is a really bad idea, so we have no user | |
| // interface for this. Be careful when turning this option off! | |
| if ($this->configFactory->get('locale.settings')->get('cache_strings')) { | |
| $this->persist($offset); | |
| } | |
| return $value; | |
| } | |
| } |