(Следующее относится к Drupal 7 - я не знаю о Drupal 6 или ранее.)
Я предполагаю, что вы хотите определить отношение перевода между английскими и французскими узлами. Для этого, во-первых, каждый узел должен иметь определенный язык, как определено в prepareRow():
$this->addFieldMapping('language', 'language_code');
$row->lang_dest = 'fr'; // or "en", depending on the row.
Во-вторых, вам нужно каким-то образом определить tnidисходный узел как собственный nidи tnidузел перевода nidкак исходный узел. Обратите внимание, что вы можете выбрать произвольный язык для исходного узла, и поэтому даже допустимо смешивать исходный язык между различным содержимым. Вопрос в том, как.
(Обратите внимание, я думаю, что это все, что вам нужно, но я могу ошибаться. Я выполнил действия во втором случае ниже и преуспел.)
Если вы явно укажете номер узла (= nid) каждой строки в своей миграции, это будет легко, поскольку вы знаете, какой строке какая строка соответствует nid, даже до импорта этих узлов. Таким образом, вы можете просто установить tnidкаждый ряд как таковой. Очевидно, вы должны быть осторожны, чтобы не вступать в конфликт импортированных nidс любым из существующих nidв содержимом Drupal.
Если вы разрешите Drupal определять nidкаждую импортированную строку, то это будет сложнее. Я сделал с 2 шага. Сначала я импортировал все строки исходного языка, добавив настраиваемое поле, чтобы идентифицировать его как узел источника для последующего использования. Во-вторых, я импортировал строки с переведенным языком и настроил все tidузлы как исходного, так и переведенного языка. Эти шаги могут быть совершенно разные модули, но, возможно , сподручнее , если вы определили эти два , как отдельные классы в одной и той же (миграция) группы в varialbe $apiв вашей Your_ModuleName.migrate.inc.
Для второго шага для переведенного языка я написал следующее. Короче говоря, он находит узел исходного языка с запросом SQL на основе настраиваемого поля field_original_html_filename, которое было определено при его импорте.
// In prepareRow()
// Set up tnid, obtaining the nid from the node already imported.
$this->addFieldMapping('tnid', 'row_tnid');
//
$field_name = 'field_original_html_filename';
$query = sprintf("SELECT n.entity_id FROM {field_data_%s} n WHERE n.%s_value = '%s'",
$field_name, $field_name, $fbasename_trans); // entity_id == nid of Node
$result = db_query($query);
$nid_trans = $result->fetchCol()[0];
$row->row_tnid = $nid_trans; // In my case, it is guaranteed there is only one candidate.
// In prepare()
// Forcibly set up (Change) tnid of the node already imported.
public function prepare(&$node, $row) {
if (isset($node->tnid) && ($source = node_load($node->tnid))) {
$node->translation_source = $source;
}
}
Это все. Я не удивлен, если бы был более легкий или лучший способ, но это сработало для меня. В любом случае, преимущество при настройке переводов во время миграции заключается в том, что вы всегда можете выполнить откат. В качестве ссылки весь мой код миграции (для 2 языков, из статических файлов HTML) доступен на GitHub:
https://github.com/masasakano/migrate_goo