it-swarm.com.de

Verwalten Sie Konfigurationsübersetzungen programmgesteuert

Mein Modul erstellt und verwaltet einige config_entities programmgesteuert (dh nicht über eine EntityForm) als Reaktion auf das Speichern zugeordneter Inhaltsentitäten.

Um mehrsprachige Inhaltsentitäten zu verarbeiten, sehe ich zwei Optionen:

  • erstellen Sie eine Konfigurationsentität und fügen Sie Übersetzungen dafür hinzu
  • erstellen Sie für jede Übersetzung eine eindeutige Konfigurationsentität

Das erste scheint sauberer zu sein - ich sehe jedoch nicht, wie Übersetzungen für Konfigurationsentitäten tatsächlich transparent verwaltet werden können. Das Übersetzen einer Entität mit dem Modul config_translation Scheint einen neuen Eintrag in der Tabelle config mit collection = language.xx Zu erstellen, aber ich sehe keinen expliziten Zugriff auf eine übersetzte Entität (eher) als es automatisch von der Schnittstellensprache der Site zugeordnet wird). Ist das überhaupt möglich?

5

Die Antwort von @Smartsheet eng ist richtig, wenn Sie laden und eine bestimmte Übersetzung als Konfigurationsentität lesen möchten, siehe auch Programmieren) NodeType übersetzten Wert in D8 erhalten? .

Das Ändern ist jedoch anders, da die Konfigurationsentität nicht so gespeichert werden kann und nicht versteht, was eine Übersetzung ist und was nicht. Es wird nur Ihre Standardsprache mit diesen Daten überschrieben. Siehe auch https://www.drupal.org/project/drupal/issues/291035 .

Um eine Übersetzung einer Konfigurationsentität tatsächlich zu verwalten, müssen Sie direkt mit dem Konfigurationssystem interagieren. Sie können sehen, wie in\Drupal\config_translation\Form\ConfigTranslationFormBase :: submitForm ():

$config_translation = \Drupal::languageManager()->getLanguageConfigOverride($langcode, $config_name);

// Write the keys you want to translate on the config object.
$config_translation->save();
8
Berdir

Soweit ich sehen kann - ja, das ist möglich, aber es ist nicht so hübsch wie $contentEntity->getTranslation($langcode);. Die volle Enchillada wäre:

protected function getTranslatedConfigEntity(ConfigEntityInterface $configEntity, LanguageInterface $language) {
  $langcode = $language->id():
  /** @var \Drupal\Core\Config\Entity\ConfigEntityTypeInterface $configEntityType */
  $configEntityType = $configEntity->getEntityType();
  $name = $configEntityType->getConfigPrefix() . '.' . $configEntity->id();
  $translatedConfig = $this->languageManager->getLanguageConfigOverride($langcode, $name);
  $translatedConfig[$configEntity->getKeys('langcode')] = $langcode;
  $class = $configEntityType->getClass();
  return new $class($translatedConfig->get(), $configEntityType->id());
}

Eine Alternative wäre:

public function getTranslatedConfigEntity(ConfigEntityInterface $configEntity, LanguageInterface $language) {
  $currentLanguage = $this->languageManager->getConfigOverrideLanguage();
  $this->languageManager->setConfigOverrideLanguage($language);
  $translatedConfigEntity = $this->entityTypeManager
    ->getStorage($configEntity->getEntityTypeId())
    ->load($configEntity->id());
  $this->languageManager->setConfigOverrideLanguage($currentLanguage);
  return $translatedConfigEntity;
}
7
Smartsheet eng