विषय का आधार
बहुभाषी साइट में तीन अलग-अलग पहलू होते हैं:
- इंटरफ़ेस अनुवाद
- सामग्री
- यूआरएल रूटिंग
जबकि वे सभी अलग-अलग तरीकों से जुड़े हुए हैं, सीएमएस के दृष्टिकोण से वे अलग-अलग UI तत्वों का उपयोग करके प्रबंधित किए जाते हैं और अलग-अलग संग्रहीत होते हैं। ऐसा लगता है कि आप पहले दो के कार्यान्वयन और समझ में आश्वस्त हैं। सवाल बाद वाले पहलू के बारे में था - "URL अनुवाद? क्या हमें यह करना चाहिए या नहीं? और किस तरह से?"
URL किससे बनाया जा सकता है?
एक बहुत ही महत्वपूर्ण बात यह है कि, IDN के साथ फैंसी न बनें। . इसके बजाय लिप्यंतरण का पक्ष लें (also:प्रतिलेखन और रोमानीकरण). जबकि पहली नज़र में IDN अंतर्राष्ट्रीय URL के लिए व्यवहार्य विकल्प लगता है, यह वास्तव में दो कारणों से विज्ञापित के रूप में काम नहीं करता है:
- कुछ ब्राउज़र गैर-ASCII वर्णों को बदल देंगे जैसे
'ч'
या'ž'
'%D1%87'
. में और'%C5%BE'
- यदि उपयोगकर्ता के पास कस्टम थीम हैं, तो थीम के फ़ॉन्ट में उन अक्षरों के लिए प्रतीक नहीं होने की बहुत संभावना है
मैंने वास्तव में कुछ साल पहले एक वाईआई आधारित परियोजना (भयानक ढांचा, आईएमएचओ) में आईडीएन दृष्टिकोण की कोशिश की थी। उस समाधान को स्क्रैप करने से पहले मुझे उपर्युक्त दोनों समस्याओं का सामना करना पड़ा। साथ ही, मुझे संदेह है कि यह अटैक वेक्टर हो सकता है।
उपलब्ध विकल्प ... जैसा कि मैं उन्हें देखता हूं।
मूल रूप से आपके पास दो विकल्प हैं, जिन्हें इस प्रकार से सारगर्भित किया जा सकता है:
-
http://site.tld/[:query]
:जहां[:query]
भाषा और सामग्री दोनों पसंद को निर्धारित करता है -
http://site.tld/[:language]/[:query]
:जहां[:language]
URL का हिस्सा भाषा के चुनाव को परिभाषित करता है और[:query]
केवल सामग्री की पहचान करने के लिए उपयोग किया जाता है
क्वेरी और Ω है ..
मान लें कि आप http://site.tld/[:query]
चुनते हैं ।
उस स्थिति में आपके पास भाषा का एक प्राथमिक स्रोत है:[:query]
. की सामग्री खंड; और दो अतिरिक्त स्रोत:
- मान
$_COOKIE['lang']
उस विशेष ब्राउज़र के लिए - HTTP स्वीकृति-भाषा शीर्षलेख में भाषाओं की सूची
सबसे पहले, आपको क्वेरी को परिभाषित रूटिंग पैटर्न में से एक से मिलान करने की आवश्यकता है (यदि आपकी पसंद लारवेल है, तो यहां पढ़ेंए> ) पैटर्न के सफल मिलान पर आपको भाषा ढूंढनी होगी।
आपको पैटर्न के सभी खंडों से गुजरना होगा। उन सभी खंडों के लिए संभावित अनुवाद खोजें और निर्धारित करें कि किस भाषा का उपयोग किया गया था। दो अतिरिक्त स्रोतों (कुकी और हेडर) का उपयोग रूटिंग विरोधों को हल करने के लिए किया जाएगा, जब ("अगर" नहीं) वे उत्पन्न होते हैं।
उदाहरण के लिए लें:http://site.tld/blog/novinka
।
यह "блог, новинка"
. का लिप्यंतरण है , जिसका अंग्रेजी में अर्थ लगभग "blog", "latest"
. है ।
जैसा कि आप पहले ही देख सकते हैं, रूसी में "блог" का अनुवाद "ब्लॉग" के रूप में किया जाएगा। जिसका अर्थ है कि [:query]
. के पहले भाग के लिए आप (सर्वोत्तम स्थिति में ) ['en', 'ru']
. के साथ खत्म होगा संभावित भाषाओं की सूची। फिर आप अगला खंड लेते हैं - "नोविंका"। संभावनाओं की सूची में इसकी केवल एक भाषा हो सकती है:['ru']
।
जब सूची में एक आइटम होता है, तो आपने सफलतापूर्वक भाषा ढूंढ ली है।
लेकिन अगर आप 2 (उदाहरण:रूसी और यूक्रेनी) या अधिक संभावनाओं के साथ समाप्त होते हैं .. या 0 संभावनाएं, जैसा कि मामला हो सकता है। सही विकल्प खोजने के लिए आपको कुकी और/या हेडर का उपयोग करना होगा।
और अगर बाकी सब विफल हो जाता है, तो आप साइट की डिफ़ॉल्ट भाषा चुनते हैं।
पैरामीटर के रूप में भाषा
विकल्प URL का उपयोग करना है, जिसे http://site.tld/[:language]/[:query]
के रूप में परिभाषित किया जा सकता है . इस मामले में, क्वेरी का अनुवाद करते समय, आपको भाषा का अनुमान लगाने की आवश्यकता नहीं है, क्योंकि उस समय आप पहले से ही जानते हैं कि किसका उपयोग करना है।
भाषा का एक द्वितीयक स्रोत भी है:कुकी मूल्य। लेकिन यहां एक्सेप्ट-लैंग्वेज हेडर के साथ खिलवाड़ करने का कोई मतलब नहीं है, क्योंकि "कोल्ड स्टार्ट" (जब उपयोगकर्ता पहली बार कस्टम क्वेरी के साथ साइट खोलता है) के मामले में आप अज्ञात मात्रा में संभावित भाषाओं से निपट नहीं रहे हैं।
इसके बजाय आपके पास 3 सरल, प्राथमिकता वाले विकल्प हैं:
- अगर
[:language]
खंड सेट है, इसका उपयोग करें - अगर
$_COOKIE['lang']
सेट है, इसका उपयोग करें - डिफ़ॉल्ट भाषा का उपयोग करें
जब आपके पास भाषा हो, तो आप केवल क्वेरी का अनुवाद करने का प्रयास करते हैं, और यदि अनुवाद विफल हो जाता है, तो उस विशेष खंड के लिए "डिफ़ॉल्ट मान" का उपयोग करें (रूटिंग परिणामों के आधार पर)।
क्या यहां कोई तीसरा विकल्प नहीं है?
हां, तकनीकी रूप से आप दोनों दृष्टिकोणों को जोड़ सकते हैं, लेकिन यह प्रक्रिया को जटिल बना देगा और केवल उन लोगों को समायोजित करेगा जो http://site.tld/en/news
के URL को मैन्युअल रूप से बदलना चाहते हैं। करने के लिए http://site.tld/de/news
और उम्मीद करते हैं कि समाचार पृष्ठ जर्मन में बदल जाएगा।
लेकिन इस मामले को भी कम जादू और आशा के साथ लागू करने के लिए कुकी मूल्य (जिसमें भाषा की पिछली पसंद के बारे में जानकारी होगी) का उपयोग करके कम किया जा सकता है।
किस दृष्टिकोण का उपयोग करें?
जैसा कि आप पहले ही अनुमान लगा चुके होंगे, मैं http://site.tld/[:language]/[:query]
का सुझाव दूंगा अधिक समझदार विकल्प के रूप में।
वास्तविक शब्द स्थिति में भी आपके पास यूआरएल में तीसरा प्रमुख हिस्सा होगा:"शीर्षक"। जैसे ऑनलाइन दुकान में उत्पाद के नाम पर या समाचार साइट में लेख के शीर्षक के रूप में।
उदाहरण:http://site.tld/en/news/article/121415/EU-as-global-reserve-currency
इस मामले में '/news/article/121415'
क्वेरी होगी, और 'EU-as-global-reserve-currency'
शीर्षक है। विशुद्ध रूप से SEO उद्देश्यों के लिए।
क्या यह Laravel में किया जा सकता है?
थोड़े, लेकिन डिफ़ॉल्ट रूप से नहीं।
मैं इससे बहुत परिचित नहीं हूं, लेकिन मैंने जो देखा है, उससे लारवेल सरल पैटर्न-आधारित रूटिंग तंत्र का उपयोग करता है। बहुभाषी URL लागू करने के लिए आपको संभवतः कोर क्लास(एस) का विस्तार करना होगा , क्योंकि बहुभाषी रूटिंग को भंडारण के विभिन्न रूपों (डेटाबेस, कैश और/या कॉन्फ़िगरेशन फ़ाइलों) तक पहुंच की आवश्यकता होती है।
इसे रूट किया गया है। अब क्या?
इन सभी के परिणामस्वरूप आपको दो मूल्यवान जानकारी प्राप्त होगी:वर्तमान भाषा और क्वेरी के अनुवादित खंड। फिर इन मानों का उपयोग उस वर्ग (वर्गों) को भेजने के लिए किया जा सकता है जो परिणाम देगा।
मूल रूप से, निम्न URL:http://site.tld/ru/blog/novinka
(या '/ru'
. के बिना संस्करण ) कुछ इस तरह बदल जाता है
$parameters = [
'language' => 'ru',
'classname' => 'blog',
'method' => 'latest',
];
जिसे आप अभी प्रेषण के लिए उपयोग करते हैं:
$instance = new {$parameter['classname']};
$instance->{'get'.$parameters['method']}( $parameters );
.. या इसके कुछ बदलाव, विशेष कार्यान्वयन के आधार पर।