/** * 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; }