मैं Drupal.locale.strings में अनुवादित स्ट्रिंग्स कैसे प्राप्त करूं?


9

इसलिए मैं अपने कुछ कस्टम जावास्क्रिप्ट कोड (मेरी थीम में) में Drupal.t () फ़ंक्शन का उपयोग करने की कोशिश कर रहा हूं।

Drupal.locale.strings ऑब्जेक्ट में मुझे जिन स्ट्रिंग्स की आवश्यकता है, उन्हें कैसे प्राप्त करूं? मुझे वहां कुछ तार दिखाई दे रहे हैं, लेकिन निश्चित रूप से पूरे डेटाबेस को लोड नहीं किया जा सकता है। इसे जोड़ने का सबसे अच्छा तरीका क्या है? मैं PHP t () फ़ंक्शन का उपयोग करना चाहूंगा ताकि जोड़े गए स्ट्रिंग्स को ट्रांसलेशन इंटरफ़ेस में संपादित किया जा सके।

जवाबों:


8

Drupal जावास्क्रिप्ट ऑब्जेक्ट में जरूरत के तारों को पॉप्युलेट करता है। स्ट्रिंग के पूरे संग्रह की तरह हर पृष्ठ पर लोड नहीं किया गया है, केवल आवश्यक स्ट्रिंग्स को जावास्क्रिप्ट में जोड़ा जाता है।

मेरा मानना ​​है कि यह स्क्रिप्ट फ़ाइलों को ट्रेस करने से पहले किया जाता है, क्योंकि वे वास्तव में पृष्ठ पर जोड़े जाते हैं।

इसलिए यदि आप Drupal.t('Some string');अपने जावास्क्रिप्ट कोड में जोड़ते हैं , तो आपको अनुवाद इंटरफ़ेस में अनुवाद करने में सक्षम होना चाहिए।


अच्छा तो यह नहीं हो रहा है। (Drupal.t () कॉल को खोजने के लिए स्क्रिप्ट का ट्रैवर्सल)। मैं विषय की .info फ़ाइल (स्क्रिप्ट [] = स्क्रिप्ट / script.js) के माध्यम से स्क्रिप्ट जोड़ रहा हूं। शायद मुझे drupal_add_js () के माध्यम से जोड़ना होगा?
जॉनएमसीएल

तुम सही हो। मुझे पूरी तरह से समझ पाने के लिए ट्रेस करना था, लेकिन यह वास्तव में स्वचालित रूप से होता है। Drupal 7 में, फ़ंक्शन locale_js_alter () (locale.module में) है। यह जावास्क्रिप्ट फ़ाइलों की पूरी सूची का उपयोग करता है और _locale_parse_js_file () में प्रत्येक को पार्स करता है। यह सुनिश्चित करने के लिए सावधान रहें कि file_get_contents () आपकी JS फाइल को दिए गए पथ के साथ लोड कर सकता है (अर्थात आपके विषय के साथ अपना पथ शुरू न करें (यदि यह आपके थीम फ़ोल्डर में है)। आप अपने विषय की .info फ़ाइल में drupal_add_js या स्क्रिप्ट [] सेटिंग का उपयोग कर सकते हैं। बेशक, कैश को साफ करना और स्ट्रिंग का अनुवाद करना सुनिश्चित करें! :)
जॉनएमसीएल

6

बस आज इसी मुद्दे में भाग गया और इस पर थोड़ा और शोध किया। ऊपर क्रिस की एक अच्छी टिप्पणी है, लेकिन यह अंततः गलत है। काम करने के लिए आपको Drupal.behaviors का उपयोग करने की आवश्यकता नहीं है।

जैसा कि जॉनएमसीएल ने अपनी अंतिम टिप्पणी में खुद ही नोट किया है, locale.inc में _locale_parse_js_file पर फ़ंक्शन Drupal.t ("somestring") के पार्सिंग के लिए जिम्मेदार है, जो पंक्ति 993 से शुरू होता है (Drupal 7.22 में)

