(Berikut ini berlaku untuk Drupal 7 - Saya tidak tahu tentang Drupal 6 atau sebelumnya.)
Saya kira Anda ingin mendefinisikan hubungan terjemahan antara simpul bahasa Inggris dan Prancis. Untuk melakukan itu, pertama, setiap node harus memiliki bahasa yang ditentukan, sebagaimana didefinisikan dalam prepareRow()
:
$this->addFieldMapping('language', 'language_code');
$row->lang_dest = 'fr'; // or "en", depending on the row.
Kedua, Anda perlu mendefinisikan tnid
node sumber menjadi miliknya nid
dan tnid
node terjemahan menjadi nid
node sumber. Catatan Anda dapat memilih bahasa acak untuk simpul sumber, dan bahkan dapat diterima untuk mencampur bahasa sumber antara konten yang berbeda. Pertanyaannya adalah bagaimana.
(Catatan saya pikir hanya itu yang Anda butuhkan, tetapi saya mungkin salah. Saya mengikuti langkah-langkah dalam kasus kedua di bawah ini, dan berhasil.)
Jika Anda secara eksplisit menentukan nomor simpul (= nid
) dari setiap baris dalam migrasi Anda, maka itu mudah, karena Anda tahu baris mana yang sesuai dengan yang mana nid
, bahkan sebelum Anda mengimpor node tersebut. Jadi, Anda bisa mengatur tnid
setiap baris seperti itu. Jelas, Anda harus berhati-hati untuk tidak bertentangan dengan yang diimpor nid
dengan yang ada nid
di konten Drupal.
Jika Anda membiarkan Drupal memutuskan nid
setiap baris yang diimpor, maka itu lebih rumit. Saya lakukan dengan 2 langkah. Pertama, saya mengimpor semua baris bahasa sumber, menambahkan bidang khusus untuk mengidentifikasinya sebagai simpul sumber untuk penggunaan nanti. Kedua, saya mengimpor baris-baris bahasa terjemahan dan mengatur semua tid
s dari kedua node sumber dan bahasa terjemahan. Kedua langkah ini dapat menjadi modul yang benar-benar berbeda, tetapi mungkin lebih mudah jika Anda mendefinisikan keduanya sebagai kelas terpisah dalam grup (migrasi) yang sama di varialbe $api
di komputer Anda Your_ModuleName.migrate.inc
.
Untuk langkah kedua untuk bahasa terjemahan, saya menulis sebagai berikut. Singkatnya, ia menemukan simpul bahasa sumber dengan query SQL, berdasarkan pada bidang kustom field_original_html_filename
, yang didefinisikan ketika diimpor.
// 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;
}
}
Itu semuanya. Saya tidak terkejut jika ada cara yang lebih mudah atau lebih baik, tetapi itu berhasil bagi saya. Bagaimanapun keuntungan untuk menyiapkan terjemahan selama migrasi adalah Anda selalu dapat mengembalikan. Sebagai referensi seluruh kode migrasi saya (untuk 2 bahasa, dari file HTML statis) tersedia di GitHub:
https://github.com/masasakano/migrate_goo