(Lo siguiente se aplica a Drupal 7: no sé sobre Drupal 6 o antes).
Supongo que desea definir la relación de traducción entre los nodos inglés y francés. Para hacer eso, primero, cada nodo debe tener el lenguaje definido, como se define en prepareRow()
:
$this->addFieldMapping('language', 'language_code');
$row->lang_dest = 'fr'; // or "en", depending on the row.
En segundo lugar, debe definir de alguna manera el tnid
nodo de origen como propio nid
y el tnid
nodo de traducción como el nodo nid
de origen. Tenga en cuenta que puede elegir el idioma aleatorio para el nodo de origen, por lo que incluso es aceptable mezclar el idioma de origen entre diferentes contenidos. La pregunta es cómo.
(Tenga en cuenta que creo que eso es todo lo que necesita, pero podría estar equivocado. Seguí los pasos en el segundo caso a continuación y lo logré).
Si especifica explícitamente el número de nodo (= nid
) de cada fila en su migración, entonces es fácil, porque sabe qué fila corresponde a cuál nid
, incluso antes de importar esos nodos. Por lo tanto, puede configurar tnid
cada fila como tal. Obviamente, debe tener cuidado de no poner en conflicto lo importado nid
con ninguno de los nid
s existentes en el contenido de Drupal.
Si deja que Drupal decida el nid
de cada fila importada, entonces es más complicado. Lo hice con los 2 pasos. Primero, importé todas las filas del idioma de origen, agregando un campo personalizado para identificarlo como el nodo de origen para el uso posterior. En segundo lugar, importé las filas del idioma traducido y configuré todos los tid
nodos tanto del origen como de los nodos traducidos. Estos dos pasos pueden ser módulos completamente diferentes, pero tal vez sean más útiles si define esos dos como clases separadas en el mismo grupo (migración) en el varialbe $api
en su Your_ModuleName.migrate.inc
.
Para el segundo paso para el idioma traducido, escribí lo siguiente. En resumen, encuentra el nodo del idioma de origen con la consulta SQL, en función del campo personalizado field_original_html_filename
, que se definió cuando se importó.
// 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;
}
}
Eso es todo. No me sorprende si habría una manera más fácil o mejor, pero funcionó para mí. De todos modos, una ventaja para configurar las traducciones durante la migración es que siempre puede revertir. Como referencia, todo mi código de migración (para 2 idiomas, desde los archivos HTML estáticos) está disponible en GitHub:
https://github.com/masasakano/migrate_goo