(Das Folgende gilt für Drupal 7 - ich kenne Drupal 6 noch nicht.) Ich gehe
davon aus, dass Sie das Übersetzungsverhältnis zwischen englischen und französischen Knoten definieren möchten. Zu diesem Zweck sollte jeder Knoten die in den folgenden Abschnitten definierte Sprache haben prepareRow()
:
$this->addFieldMapping('language', 'language_code');
$row->lang_dest = 'fr'; // or "en", depending on the row.
Zweitens müssen Sie irgendwie den tnid
des Quellknotens als seinen eigenen nid
und den tnid
des Übersetzungsknotens als den nid
des Quellknotens definieren. Beachten Sie, dass Sie die Zufallssprache für den Quellknoten auswählen können und es daher sogar akzeptabel ist, die Quellsprache zwischen verschiedenen Inhalten zu mischen. Die Frage ist wie.
(Beachten Sie, ich denke, das ist alles, was Sie brauchen, aber ich könnte mich irren. Ich habe die Schritte im zweiten Fall unten befolgt und war erfolgreich.)
Wenn Sie die Knotennummer (= nid
) jeder Zeile in Ihrer Migration explizit angeben , ist dies sehr einfach, da Sie nid
bereits vor dem Importieren dieser Knoten wissen, welche Zeile welcher entspricht . Sie können also einfach tnid
jede Zeile als solche festlegen . Natürlich müssen Sie darauf achten, dass keine Konflikte zwischen den importierten nid
und den nid
in Drupal vorhandenen Inhalten auftreten.
Wenn Sie Drupal über die Anzahl der nid
importierten Zeilen entscheiden lassen, ist dies schwieriger. Ich habe mit den 2 Schritten gemacht. Zuerst habe ich alle Zeilen in der Quellsprache importiert und ein benutzerdefiniertes Feld hinzugefügt, um es als Quellknoten für die spätere Verwendung zu identifizieren. Zweitens habe ich die übersetzten Sprachzeilen importiert und alle tid
s sowohl der Quellen- als auch der übersetzten Sprachknoten eingerichtet. Diese beiden Schritte können völlig unterschiedliche Module sein, sind jedoch möglicherweise praktischer, wenn Sie diese beiden als separate Klassen in derselben (Migrations-) Gruppe in der Variablen $api
in Ihrem Modul definieren Your_ModuleName.migrate.inc
.
Für den zweiten Schritt für die übersetzte Sprache schrieb ich wie folgt. Kurz gesagt, es wird der quellensprachliche Knoten mit der SQL-Abfrage basierend auf dem benutzerdefinierten Feld gefunden field_original_html_filename
, das beim Import definiert wurde.
// 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;
}
}
Das ist alles. Ich bin nicht überrascht, ob es einen einfacheren oder besseren Weg gibt, aber es hat bei mir funktioniert. Ein Vorteil beim Einrichten der Übersetzungen während der Migration ist jedoch, dass Sie jederzeit ein Rollback durchführen können. Als Referenz ist mein gesamter Migrationscode (für 2 Sprachen, aus den statischen HTML-Dateien) bei GitHub verfügbar:
https://github.com/masasakano/migrate_goo