पुर्तगाली में यहां क्लिक करने के बारे में और जानें
हाल ही में, मैंने डैशबोर्ड जैसा प्रोजेक्ट बनाने के लिए एस्ट्रो सीखना शुरू किया।
मैं वास्तव में इस परियोजना में अंतर्राष्ट्रीयकरण (i18n) लागू करना चाहता हूं - विचार यह है कि हर कोई अपनी भाषा की परवाह किए बिना इसका उपयोग करने में सक्षम होना चाहिए।
एस्ट्रो का i18n सपोर्ट काफी अच्छा है। यह फ़ाइल/फ़ोल्डर संरचना के आधार पर रूटिंग के साथ Next.js या किसी अन्य फ्रेमवर्क के समान काम करता है।
इसलिए, यदि हम एक पेज अंग्रेजी में और वही पेज पुर्तगाली में चाहते हैं, तो हम अपनी फाइलों को इस तरह व्यवस्थित कर सकते हैं:
. └── src/ └── pages/ ├── en/ │ ├── login.astro │ └── dashboard.astro └── pt-br/ ├── login.astro └── dashboard.astro
और प्रत्येक पृष्ठ की अपनी i18n स्ट्रिंग्स हैं—अच्छा!
लेकिन यहीं से मेरी समस्या शुरू होती है: मैं अपने सभी पृष्ठों का क्लोन नहीं बनाना चाहता; मैं केवल उन पृष्ठों पर स्ट्रिंग्स बदलना चाहता हूं।
मुझे /[any-भाषा-ध्वज]/सभी-मेरे-मार्गों जैसा कुछ चाहिए।
आप पूछ सकते हैं: "React-intl जैसी किसी चीज़ का उपयोग क्यों न करें?" मेरा उत्तर यह है कि मैं एस्ट्रो के इंजन का पूरी तरह से लाभ उठाना चाहता हूं, विशेष रूप से एसएसजी/एसएसआर के लिए, और किसी भी क्लाइंट घटक से बचना चाहता हूं। आम तौर पर, ये फ्रेमवर्क रिएक्ट कॉन्टेक्स्ट का उपयोग करते हैं, जो केवल क्लाइंट साइड पर प्रस्तुत किया जाता है।
सबसे पहले, मैंने i18n के बारे में एस्ट्रो रेसिपी पढ़ी और इस समस्या को हल करने के लिए कुछ सामुदायिक पुस्तकालयों की जाँच की।
पहली लाइब्रेरी जिसका मैंने परीक्षण किया वह एस्ट्रो-आई18नेक्स्ट थी, और यह बिल्कुल वैसी ही लग रही थी जैसी मुझे चाहिए थी!
कॉन्फ़िगरेशन फ़ाइल में एक सरणी के आधार पर, एस्ट्रो-आई18नेक्स्ट बिल्ड समय पर मेरे i18n पेज बनाता है, इसलिए मुझे केवल एक बार कोड करने की आवश्यकता है और पेजों की क्लोनिंग के बारे में चिंता करने की ज़रूरत नहीं है।
समस्या यह है कि एस्ट्रो-आई18नेक्स्ट संग्रहीत या अब अनुरक्षित नहीं है। बहुत सारे मुद्दे हैं, और आखिरी प्रतिबद्धता एक साल पहले खत्म हो गई थी।
अन्य पुस्तकालयों (एस्ट्रो-आई18एन का सम्मानजनक उल्लेख) को आज़माने के बाद, मुझे पैराग्लाइड मिला, और यह मेरे प्रोजेक्ट के लिए गेम-चेंजर था।
मैंने पैराग्लाइड को चुना क्योंकि:
नोट: आप पैराग्लाइड का उपयोग JS प्रोजेक्ट में भी कर सकते हैं, और यह Next.js को भी सपोर्ट करता है।
इंस्टॉलेशन और कॉन्फ़िगरेशन के बाद, मैंने अपने संदेशों का उपयोग इस तरह किया:
--- import * as m from "../paraglide/messages.js"; ---{m.hello({ name: "Alan" })}
हालाँकि, इससे मेरी रूटिंग समस्या का समाधान नहीं हुआ—मैं अभी भी उस प्रत्येक भाषा के लिए अपने पृष्ठों की क्लोनिंग कर रहा था जिसे मैं जोड़ना चाहता था।
इसे हल करने के लिए, मैंने अपने प्रोजेक्ट को रूट रूट में डायनेमिक रूट का उपयोग करने के लिए बदल दिया, इसलिए मेरे सभी रूट अब भाषा ध्वज से शुरू होते हैं।
मेरी फ़ोल्डर संरचना इस में बदल गई:
. └── src/ └── pages/ └── [lang]/ ├── login.astro └── dashboard.astro
इस परिवर्तन के बाद, पैराग्लाइड स्वचालित रूप से रूट पैरामीटर से भाषा प्राप्त कर सकता है:
अब, मैं astro.config.ts में सेट करके और अपनी स्ट्रिंग फ़ाइल का अनुवाद करके एक नई भाषा जोड़ सकता हूं।
लेकिन मुझे अभी भी दो और मुद्दे सुलझाने हैं:
भाषा पुनर्निर्देशन के पहले मुद्दे को हल करने के लिए, मैंने एस्ट्रो मिडलवेयर का उपयोग किया।
src/middleware/index.ts में, मैंने यह कोड जोड़ा:
import { defineMiddleware } from 'astro:middleware'; import { languageTag, setLanguageTag, type AvailableLanguageTag, } from '../paraglide/runtime'; export const onRequest = defineMiddleware((context, next) => { // Get lang from url param const lang = context.params.lang; // If changed if (lang !== languageTag()) { setLanguageTag(lang as AvailableLanguageTag); // Redirect to lang changed or default (en) return context.redirect(`/${lang ?? 'en'}`); } return next(); });
जब उपयोगकर्ता भाषाएं बदलते हैं तो उन्हें उसी रूट पर रखने के लिए, मैंने यह घटक जोड़ा:
--- import { languageTag } from '../paraglide/runtime'; const pathName = Astro.url.pathname.replace(`/${languageTag()}/`, ''); ---
इसके अतिरिक्त, हम पैराग्लाइड संदेश फ़ंक्शन में दूसरे पैरामीटर का उपयोग करके, इन संदेशों का अनुवाद भी कर सकते हैं:
मैं अपने समाधान को सर्वश्रेष्ठ नहीं मानता, खासकर जब से मैं अभी भी एस्ट्रो सीख रहा हूं, इसलिए अन्य समाधान भी हो सकते हैं। यदि आप किसी के बारे में जानते हैं, तो कृपया टिप्पणी करें, और मैं उन्हें आज़माऊंगा :)
इस लेख को पढ़ने के लिए धन्यवाद! यदि आपके कोई प्रश्न हैं, तो कृपया टिप्पणी करें, मुझे उत्तर देने में खुशी होगी।
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3