(Poniższe informacje dotyczą Drupala 7 - nie wiem o Drupalu 6 lub wcześniej.)
Zakładam, że chcesz zdefiniować relację tłumaczenia między węzłami angielskim i francuskim. Aby to zrobić, najpierw każdy węzeł powinien mieć zdefiniowany język zdefiniowany w prepareRow()
:
$this->addFieldMapping('language', 'language_code');
$row->lang_dest = 'fr'; // or "en", depending on the row.
Po drugie, musisz w jakiś sposób zdefiniować tnid
węzeł źródłowy, który ma być własny, nid
a tnid
węzeł translacji, aby był nid
węzłem źródłowym. Zauważ, że możesz wybrać losowy język dla węzła źródłowego, więc nawet mieszanie języka źródłowego pomiędzy różnymi treściami jest dopuszczalne. Pytanie brzmi jak.
(Uwaga: myślę, że to wszystko, czego potrzebujesz, ale mogę się mylić. Postępowałem zgodnie z instrukcjami w drugim przypadku poniżej i udało mi się.)
Jeśli wyraźnie podasz numer węzła (= nid
) każdego wiersza podczas migracji, jest to łatwe, ponieważ wiesz, który wiersz odpowiada nid
, nawet przed zaimportowaniem tych węzłów. Możesz więc po prostu ustawić tnid
każdy wiersz jako taki. Oczywiście, musisz uważać, aby nie konfliktować zaimportowanego nid
z żadnym z istniejących elementów nid
w zawartości Drupala.
Jeśli pozwolisz Drupalowi zdecydować nid
o każdym zaimportowanym wierszu, będzie to trudniejsze. Zrobiłem z 2 krokami. Najpierw zaimportowałem wszystkie wiersze w języku źródłowym, dodając niestandardowe pole w celu zidentyfikowania go jako węzła źródłowego do późniejszego wykorzystania. Po drugie, zaimportowałem wiersze przetłumaczonego języka i skonfigurowałem wszystkie tid
węzły zarówno źródłowego, jak i przetłumaczonego języka. Te dwa kroki mogą być zupełnie różne moduły, ale są chyba bardziej poręczne jeśli zdefiniowanie tych dwóch postaci odrębnych zajęć w tej samej grupie (migracji) w varialbe $api
w twojej Your_ModuleName.migrate.inc
.
W drugim kroku dla przetłumaczonego języka napisałem w następujący sposób. Krótko mówiąc, wyszukuje węzeł języka źródłowego z zapytaniem SQL na podstawie niestandardowego pola field_original_html_filename
, które zostało zdefiniowane podczas importowania.
// 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;
}
}
To wszystko. Nie dziwię się, czy będzie łatwiejszy czy lepszy sposób, ale zadziałało to dla mnie. W każdym razie zaletą konfigurowania tłumaczeń podczas migracji jest to, że zawsze można je wycofać. Jako odniesienie cały mój kod migracji (dla 2 języków, ze statycznych plików HTML) jest dostępny na GitHub:
https://github.com/masasakano/migrate_goo