आपकी आवश्यकता:
मेरी साइट के लिए
एक प्रमाणित उपयोगकर्ता के रूप में कई भाषाओं में काम करने के लिए मुझे
अपनी साइट के कोडबेस में पाए गए किसी भी और सभी अनुवाद कॉलों को एक बार में अनुवाद करने में सक्षम होना चाहिए जो टी () फ़ंक्शन के साथ किया गया था।
क्या उस आवश्यकता का विवरण भी वही है जो आप पूछ रहे हैं?
क्रौलर
जैसे किसी ने कहा - एक क्रॉलर सैद्धांतिक रूप से सभी टी () कॉल के पंजीकरण के लिए पूरी साइट के माध्यम से जा सकता है । लेकिन 1) क्रॉलर को पता नहीं है कि कौन से पेज क्रॉल करने के लिए हैं; 2) हम क्रॉल करने के लिए पृष्ठों की एक सूची बनाए रखने के लिए नहीं देख रहे हैं; 3) हम क्रॉलर, अवधि का उपयोग नहीं करना चाहते हैं। Eww। बस, ई.व्ही। सही?
समस्या
- हमारे पास सभी अनुवाद स्ट्रिंग्स की सूची नहीं है।
- Drupal / PHP C के विपरीत एक गतिशील भाषा है जो संकलित है। इसलिए हम नहीं जा सकते हैं और उदाहरण के लिए कह सकते हैं: इस पूरे कोडबेस को संकलित करें, फिर मुझे इस फ़ंक्शन के सभी उदाहरण ढूंढें
t()
, फिर डेटाबेस में उन उदाहरणों को पंजीकृत करें, फिर t()
एक बार में उन सभी पंजीकृत उदाहरणों का अनुवाद करें । मुझे नहीं लगता कि हमारे पास अपनी मेज पर एक विकल्प है।
- एक स्थिर कोड विश्लेषण उपकरण एक ही कारण के लिए असहाय होगा क्योंकि एक क्रॉलर असहाय होगा। मुझे
t()
यह फ़ाइल में मिली । महान! इसका उपयोग किस URL में किया जाता है? क्या संदर्भ है?
वर्तमान उपकरणों (Drupal, और कुछ कंट्रिब मॉड्यूल) के साथ समस्या पर हमला करना, और वर्तमान बाधाओं के साथ (वास्तविक समय थीम कॉल पर भरोसा करना -> टेम्पलेट फ़ाइलें -> t()
कॉल), यहां एक नो-एग्जिट गली की तरह दिखता है। हमें बॉक्स से थोड़ा हटकर सोचने की जरूरत हो सकती है।
हमें क्या चाहिये
- हमें एक डेटा स्रोत की आवश्यकता है, एक मॉडल, जो मुझे बताता है कि हमारे पास कौन से वर्तमान अनुवाद हैं, और उनका संदर्भ क्या है -
- प्रोएक्टिव डेटा मॉडल। वर्तमान डेटा मॉडल प्रतिक्रियाशील है (जब भी कॉल
t()
होता है तब मॉडल अपडेट हो जाता है)। हमें एक सक्रिय डेटा मॉडल की आवश्यकता है - एक जिसमें एप्लिकेशन को t()
उदाहरणों की तलाश करने से पहले ध्यान रखना चाहिए, क्योंकि वे वास्तव में ग्राहक द्वारा निष्पादित होते हैं।
- हमें संदर्भ चाहिए।
t()
अकेले इसे काटता नहीं है - क्योंकि - हमें नहीं पता कि हम 'फू' का अनुवाद कर रहे हैं, लेकिन हम जिस लक्ष्य भाषा का अनुवाद कर रहे हैं, वह उस URL पर निर्भर करता है जहां पर t()
होता है। भले ही हम t()
कॉल में टार्गेट लैंग्वेज को हार्डकोड कर सकते हैं, फिर भी, रैपर कॉल का उपयोग करते हुए, यह आपके उद्देश्यों के लिए काम नहीं करेगा।
मैंने कुछ ऐसे उपकरणों की पहचान की है, जो अगर हमारे पास होते - तो हमारी समस्या को हल करते। इन उपकरणों के साथ हम डेटा मॉडल में जा सकते हैं और कह सकते हैं: मुझे उन सभी तारों को लपेटो t()
जो अभी तक आबाद नहीं हुए हैं। अब इन अनुवादों को डालें। धन्यवाद।
और अगली बार जब ग्राहक आता है, तो अनुवाद जगह पर होते हैं।
हम कैसे ... इन उपकरणों का निर्माण करेंगे?
प्रतिबन्ध
- लक्ष्य भाषा टेम्पलेट पर नहीं हो सकती है, यह URL द्वारा तय किया गया है। स्ट्रिंग मानकर किसी भी भाषा का समर्थन करना चाहिए।
- अनुवादित स्ट्रिंग टेम्पलेट पर नहीं हो सकता है। अनुवाद एक डेटाबेस में रहेगा।
अब जब मैंने समस्या को और अधिक सोच दिया है, और कुछ चुनौतियों और बाधाओं की पहचान की है, तो मैं वहां उपलब्ध किसी भी समाधान को देखने के बारे में सोच सकता हूं, या कोई कस्टम समाधान बना सकता हूं।
समाधान मंथन
मुझे कुछ ऐसा चाहिए जो "सब कुछ" को एक साथ जोड़े। किस बारे में ... एक इकाई?
- एक इकाई उस उत्पाद को पकड़ सकती है जिसका अनुवाद करने की आवश्यकता है।
- संस्थाएं संबंध प्रदान कर सकती हैं - गोंद - जिस उत्पाद का अनुवाद करने की आवश्यकता है, उसके बीच और यह संदर्भ है।
- इकाई किसी क्षेत्र में, उत्पाद का डिफ़ॉल्ट URL स्थान निर्दिष्ट कर सकती है।
- टोकन का उपयोग वैकल्पिक स्थानों (भाषाओं?) को निर्दिष्ट करने के लिए किया जा सकता है, जिस पर उत्पाद दिखाई देगा।
- प्रविष्टियाँ हमें सक्रिय डेटा मॉडल प्रदान करती हैं जिनकी हमें आवश्यकता होती है, और यह संदर्भ है। जो बदले में हमें ऐसा करने की अनुमति देता है जैसे: डेटाबेस में जाएं, सभी उत्पाद संस्थाओं को पकड़ो, और यदि उनके पास फ़ील्ड X, Y और Z के लिए अनुवाद स्ट्रिंग नहीं है, तो उन अनुवाद स्ट्रिंग्स बनाएं।
जब ग्राहक तब पकड़ लेता है /pl/product/200
, तो आप db की यात्रा करते हैं, उत्पाद 200 देखते हैं, और पहले से मौजूद pl
अनुवाद को पकड़ लेते हैं । आपके पास उस उत्पाद के लिए एक शीर्षक और कैप्शन फ़ील्ड भी है? अनुवाद भी वहीं होने चाहिए।
ध्यान दें कि मैं आपके द्वारा उपयोग किए जा रहे अनुवाद मॉड्यूल के संदर्भ में बहुत अस्पष्ट और सामान्य हूं। आप अपने स्वयं के अनुवाद मॉड्यूल का उपयोग करके बहुत अच्छी तरह से समाप्त हो सकते हैं - सबसे अधिक संभावना है कि यह मामला है। Drupal में अब तक जितने भी अनुवाद मॉडल मैंने देखे हैं (D7 के रूप में, D8 को अभी तक नहीं देखा है) प्रतिक्रियाशील हैं, सक्रिय नहीं हैं।
संक्षेप में
सिद्धांत रूप में, उपकरण जो आप की जरूरत है बनाने के लिए, मुख्य घटक होने वाली इकाइयाँ जो सब कुछ एक साथ जोड़ देती हैं: - डेटा (अनुवाद स्ट्रिंग), - लक्ष्य भाषा। उत्पाद भाषाओं के लिए कहते हैं, खुद इकाई पर नहीं होना चाहिए, अधिमानतः एक वर्गीकरण शब्दावली। या शायद अन्य संस्थाओं के लिए एक सामान्य वर्गीकरण के रूप में अच्छी तरह से। - प्रसंग। इकाई जिस URL पर दिखाई देती है। URL में एक टोकन होगा, और टोकन बदले में लक्ष्य भाषा को वर्गीकरण का संदर्भ देगा।
उन तीन अवयवों के साथ जो आप कह सकते हैं: सभी product
संस्थाओं को पकड़ो , URL alias
क्षेत्र में जाओ, टैक्सोनॉमी टोकन प्राप्त करें, सभी संभव संयोजनों के माध्यम से चक्र करें, वर्तमान उपयोगकर्ता के सभी संयोजनों को या तो एक बहुत बड़े बदसूरत रूप का उपयोग करके - या, AJAX - और मल्टी-स्टेप फॉर्म (ऐसा कुछ), और जैसा कि वर्तमान में लॉग इन किया गया उपयोगकर्ता उत्पाद 200 के लिए विभिन्न भाषाओं का अनुवाद करता है, उन लोगों को डेटाबेस में सहेजें।
कहीं न कहीं डेटाबेस में फ़ील्ड एपीआई फ़ील्ड हो सकता है, प्रत्येक इकाई से संबंधित सेटिंग्स फ़ील्ड (बिल्कुल फ़ील्ड एपीआई नहीं है, लेकिन यह अभी भी डेटा पकड़ सकता है), या एक अलग तालिका जिसे आप इसके लिए उपयोग करते हैं। मुझे लगता है कि डेटा को इकाई में सहेजने से कोड और डेटा दोनों टियरियर और आसान रहेंगे।
इसका निर्माण: संभव समाधान
- D8MI (Drupal 8 बहुभाषी पहल)
- कस्टम कोड: "इंडेक्स" अनुवाद उपलब्ध बंडलों और उनके संबंधित विषय हुक टिप्पणियों द्वारा क्रमबद्ध रूप से टी () द्वारा टेम्पलेट्स में उपलब्ध कराया गया है।
स्यूडोकोड
फ़ॉरच यूनिट (टाइप एक्स का),
सभी भाषाओं (उत्पाद के साथ जुड़ी हुई वर्गीकरण या मुख्य भाषा),
इकाई को प्रस्तुत करें,
- यह पता लगाने के लिए टी () अनुवाद तार
- रेंडर कॉल थीम () प्रस्तुत करता है, जो बहुभाषी प्रस्तुति परत को संभालता है उत्पाद, उत्पाद डेटा मॉडल ही नहीं।
परिणाम:
- प्रत्येक भाषा में इकाई टेम्प्लेट रेंडर करने के लिए पहला कॉल प्रत्येक कॉल के लिए डिफ़ॉल्ट भाषा कार्यान्वयन देता है।
- टेम्प्लेट पर टी () पैरामीटर अब ड्रुपल में कैश्ड हैं और अनुवाद के लिए तैयार हैं (प्रत्येक भाषा उदाहरण के लिए, प्रत्येक उत्पाद उदाहरण के लिए नहीं)।
- "अनुवादक" भूमिका वाला उपयोगकर्ता अब अनुवाद इंटरफ़ेस पर जा सकता है और प्रत्येक भाषा के लिए सभी उपलब्ध टी () मापदंडों का अनुवाद कर सकता है।
- साइट स्वामी को प्रत्येक उत्पाद पृष्ठ पर जाने के लिए ग्राहकों को प्रतीक्षा करने या मैन्युअल रूप से प्रत्येक उत्पाद पृष्ठ पर जाने की आवश्यकता नहीं है, क्योंकि यह उसके लिए प्रोग्रामेटिक रूप से किया गया था।
खुले प्रश्न:
- संदर्भ क्या है? यदि मैं प्रत्येक "उत्पाद" इकाई बंडल के लिए थीम () के लिए एक प्रोग्रामेटिक कॉल करता हूं, तो क्या यह उस स्थान को रिकॉर्ड करता है जिससे कॉल किया गया था? क्या यह नोड का URL रिकॉर्ड करता है? क्या "संदर्भ" को बदला जा सकता है? संदर्भ कहाँ दर्ज किया गया है? क्या होता है जब आपके पास "गतिशील" टेम्पलेट होते हैं - यानी, जब आपके पास प्रति उत्पाद एक से अधिक टेम्पलेट होते हैं और आप उन विविधताओं का पता लगाने के बारे में कैसे जाते हैं?
हमेशा की तरह, थिंकिंग और स्यूडोकोड केवल बुद्धिशीलता के लिए अच्छा है। लेकिन विकास में हम शायद ही जान पाएंगे कि जब तक हम प्रोटोटाइप बनाना शुरू नहीं करते हैं, तब तक हम वास्तव में क्या कर रहे हैं। इसलिए कुछ बाधाओं, संभावित समाधानों, और संभावित समस्याओं या प्रश्नों को खींचा गया है - मैं अब अवधारणा या कार्यशील प्रोटोटाइप के प्रमाण को लागू करने के लिए आगे बढ़ सकता हूं। ऊपर दिए गए कुछ खुले प्रश्नों का उत्तर केवल इस तरह दिया जा सकता है, और सबसे पहले हम प्रोटोटाइप (सफलता या असफलता की परवाह किए बिना), हम उन कुछ सवालों के जवाब देना शुरू कर सकते हैं - या दृष्टिकोण को पूरी तरह से बदल सकते हैं। देखते रहो ~
wget
या जो भी हो। Hackish, लेकिन तुमने कहा था कि अनुमति दी गई थी: (: