/**
  * Sets up a configuration string with a translation.
  *
  * The actual configuration is already available by installing locale_test
  * module, as it is done in LocaleConfigSubscriberTest::setUp(). This sets up
  * the necessary source and translation strings and verifies that everything
  * is as expected to avoid false positives.
  *
  * @param string $config_name
  *   The configuration name.
  * @param string $key
  *   The configuration key.
  * @param string $source
  *   The source string.
  * @param string $translation
  *   The translation string.
  */
 protected function setUpTranslation($config_name, $key, $source, $translation)
 {
     // Create source and translation strings for the configuration value and add
     // the configuration name as a location. This would be performed by
     // locale_translate_batch_import() and locale_config_update_multiple()
     // normally.
     $source_object = $this->stringStorage->createString(['source' => $source, 'context' => ''])->save();
     $this->stringStorage->createTranslation(['lid' => $source_object->getId(), 'language' => $this->langcode, 'translation' => $translation])->save();
     $this->localeConfigManager->translateString($config_name, $this->langcode, $source, '');
     $this->languageManager->setConfigOverrideLanguage(ConfigurableLanguage::load($this->langcode));
     $this->assertConfigValue($config_name, $key, $translation);
     $this->assertTranslation($config_name, $translation, FALSE);
 }
 /**
  * Translates string using the localization system.
  *
  * So far we only know how to translate strings from English so the source
  * string should be in English.
  * Unlike regular t() translations, strings will be added to the source
  * tables only if this is marked as default data.
  *
  * @param string $name
  *   Name of the configuration location.
  * @param string $langcode
  *   Language code to translate to.
  * @param string $source
  *   The source string, should be English.
  * @param string $context
  *   The string context.
  *
  * @return string|false
  *   Translated string if there is a translation, FALSE if not.
  */
 public function translateString($name, $langcode, $source, $context)
 {
     if ($source) {
         // If translations for a language have not been loaded yet.
         if (!isset($this->translations[$name][$langcode])) {
             // Preload all translations for this configuration name and language.
             $this->translations[$name][$langcode] = array();
             foreach ($this->localeStorage->getTranslations(array('language' => $langcode, 'type' => 'configuration', 'name' => $name)) as $string) {
                 $this->translations[$name][$langcode][$string->context][$string->source] = $string;
             }
         }
         if (!isset($this->translations[$name][$langcode][$context][$source])) {
             // There is no translation of the source string in this config location
             // to this language for this context.
             if ($translation = $this->localeStorage->findTranslation(array('source' => $source, 'context' => $context, 'language' => $langcode))) {
                 // Look for a translation of the string. It might have one, but not
                 // be saved in this configuration location yet.
                 // If the string has a translation for this context to this language,
                 // save it in the configuration location so it can be looked up faster
                 // next time.
                 $this->localeStorage->createString((array) $translation)->addLocation('configuration', $name)->save();
             } else {
                 // No translation was found. Add the source to the configuration
                 // location so it can be translated, and the string is faster to look
                 // for next time.
                 $translation = $this->localeStorage->createString(array('source' => $source, 'context' => $context))->addLocation('configuration', $name)->save();
             }
             // Add an entry, either the translation found, or a blank string object
             // to track the source string, to this configuration location, language,
             // and context.
             $this->translations[$name][$langcode][$context][$source] = $translation;
         }
         // Return the string only when the string object had a translation.
         if ($this->translations[$name][$langcode][$context][$source]->isTranslation()) {
             return $this->translations[$name][$langcode][$context][$source]->getString();
         }
     }
     return FALSE;
 }