diff --git a/src/Entity/Webform.php b/src/Entity/Webform.php index 169a63ee..e3e40dae 100644 --- a/src/Entity/Webform.php +++ b/src/Entity/Webform.php @@ -271,6 +271,13 @@ class Webform extends ConfigEntityBundleBase implements WebformInterface { /** * {@inheritdoc} */ + public function getLangcode() { + return $this->langcode; + } + + /** + * {@inheritdoc} + */ public function getOwner() { return $this->uid ? User::load($this->uid) : NULL; } @@ -828,8 +835,7 @@ class Webform extends ConfigEntityBundleBase implements WebformInterface { // If current webform is translated, load the base (default) webform and apply // the translation to the elements. if ($this->langcode != $language_manager->getCurrentLanguage()->getId()) { - $default_langcode = $language_manager->getDefaultLanguage()->getId(); - $elements = $translation_manager->getConfigElements($this, $default_langcode); + $elements = $translation_manager->getConfigElements($this); $this->elementsTranslations = Yaml::decode($this->elements); } else { diff --git a/src/WebformInterface.php b/src/WebformInterface.php index 273a50df..792e81ce 100644 --- a/src/WebformInterface.php +++ b/src/WebformInterface.php @@ -13,6 +13,14 @@ use Drupal\user\EntityOwnerInterface; interface WebformInterface extends ConfigEntityInterface, EntityWithPluginCollectionInterface, EntityOwnerInterface { /** + * Returns the webform's (original) langcode. + * + * @return string + * The webform's (original) langcode. + */ + public function getLangcode(); + + /** * Determine if the webform has page or is attached to other entities. * * @return bool diff --git a/src/WebformTranslationManager.php b/src/WebformTranslationManager.php index 16d7dd0f..2a136b3a 100644 --- a/src/WebformTranslationManager.php +++ b/src/WebformTranslationManager.php @@ -54,12 +54,17 @@ class WebformTranslationManager implements WebformTranslationManagerInterface { /** * {@inheritdoc} */ - public function getConfigElements(WebformInterface $webform, $langcode, $reset = FALSE) { + public function getConfigElements(WebformInterface $webform, $langcode = NULL, $reset = FALSE) { // Note: Below code return the default languages elements for missing // translations. $config_override_language = $this->languageManager->getConfigOverrideLanguage(); $config_name = 'webform.webform.' . $webform->id(); + // Set langcode from original langcode. + if (!$langcode) { + $langcode = $this->getOriginalLangcode($webform); + } + // Reset cached config. if ($reset) { $this->configFactory->reset($config_name); @@ -85,7 +90,7 @@ class WebformTranslationManager implements WebformTranslationManagerInterface { * {@inheritdoc} */ public function getBaseElements(WebformInterface $webform) { - $default_langcode = $this->languageManager->getDefaultLanguage()->getId(); + $default_langcode = $this->getOriginalLangcode($webform) ?: $this->languageManager->getDefaultLanguage()->getId(); $config_elements = $this->getConfigElements($webform, $default_langcode); $elements = WebformElementHelper::getFlattened($config_elements); $translatable_properties = WebformArrayHelper::addPrefix($this->elementManager->getTranslatableProperties()); @@ -135,4 +140,16 @@ class WebformTranslationManager implements WebformTranslationManagerInterface { return $elements; } + /** + * {@inheritdoc} + */ + public function getOriginalLangcode(WebformInterface $webform) { + // NOTE: Can't inject ConfigMapperInterface because it requires that + // config_translation.module to be installed. + /** @var \Drupal\config_translation\ConfigMapperInterface $mapper */ + $mapper = \Drupal::service('plugin.manager.config_translation.mapper')->createInstance('webform'); + $mapper->addConfigName('webform.webform.' . $webform->id()); + return $mapper->getLangcode(); + } + } diff --git a/src/WebformTranslationManagerInterface.php b/src/WebformTranslationManagerInterface.php index e2291db8..80072641 100644 --- a/src/WebformTranslationManagerInterface.php +++ b/src/WebformTranslationManagerInterface.php @@ -21,7 +21,7 @@ interface WebformTranslationManagerInterface { * @return array * A webform's translated elements. */ - public function getConfigElements(WebformInterface $webform, $langcode, $reset = FALSE); + public function getConfigElements(WebformInterface $webform, $langcode = NULL, $reset = FALSE); /** * Get base webform elements from the site's default language. @@ -56,4 +56,15 @@ interface WebformTranslationManagerInterface { */ public function getTranslationElements(WebformInterface $webform, $langcode); + /** + * Get the original langcode for a webform. + * + * @param \Drupal\webform\WebformInterface $webform + * A webform. + * + * @return string + * The original langcode for a webform. + */ + public function getOriginalLangcode(WebformInterface $webform); + } diff --git a/webform.module b/webform.module index 0677a280..9f2d383a 100644 --- a/webform.module +++ b/webform.module @@ -20,6 +20,7 @@ use Drupal\file\Entity\File; use Drupal\file\FileInterface; use Drupal\webform\Entity\Webform; use Drupal\webform\Entity\WebformSubmission; +use Drupal\webform\Element\WebformMessage; use Drupal\webform\Plugin\Field\FieldType\WebformEntityReferenceItem; use Drupal\webform\Plugin\WebformElement\ManagedFile; use Drupal\webform\Utility\WebformArrayHelper; @@ -162,6 +163,29 @@ function webform_form_alter(&$form, FormStateInterface $form_state, $form_id) { return; } + // Display editing original language warning. + if (\Drupal::moduleHandler()->moduleExists('config_translation') && preg_match('/^entity.webform.(?:edit|settings|assets|access|handlers|third_party_settings)_form$/', \Drupal::routeMatch()->getRouteName())) { + /** @var \Drupal\webform\WebformInterface $webform */ + $webform = \Drupal::routeMatch()->getParameter('webform'); + /** @var \Drupal\Core\Language\LanguageManagerInterface $language_manager */ + $language_manager = \Drupal::service('language_manager'); + + // If current webform is translated, load the base (default) webform and apply + // the translation to the elements. + if ($webform->getLangcode() != $language_manager->getCurrentLanguage()->getId()) { + $original_language = $language_manager->getLanguage($webform->getLangcode()); + $form['langcode_message'] = [ + '#type' => 'webform_message', + '#message_type' => 'warning', + '#message_message' => t('You are editing the original %language language for this webform.', ['%language' => $original_language->getName()]), + '#message_close' => TRUE, + '#message_storage' => WebformMessage::STORAGE_LOCAL, + '#message_id' => $webform->id() . '.original_language', + '#weight' => -100, + ]; + } + } + // Don't include details toggle all for submission forms. $is_submission_form = ($form_state->getFormObject() instanceof WebformSubmissionForm); if (!$is_submission_form) {