Skip to main content
Drupal API
User account menu
  • Log in

Breadcrumb

  1. Drupal Core 11.1.x
  2. I18nQueryTrait.php

trait I18nQueryTrait

Gets an i18n translation from the source database.

Hierarchy

  • trait \Drupal\content_translation\Plugin\migrate\source\I18nQueryTrait
4 files declare their use of I18nQueryTrait
BlockCustomTranslation.php in core/modules/block_content/src/Plugin/migrate/source/d7/BlockCustomTranslation.php
MenuLinkTranslation.php in core/modules/menu_link_content/src/Plugin/migrate/source/d6/MenuLinkTranslation.php
MenuLinkTranslation.php in core/modules/menu_link_content/src/Plugin/migrate/source/d7/MenuLinkTranslation.php
TermLocalizedTranslation.php in core/modules/taxonomy/src/Plugin/migrate/source/d7/TermLocalizedTranslation.php

File

core/modules/content_translation/src/Plugin/migrate/source/I18nQueryTrait.php, line 14

Namespace

Drupal\content_translation\Plugin\migrate\source
View source
trait I18nQueryTrait {
    
    /**
     * The i18n string table name.
     *
     * @var string
     */
    protected $i18nStringTable;
    
    /**
     * Gets the translation for the property not already in the row.
     *
     * For some i18n migrations there are two translation values, such as a
     * translated title and a translated description, that need to be retrieved.
     * Since these values are stored in separate rows of the i18nStringTable
     * table we get them individually, one in the source plugin query() and the
     * other in prepareRow(). The names of the properties varies, for example,
     * in BoxTranslation they are 'body' and 'title' whereas in
     * MenuLinkTranslation they are 'title' and 'description'. This will save both
     * translations to the row.
     *
     * @param \Drupal\migrate\Row $row
     *   The current migration row which must include both a 'language' property
     *   and an 'objectid' property. The 'objectid' is the value for the
     *   'objectid' field in the i18n_string table.
     * @param string $property_not_in_row
     *   The name of the property to get the translation for.
     * @param string $object_id_name
     *   The value of the objectid in the i18n table.
     * @param \Drupal\migrate\Plugin\MigrateIdMapInterface $id_map
     *   The ID map.
     *
     * @return bool
     *   FALSE if the property has already been migrated.
     *
     * @throws \Drupal\migrate\MigrateException
     */
    protected function getPropertyNotInRowTranslation(Row $row, $property_not_in_row, $object_id_name, MigrateIdMapInterface $id_map) {
        $language = $row->getSourceProperty('language');
        if (!$language) {
            throw new MigrateException('No language found.');
        }
        $object_id = $row->getSourceProperty($object_id_name);
        if (!$object_id) {
            throw new MigrateException('No objectid found.');
        }
        // If this row has been migrated it is a duplicate so skip it.
        if ($id_map->lookupDestinationIds([
            $object_id_name => $object_id,
            'language' => $language,
        ])) {
            return FALSE;
        }
        // Save the translation for the property already in the row.
        $property_in_row = $row->getSourceProperty('property');
        $row->setSourceProperty($property_in_row . '_translated', $row->getSourceProperty('translation'));
        // Get the translation, if one exists, for the property not already in the
        // row.
        $query = $this->select($this->i18nStringTable, 'i18n')
            ->fields('i18n', [
            'lid',
        ])
            ->condition('i18n.property', $property_not_in_row)
            ->condition('i18n.objectid', $object_id);
        $query->leftJoin('locales_target', 'lt', '[i18n].[lid] = [lt].[lid]');
        $query->condition('lt.language', $language);
        $query->addField('lt', 'translation');
        $results = $query->execute()
            ->fetchAssoc();
        if (!$results) {
            $row->setSourceProperty($property_not_in_row . '_translated', NULL);
        }
        else {
            $row->setSourceProperty($property_not_in_row . '_translated', $results['translation']);
        }
        return TRUE;
    }

}

Members

Title Sort descending Modifiers Object type Summary
I18nQueryTrait::$i18nStringTable protected property The i18n string table name.
I18nQueryTrait::getPropertyNotInRowTranslation protected function Gets the translation for the property not already in the row.

API Navigation

  • Drupal Core 11.1.x
  • Topics
  • Classes
  • Functions
  • Constants
  • Globals
  • Files
  • Namespaces
  • Deprecated
  • Services
RSS feed
Powered by Drupal