(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 tnid
nodo sorgente come proprio nid
e quello tnid
del nodo di traduzione essere il nid
nodo 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 tnid
ciascuna riga come tale. Ovviamente, devi stare attento a non mettere in conflitto gli importati nid
con nessuno dei messaggi esistenti nid
nei contenuti di Drupal.
Se lasci che Drupal decida nid
di 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 tid
s 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 $api
nel 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