t() कॉल और बहुवचन
स्रोत कोड में t() का उपयोग करना
t() को एक शाब्दिक स्ट्रिंग के साथ कॉल करें ताकि एक्सट्रैक्ट स्क्रिप्ट इसे ढूंढ सके:
import { useTranslation } from 'react-i18next';
function MyComponent() {
const { t } = useTranslation();
return <button>{t('Save')}</button>;
}वही पैटर्न React (Node.js, सर्वर घटक, CLI) के बाहर भी काम करता है:
import i18n from './i18n.js';
console.log(i18n.t('Processing complete'));नियम:
- केवल ये फ़ॉर्म निकाले जाते हैं:
t("…"),t('…'),t(…),i18n.t("…")। - कुंजी एक शाब्दिक स्ट्रिंग होनी चाहिए — कुंजी के रूप में कोई चर या एक्सप्रेशन नहीं।
- कुंजी के लिए टेम्पलेट लिटरल का उपयोग न करें:
{'t(निकालने योग्य नहीं है।Hello ${name})'}
इंटरपोलेशन
{{var}} प्लेसहोल्डर के लिए i18next के मूल दूसरे-आर्गुमेंट इंटरपोलेशन का उपयोग करें:
// i18next handles substitution natively, even in key-as-default mode
t('Hello {{name}}, you have {{count}} messages', { name, count })
// → "Hello Alice, you have 3 messages"एक्सट्रैक्ट कमांड दूसरे आर्गुमेंट को पार्स करता है जब यह एक सादा ऑब्जेक्ट लिटरल होता है और टूलिंग-ओनली फ़्लैग जैसे plurals: true और zeroDigit को पढ़ता है (नीचे कार्डिनल बहुवचन देखें)। सामान्य स्ट्रिंग के लिए, हैशिंग के लिए केवल शाब्दिक कुंजी का उपयोग किया जाता है; इंटरपोलेशन विकल्प रनटाइम पर i18next को पास किए जाते हैं।
यदि आपका प्रोजेक्ट एक कस्टम इंटरपोलेशन यूटिलिटी का उपयोग करता है (उदाहरण के लिए t('key') को कॉल करना फिर परिणाम को interpolateTemplate(t('Hello {{name}}'), { name }) जैसे टेम्पलेट फ़ंक्शन के माध्यम से पाइप करना), तो setupKeyAsDefaultT (wrapI18nWithKeyTrim के माध्यम से) इसे अनावश्यक बनाता है — यह {{var}} इंटरपोलेशन लागू करता है, भले ही स्रोत लोकेल कच्ची कुंजी लौटाता हो। कॉल साइट्स को t('Hello {{name}}', { name }) में माइग्रेट करें और कस्टम यूटिलिटी को हटा दें।
कार्डिनल बहुवचन (plurals: true)
आप बहुवचन रूप हाथ से नहीं लिखते हैं। स्रोत कोड में, संदेश को एक बार लिखें और दूसरे आर्गुमेंट में दो चीजें पास करें:
plurals: true— एक्सट्रैक्ट औरtranslate-uiको बताता है कि यह कॉल एक कार्डिनल बहुवचन समूह है।count— वह संख्या जिसका उपयोग i18next रनटाइम पर सही फ़ॉर्म चुनने के लिए करता है।
{t('{{count}} items in your cart', { plurals: true, count: n })}कॉल साइट पर आपको बस इतना ही चाहिए। आप _zero, _one, _other, या किसी अन्य प्रत्यय कुंजी को स्वयं परिभाषित नहीं करते हैं।
जब आप translate-ui चलाते हैं, तो ai-i18n-tools एक LLM को कॉल करता है ताकि प्रत्येक लक्ष्य लोकेल के लिए प्रत्येक आवश्यक कार्डिनल श्रेणी उत्पन्न की जा सके (zero, one, two, few, many, other — जो भी Intl.PluralRules उस भाषा के लिए आवश्यक है)। मॉडल आपकी मूल शाब्दिक और स्रोत-भाषा बहुवचन वेरिएंट प्राप्त करता है, फिर अनुवादित फ़ॉर्म लौटाता है। टूलिंग उन्हें strings.json में लिखता है और फ्लैट i18next JSON (<groupId>_zero, <groupId>_one, …) उत्सर्जित करता है ताकि रनटाइम बहुवचन रिज़ॉल्यूशन आपकी तरफ से अतिरिक्त सेटअप के बिना काम करे।
zeroDigit(वैकल्पिक) — केवल टूलिंग के लिए; i18next द्वारा नहीं पढ़ा जाता है। जबtrue, LLM प्रॉम्प्ट प्रत्येक लोकेल के लिए_zeroस्ट्रिंग में एक शाब्दिक अरबी0को प्राथमिकता देता है जहां वह फ़ॉर्म मौजूद है; जबfalseया छोड़ा जाता है, तो प्राकृतिक शून्य वाक्यांश का उपयोग किया जाता है।i18next.tको कॉल करने से पहले इन कुंजियों को हटा दें (नीचेwrapTदेखें)।
मान्यता: यदि संदेश में दो या अधिक अलग-अलग {{…}} प्लेसहोल्डर हैं, तो उनमें से एक {{count}} (बहुवचन अक्ष) होना चाहिए। अन्यथा extract एक स्पष्ट फ़ाइल/लाइन संदेश के साथ विफल हो जाता है।
दो स्वतंत्र गणनाएँ (जैसे अनुभाग और पृष्ठ) एक बहुवचन संदेश साझा नहीं कर सकते हैं — दो t() कॉल (प्रत्येक plurals: true और अपनी count के साथ) का उपयोग करें और UI में संयोजित करें।
v1 में नहीं: क्रमवाचक बहुवचन (_ordinal_*, ordinal: true), अंतराल बहुवचन, ICU-केवल पाइपलाइन।
बहुवचन कैसे संग्रहीत और उत्सर्जित होते हैं
में strings.json बहुवचन समूह "plural": true के साथ प्रति हैश एक पंक्ति का उपयोग करते हैं, source में मूल शाब्दिक, और translated[locale] उस स्थानीय के लिए कार्डिनल श्रेणियों (zero, one, two, few, many, other) को स्ट्रिंग में मैप करने वाली एक वस्तु के रूप में।
फ्लैट स्थानीय JSON: गैर-बहुवचन पंक्तियाँ स्रोत वाक्य → अनुवाद रहती हैं। बहुवचन पंक्तियाँ <groupId>_original (संदर्भ के लिए source के बराबर) और प्रत्येक प्रत्यय के लिए <groupId>_<form> के रूप में उत्सर्जित होती हैं ताकि i18next बहुवचन को मूल रूप से हल कर सके। translate-ui में {sourceLocale}.json भी लिखा जाता है जिसमें केवल बहुवचन फ्लैट कुंजियाँ होती हैं (स्रोत भाषा के लिए इस बंडल को लोड करें ताकि प्रत्ययित कुंजियाँ हल हो सकें; सादे स्ट्रिंग अभी भी कुंजी-के-रूप-में-डिफ़ॉल्ट का उपयोग करती हैं)। प्रत्येक लक्ष्य स्थानीय के लिए, उत्सर्जित प्रत्यय कुंजियाँ उस स्थानीय के लिए Intl.PluralRules से मेल खाती हैं (requiredCldrPluralForms): यदि strings.json ने संपीड़न के बाद किसी अन्य से मेल खाने के कारण एक श्रेणी को छोड़ दिया (उदाहरण के लिए अरबी many other के समान), तो translate-ui अभी भी एक फ़ॉलबैक सिबलिंग स्ट्रिंग से कॉपी करके फ्लैट फ़ाइल में प्रत्येक आवश्यक प्रत्यय लिखता है ताकि रनटाइम लुकअप कभी भी कुंजी को न छोड़े।
रनटाइम (ai-i18n-tools/runtime): कॉल setupKeyAsDefaultT(i18n, { stringsJson, sourcePluralFlatBundle }) — यह wrapI18nWithKeyTrim चलाता है, वैकल्पिक translate-ui {sourceLocale}.json बहुवचन बंडल को पंजीकृत करता है, फिर buildPluralIndexFromStringsJson(stringsJson) का उपयोग करके wrapT। wrapT plurals / zeroDigit को हटाता है, आवश्यकता पड़ने पर कुंजी को समूह आईडी में फिर से लिखता है, और count को अग्रेषित करता है (वैकल्पिक: यदि एक एकल गैर-{{count}} प्लेसहोल्डर है, तो count उस संख्यात्मक विकल्प से कॉपी किया जाता है)। वायर i18next और रनटाइम हेल्पर देखें।