(निम्नलिखित Drupal 7 पर लागू होता है - मैं Drupal 6 या उससे पहले के बारे में नहीं जानता।)
मुझे लगता है कि आप अंग्रेजी और फ्रेंच नोड्स के बीच अनुवाद के संबंध को परिभाषित करना चाहते हैं। ऐसा करने के लिए, पहले, प्रत्येक नोड में परिभाषित भाषा होनी चाहिए, जैसा कि परिभाषित किया गया है prepareRow()
:
$this->addFieldMapping('language', 'language_code');
$row->lang_dest = 'fr'; // or "en", depending on the row.
दूसरा, आपको tnid
स्रोत-नोड को किसी तरह परिभाषित करने की आवश्यकता है कि वह स्वयं का हो nid
और tnid
अनुवाद नोड nid
का स्रोत नोड का हो। ध्यान दें कि आप स्रोत नोड के लिए यादृच्छिक भाषा का चयन कर सकते हैं, और इसलिए विभिन्न सामग्रियों के बीच स्रोत-भाषा का मिश्रण करना भी स्वीकार्य है। सवाल यह है कि कैसे।
(ध्यान दें कि मुझे लगता है कि आप सभी की जरूरत है, लेकिन मैं गलत हो सकता हूं। मैंने नीचे दिए गए दूसरे मामले में चरणों का पालन किया, और सफल रहा।)
यदि आप nid
अपने प्रवास में प्रत्येक पंक्ति के नोड-संख्या (= ) को स्पष्ट रूप से निर्दिष्ट करते हैं , तो यह आसान है, क्योंकि आप जानते हैं कि कौन सी पंक्ति nid
उन नोडों को आयात करने से पहले भी, किस से मेल खाती है । इसलिए, आप tnid
प्रत्येक पंक्ति को इस प्रकार सेट कर सकते हैं। जाहिर है, आपको सावधान रहना चाहिए कि ड्रुपल सामग्री में nid
मौजूदा nid
एस के किसी भी के साथ आयातित संघर्ष नहीं करना चाहिए ।
यदि आप ड्रुपल nid
को प्रत्येक आयातित पंक्ति का निर्णय लेने देते हैं, तो यह अधिक मुश्किल है। मैंने 2 चरणों के साथ किया। सबसे पहले, मैंने सभी स्रोत-भाषा पंक्तियों को आयात किया, बाद के उपयोग के लिए स्रोत नोड के रूप में इसे पहचानने के लिए एक कस्टम फ़ील्ड जोड़ दिया। दूसरा, मैंने अनुवादित-भाषा की पंक्तियों को आयात किया और tid
स्रोत और अनुवादित-भाषा नोड्स दोनों के सभी सेट किए । ये दो चरण पूरी तरह से अलग-अलग मॉड्यूल हो सकते हैं, लेकिन संभवत: यदि आप उन दोनों को अलग-अलग वर्गों के रूप में एक ही (माइग्रेशन) समूह के रूप में परिभाषित करते हैं $api
, तो आपके संस्करण में Your_ModuleName.migrate.inc
।
अनुवादित भाषा के लिए दूसरे चरण के लिए, मैंने निम्नानुसार लिखा। संक्षेप में, यह कस्टम फ़ील्ड के आधार पर SQL क्वेरी के साथ स्रोत-भाषा नोड को ढूँढता है field_original_html_filename
, जिसे आयात किए जाने पर परिभाषित किया गया था।
// 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;
}
}
बस इतना ही। मुझे आश्चर्य नहीं है कि अगर कोई आसान या बेहतर तरीका होगा, लेकिन यह मेरे लिए काम करता है। वैसे भी माइग्रेशन के दौरान अनुवाद सेट करने का एक फायदा यह है कि आप हमेशा रोलबैक कर सकते हैं। एक संदर्भ के रूप में मेरा संपूर्ण माइग्रेशन कोड (स्थिर HTML फ़ाइलों से 2 भाषाओं के लिए) GitHub पर उपलब्ध है:
https://github.com/masasakano/migrate_goo