(Ce qui suit s'applique à Drupal 7 - je ne connais pas Drupal 6 ou avant.)
Je suppose que vous voulez définir la relation de traduction entre les nœuds anglais et français. Pour ce faire, tout d'abord, chaque nœud doit avoir le langage défini, tel que défini dans prepareRow()
:
$this->addFieldMapping('language', 'language_code');
$row->lang_dest = 'fr'; // or "en", depending on the row.
Deuxièmement, vous devez en quelque sorte définir le tnid
nœud source comme étant le sien nid
et le tnid
nœud de traduction être le nid
nœud source. Notez que vous pouvez choisir la langue aléatoire pour le nœud source, et il est donc même acceptable de mélanger la langue source entre différents contenus. La question est de savoir comment.
(Notez que je pense que c'est tout ce dont vous avez besoin, mais je peux me tromper. J'ai suivi les étapes dans le deuxième cas ci-dessous, et j'ai réussi.)
Si vous spécifiez explicitement le numéro de nœud (= nid
) de chaque ligne dans votre migration, alors c'est facile, car vous savez quelle ligne correspond à laquelle nid
, avant même d'importer ces nœuds. Ainsi, vous pouvez simplement définir tnid
chaque ligne comme telle. Évidemment, vous devez faire attention à ne pas entrer en conflit nid
avec les nid
s existants dans le contenu Drupal.
Si vous laissez Drupal décider nid
de chaque ligne importée, c'est plus délicat. Je l'ai fait avec les 2 étapes. Tout d'abord, j'ai importé toutes les lignes de la langue source, en ajoutant un champ personnalisé pour l'identifier comme nœud source pour une utilisation ultérieure. Deuxièmement, j'ai importé les lignes en langue traduite et configuré tous les tid
s des nœuds source et en langue traduite. Ces deux étapes peuvent être des modules complètement différents, mais sont peut-être plus pratiques si vous définissez ces deux en tant que classes distinctes dans le même groupe (migration) dans le varialbe $api
de votre Your_ModuleName.migrate.inc
.
Pour la deuxième étape de la langue traduite, j'ai écrit comme suit. En bref, il trouve le nœud de langue source avec la requête SQL, en fonction du champ personnalisé field_original_html_filename
, qui a été défini lors de son importation.
// 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;
}
}
C'est tout. Je ne suis pas surpris s'il y aurait un moyen plus facile ou meilleur, mais cela a fonctionné pour moi. Quoi qu'il en soit, un avantage pour configurer les traductions pendant la migration est que vous pouvez toujours annuler. Comme référence, tout mon code de migration (pour 2 langues, à partir des fichiers HTML statiques) est disponible sur GitHub:
https://github.com/masasakano/migrate_goo