(Quanto segue si applica a Drupal 7 - Non conosco Drupal 6 o prima.)
Presumo che tu voglia definire la relazione di traduzione tra i nodi inglese e francese. Per fare ciò, in primo luogo, ogni nodo dovrebbe avere la lingua definita, come definito in prepareRow():
$this->addFieldMapping('language', 'language_code');
$row->lang_dest = 'fr'; // or "en", depending on the row.
In secondo luogo, è necessario in qualche modo definire il tnidnodo sorgente come proprio nide quello tniddel nodo di traduzione essere il nidnodo sorgente. Nota che puoi scegliere la lingua casuale per il nodo sorgente, quindi è anche accettabile mescolare la lingua sorgente tra contenuti diversi. La domanda è come.
(Nota: penso che sia tutto ciò di cui hai bisogno, ma potrei sbagliarmi. Ho seguito i passaggi nel secondo caso di seguito e ci sono riuscito.)
Se specifichi esplicitamente il numero di nodo (= nid) di ogni riga nella tua migrazione, allora è facile, perché sai quale riga corrisponde a quale nid, anche prima di importare quei nodi. Quindi, puoi semplicemente impostare tnidciascuna riga come tale. Ovviamente, devi stare attento a non mettere in conflitto gli importati nidcon nessuno dei messaggi esistenti nidnei contenuti di Drupal.
Se lasci che Drupal decida niddi ciascuna riga importata, è più complicato. Ho fatto con i 2 passaggi. Innanzitutto, ho importato tutte le righe della lingua di origine, aggiungendo un campo personalizzato per identificarlo come nodo di origine per un uso successivo. In secondo luogo, ho importato le righe in lingua tradotta e impostato tutte le tids dei nodi sorgente e in lingua tradotta. Questi due passaggi possono essere moduli completamente diversi, ma sono forse più maneggevoli se li definisci come classi separate nello stesso gruppo (migrazione) nel varialbe $apinel tuo Your_ModuleName.migrate.inc.
Per il secondo passo per la lingua tradotta, ho scritto come segue. In breve, trova il nodo del linguaggio di origine con la query SQL, in base al campo personalizzato field_original_html_filename, che è stato definito al momento dell'importazione .
// 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;
}
}
Questo è tutto. Non sono sorpreso se ci sarebbe un modo più semplice o migliore, ma ha funzionato per me. Ad ogni modo un vantaggio nell'impostare le traduzioni durante la migrazione è che puoi sempre eseguire il rollback. Come riferimento il mio intero codice di migrazione (per 2 lingue, dai file HTML statici) è disponibile su GitHub:
https://github.com/masasakano/migrate_goo