(O seguinte se aplica ao Drupal 7 - não conheço o Drupal 6 ou anterior.)
Presumo que você queira definir a relação da tradução entre os nós inglês e francês. Para fazer isso, primeiro, cada nó deve ter o idioma definido, conforme definido em prepareRow()
:
$this->addFieldMapping('language', 'language_code');
$row->lang_dest = 'fr'; // or "en", depending on the row.
Segundo, você precisa definir de alguma forma o tnid
nó de origem como sendo seu nid
e o tnid
nó de conversão como sendo o nid
nó de origem. Observe que você pode escolher o idioma aleatório para o nó de origem e, portanto, é aceitável misturar o idioma de origem entre diferentes conteúdos. A questão é como.
(Observe que acho que é tudo o que você precisa, mas posso estar errado. Segui as etapas no segundo caso abaixo e obtive sucesso.)
Se você especificar explicitamente o número do nó (= nid
) de cada linha em sua migração, será fácil, porque você sabe qual linha corresponde a qual nid
, mesmo antes de importar esses nós. Portanto, você pode apenas definir tnid
cada linha como tal. Obviamente, você deve tomar cuidado para não conflitar o importado nid
com nenhum dos nid
s existentes no conteúdo do Drupal.
Se você permitir que o Drupal decida o nid
de cada linha importada, será mais complicado. Eu fiz com os 2 passos. Primeiro, importei todas as linhas do idioma de origem, adicionando um campo personalizado para identificá-lo como o nó de origem para uso posterior. Segundo, importei as linhas do idioma traduzido e configurei todos os tid
s dos nós de origem e do idioma traduzido. Essas duas etapas podem ser módulos completamente diferentes, mas talvez sejam mais úteis se você definir essas duas como classes separadas no mesmo grupo (migração) no varialbe $api
no seu Your_ModuleName.migrate.inc
.
Para o segundo passo para o idioma traduzido, escrevi da seguinte maneira. Em resumo, ele encontra o nó do idioma de origem com a consulta SQL, com base no campo personalizado field_original_html_filename
, que foi definido quando foi importado.
// 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;
}
}
Isso é tudo. Não estou surpreso se haveria uma maneira mais fácil ou melhor, mas funcionou para mim. De qualquer forma, uma vantagem de configurar as traduções durante a migração é que você sempre pode reverter. Como referência, todo o meu código de migração (para 2 idiomas, dos arquivos HTML estáticos) está disponível no GitHub:
https://github.com/masasakano/migrate_goo