Skip to content

t() कॉल और बहुवचन ​

स्रोत कोड में t() का उपयोग करना ​

t() को एक शाब्दिक स्ट्रिंग के साथ कॉल करें ताकि एक्सट्रैक्ट स्क्रिप्ट उसे ढूंढ सके:

jsx
import { useTranslation } from 'react-i18next';

function MyComponent() {
  const { t } = useTranslation();
  return <button>{t('Save')}</button>;
}

वही पैटर्न रिएक्ट (Node.js, सर्वर कंपोनेंट्स, CLI) के बाहर भी काम करता है:

js
import i18n from './i18n.js';
console.log(i18n.t('Processing complete'));

नियम:

  • केवल ये फ़ॉर्म निकाले जाते हैं: t("…"), t('…'), t(…), i18n.t("…")।
  • कुंजी एक शाब्दिक स्ट्रिंग होनी चाहिए — कुंजी के रूप में कोई चर या एक्सप्रेशन नहीं।
  • कुंजी के लिए टेम्पलेट लिटरल का उपयोग न करें: {'t(Hello ${name})'} निकालने योग्य नहीं है।

इंटरपोलेशन ​

{{var}} प्लेसहोल्डर्स के लिए i18next के मूल दूसरे-तर्क इंटरपोलेशन का उपयोग करें:

js
// 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) ​

आप बहुवचन रूप हाथ से नहीं लिखते हैं। स्रोत कोड में, संदेश एक बार लिखें और दूसरे तर्क में दो चीजें पास करें:

  1. plurals: true — एक्सट्रैक्ट और translate-ui को बताता है कि यह कॉल एक कार्डिनल बहुवचन समूह है।
  2. count — वह संख्या जिसका उपयोग i18next रनटाइम पर सही रूप चुनने के लिए करता है।
tsx
{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 एक स्पष्ट फ़ाइल/लाइन संदेश के साथ विफल हो जाता है।

LLM द्वारा CLDR फ़ॉर्म लौटाने के बाद, translate-ui प्रत्येक फ़ॉर्म को मूल डेवलपर शाब्दिक के विरुद्ध भी जांचता है: प्रत्येक स्रोत प्लेसहोल्डर प्रत्येक श्रेणी में (one सहित) दिखाई देना चाहिए, फ़ॉर्म को नए {{…}} / %d / {n} टोकन का आविष्कार नहीं करना चाहिए, और केवल संज्ञा वाले स्रोत (कोई {{count}} और कोई अंक नहीं, जैसे Minutes जैसी इकाई लेबल) केवल संज्ञा वाले रहने चाहिए। बेमेल होने पर उस मॉडल का जवाब छोड़ दिया जाता है और फ़ॉलबैक सूची में अगले मॉडल को फिर से आज़माया जाता है।

दो स्वतंत्र गणनाएँ (उदाहरण के लिए अनुभाग और पृष्ठ) एक बहुवचन संदेश साझा नहीं कर सकती हैं — दो 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 को वायर करें और रनटाइम हेल्पर देखें।

MIT लाइसेंस के तहत जारी किया गया।