लिंग अनुकूलन
कुछ भाषाओं में क्रियाओं और विशेषणों का रूप उस व्यक्ति के लिंग के अनुसार बदलता है जिसके बारे में वाक्य है। अंग्रेज़ी में ज़्यादातर ऐसा नहीं होता, इसलिए जो वाक्यांश आप {username} has been invited के रूप में लिखते हैं, वह अंग्रेज़ी में एक वाक्य है और स्पेनिश, फ़्रेंच या रूसी में दो या तीन। Langsys यह अनुवाद के दौरान संभाल लेता है — ठीक वैसे ही जैसे वह बहुवचन रूप बनाता है — और आपको बस एक आर्ग्युमेंट पास करना होता है।
पाइपलाइन क्या तैयार करती है
जब किसी लक्षित भाषा में लिंग-वचन आदि का मेल ज़रूरी होता है, तो Langsys उस लोकेल की स्ट्रिंग को ज़रूरी शाखाओं में फिर से लिख देता है — यानी ICU select में। आपका स्रोत फ़्रेज़ कभी नहीं बदलता, और शाखाएँ आपको हाथ से कभी नहीं लिखनी पड़तीं।
// Your source phrase, unchanged:
"{username} has been invited"
// What the Spanish translation becomes — note invitado / invitada:
"{username_gender, select, male {{username} ha sido invitado} \
female {{username} ha sido invitada} \
other {{username} ha sido invitado/a}}" दो नतीजे अच्छी तरह समझ लेने लायक हैं। आर्ग्युमेंट का नाम उस वेरिएबल के नाम में _gender जोड़कर बनता है जिसके साथ वह बदलता है — {username} से आपको username_gender मिलता है — और ब्रांच हमेशा male, female, other ही होती हैं। और यह सिर्फ़ उन्हीं लोकेल में दिखता है जिन्हें इसकी ज़रूरत है: जब तक कोई ऐप को लिंग-भेद वाली भाषा में लोड नहीं करता, यह नज़र नहीं आता।
इसे पास करना
जब भी आपको आर्ग्यूमेंट पता हो, उसे पास करें, और पाठक को सही रूप में ढला हुआ वाक्य मिलता है:
// The argument is named after the variable it inflects, + _gender.
// Branches are always male / female / other.
t('{username} has been invited', 'Team', {
username: user.name,
username_gender: user.gender ?? 'other',
}); लिंग पता नहीं है? 'other' को स्पष्ट रूप से पास करें — यह तटस्थ शाखा है। कोई आर्गुमेंट न होने पर क्या रेंडर होता है, यह SDK के अनुसार अलग होता है; हर SDK पेज इसे बताता है। हर SDK पेज कॉल को अपने ही अंदाज़ में भी दिखाता है।
किन वाक्यांशों को इसकी ज़रूरत है?
यह आप अपने कोड से नहीं बता सकते, और यह इसकी प्रकृति में ही है: आर्ग्युमेंट अनुवाद के दौरान, प्रत्येक लक्ष्य लोकेल के अनुसार जोड़ा जाता है, इसलिए सोर्स फ़्रेज़ या आपके कोडबेस में इसका कोई संकेत नहीं होता। पता लगाने के तीन तरीके हैं।
कैटलॉग पढ़ें। आपका ऐप जो अनुवाद फ़ेच करता है, वे प्रमोट की गई स्ट्रिंग ही होते हैं, इसलिए जवाब क्लाइंट पर पहले से मौजूद है। अपने समर्थित किसी भी लोकेल का कैटलॉग खींचें — हर SDK यह सुविधा देता है — और , select, वाली प्रविष्टियाँ खोजें। इससे आपको सटीक वाक्यांश और आर्गुमेंट के नाम मिल जाते हैं, और इसे अपने हर शिप किए जाने वाले लोकेल के लिए CI में चलाना भी काफ़ी सस्ता है।
// The catalog your app fetches IS the promoted strings — grep it.
const wanting = Object.entries(catalog)
.filter(([, translation]) => translation.includes(', select,'))
.map(([phrase]) => phrase);
// → every phrase (and, from the string, every argument) this locale needs डीबग चालू करें (JavaScript SDK)। अपने इनिट कॉन्फ़िग में debug: true दें और ऐप को लिंग-आधारित लोकेल में ब्राउज़ करें: जिस भी फ़्रेज़ के अनुवाद को ऐसा आर्ग्युमेंट चाहिए जो आपने नहीं दिया, उसके लिए SDK आर्ग्युमेंट का नाम बताते हुए एक Langsys Warning लॉग करता है। यह प्रति फ़्रेज़ प्रति लोकेल एक बार होता है, और प्रोडक्शन में शांत रहता है। एक पेच है: कंटेंट-ब्लॉक और फ़्रेज़ कंपोनेंट के अंदर, सावधानी के तौर पर पास किया गया _gender खुद ही बेमेल पैरामीटर के रूप में रिपोर्ट होता है, क्योंकि यह जाँच आपके स्रोत टेक्स्ट पर चलती है — जहाँ select कभी दिखता ही नहीं।
संदेह हो तो इसे पास कर दें। जिस आर्ग्यूमेंट का स्ट्रिंग में कोई स्थान ही नहीं है, उसका मान रेंडर के समय अनदेखा कर दिया जाता है, इसलिए व्यक्ति से जुड़े हर वेरिएबल के लिए _gender भेजना सुरक्षित है और उन लोकेल को भी कवर करता है जिन्हें आपने अभी तक देखा नहीं है।
हर वाक्यांश में एक ही वेरिएबल। केवल एक वेरिएबल ही मेल (एग्रीमेंट) तय कर सकता है। जिस स्ट्रिंग में दो वेरिएबल हों — एक गिनती और एक लिंग — उसे नेस्टेड ICU में बदलने के बजाय जस का तस छोड़ दिया जाता है, इसलिए उसका अनुवाद एक सपाट वाक्य के रूप में होता है।