preg_match_all('~
[^\w]Drupal\s*\.\s*t\s*                       # match "Drupal.t" with whitespace
\(\s*                                         # match "(" argument list start
(' . LOCALE_JS_STRING . ')\s*                 # capture string argument
(?:,\s*' . LOCALE_JS_OBJECT . '\s*            # optionally capture str args
  (?:,\s*' . LOCALE_JS_OBJECT_CONTEXT . '\s*) # optionally capture context
?)?                                           # close optional args
[,\)]                                         # match ")" or "," to finish
~sx', $file, $t_matches);

यह सिर्फ एक "गूंगा" पार्सिंग फ़ंक्शन है जो शब्दार्थों की परवाह नहीं करता है और इसे प्राप्त होने वाली किसी भी फ़ाइल में Drupal.t ("कुछ") के सभी उदाहरणों को ढूंढता है।

एक सामान्य गोचर क्या हो सकता है कि आपको Drupal.t ("ट्रांसल्मे") फॉर्म में अपने स्रोत कोड में पूरे स्ट्रिंग को रखने की आवश्यकता है, क्योंकि (जाहिर है) कोई जावास्क्रिप्ट तब निष्पादित नहीं होती है जब फ़ाइल को php में file_get -contents के माध्यम से खोला जाता है। इसका मतलब है कि आप Drupal.t (somevariable) कभी नहीं कर सकते हैं और आशा है कि Drupal उन सभी स्ट्रिंग-युक्त जावास्क्रिप्ट चर को पकड़ लेगा जिन्हें आप Drupal.t पर फेंकते हैं।

यदि आप चार्ट के लिए "महिलाओं" का अनुवाद करना चाहते हैं और स्ट्रिंग को एक संदर्भ देना चाहते हैं, तो वाक्यविन्यास होगा:

Drupal.t("women", {}, {context: "charts"}

इसके अलावा, यदि आपने ड्रॉ स्थापित किया है, तो अपनी js फ़ाइल को सत्यापित करें कि कमांड के साथ पार्स किया गया है;

drush vget javascript_parsed

फिर आप अपने कैश से साफ कर सकते हैं

drush cc all

... और पहले से ही पार्स फ़ाइलों की सूची को सत्यापित करने के लिए ऊपर दिए गए vget कमांड को खाली है। इस तरह से आपकी फ़ाइल अगले भाग में पुन: प्राप्त हो जाएगी (यह भी सत्यापित करें)।


1
के लिए धन्यवाद drush vget javascript_parsed! अनुवाद स्क्रिप्ट फ़ाइलों को फिर से बनाने के लिए एक तेज़ तरीका सिर्फ CSS और JS फ़ाइलों को हटाकर उपयोग करना है drush @sitealias cc css-js
जुमे 11'14

0

दम्पत्ति में बहुभाषी जेएस को लागू करने के दौरान मैंने जो युगल भाग लिया है:

  1. सबसे पहले, सुनिश्चित करें कि आपकी JS फाइल इनलाइन में शामिल नहीं की जा रही है । Drupal 7.22 के रूप में, Drupal.locale.stringsयदि आप Drupal में जावास्क्रिप्ट फ़ाइलों को इनलाइन कर रहे हैं, तो अपने आप को स्वयं अपडेट करने के लिए प्रतीत नहीं होता है । अनुवाद इंटरफ़ेस ने अभी भी मेरी उलझन को जोड़ते हुए स्ट्रिंग को उठाया।

  2. दूसरा, सुनिश्चित करें कि आप अपने जेएस को पेज पर संलग्न करने के लिए Drupal.behaviors का उपयोग कर रहे हैं । नियमित जेएस क्लोजर ड्रुपल के "मैजिक" पार्सिंग को ट्रिगर नहीं करेगा Drupal.t()। यह तकनीकी रूप से कुछ है जो आपको वैसे भी करना चाहिए;)

वहाँ से यह वास्तव में बहुत दर्द रहित है। बस Drupal.t()आपके द्वारा अनुवादित पाठ के चारों ओर उपयोग करें, फ़ाइल को अपडेट करने के लिए अपना कैश हर बार साफ़ करें, और आपके अनुवादकों को इंटरफ़ेस में नया स्ट्रिंग देखना चाहिए /admin/config/regional/translate/translate। एक बार काम करने के बाद यह काफी अच्छा लगता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.