(Следующее относится к 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