Skip to main content

React अंतरराष्ट्रीयकरण की संपूर्ण गाइड

शुरुआत से बहुभाषी ऐप तक: अपने React ऐप में i18n सेट अप करें और फिर AI से अनुवाद स्वचालित करें।

1

पैकेज इंस्टॉल करें

आपको तीन पैकेज चाहिए: react-i18next (React बाइंडिंग), i18next (मुख्य लाइब्रेरी) और स्वचालित लोकेल पहचान के लिए वैकल्पिक रूप से i18next-browser-languagedetector।

react-i18next React हुक और कंपोनेंट प्रदान करता है। i18next वह मुख्य इंजन है जो अनुवाद लोड करने, इंटरपोलेशन और बहुवचन को संभालता है। लैंग्वेज डिटेक्टर प्लगइन ब्राउज़र की भाषा वरीयता को अपने-आप पढ़ता है।
Terminal
npm install react-i18next i18next i18next-browser-languagedetector i18next-http-backend
2

i18n इंस्टेंस कॉन्फ़िगर करें

एक i18n कॉन्फ़िगरेशन फ़ाइल बनाएँ, जो आपकी डिफ़ॉल्ट भाषा, अनुवाद संसाधनों और प्लगइन शृंखला के साथ i18next को इनिशियलाइज़ करे। किसी भी कंपोनेंट के रेंडर होने से पहले इस फ़ाइल को आपके ऐप के एंट्री पॉइंट पर इंपोर्ट करना आवश्यक है।

src/i18n.ts
import i18n from 'i18next';
import { initReactI18next } from 'react-i18next';
import LanguageDetector from 'i18next-browser-languagedetector';
import Backend from 'i18next-http-backend';

i18n
  .use(Backend)
  .use(LanguageDetector)
  .use(initReactI18next)  // Must come before .init()
  .init({
    fallbackLng: 'en',
    debug: process.env.NODE_ENV === 'development',
    interpolation: {
      escapeValue: false,  // React already escapes
    },
    backend: {
      loadPath: '/locales/{{lng}}/{{ns}}.json',
    },
  });

export default i18n;
"You will need to pass in an i18next instance by using initReactI18next" — इस त्रुटि का अर्थ है कि आप i18n.init() से पहले i18n.use(initReactI18next) कॉल करना भूल गए। .use() कॉल को .init() से पहले रखना आवश्यक है।
3

अपने ऐप को I18nextProvider में रैप करें

ऐप के रूट पर अपनी i18n कॉन्फ़िगरेशन फ़ाइल इंपोर्ट करें और अपनी कंपोनेंट ट्री को I18nextProvider में रैप करें। इसके बिना useTranslation() अनुवादित टेक्स्ट के बजाय मूल कुंजियाँ लौटाता है।

src/main.tsx
import React, { Suspense } from 'react';
import ReactDOM from 'react-dom/client';
import { I18nextProvider } from 'react-i18next';
import i18n from './i18n';  // Import your config
import App from './App';

ReactDOM.createRoot(document.getElementById('root')!).render(
  <React.StrictMode>
    <Suspense fallback={<div>Loading...</div>}>
      <I18nextProvider i18n={i18n}>
        <App />
      </I18nextProvider>
    </Suspense>
  </React.StrictMode>
);
यदि अनुवादों में "Welcome to our app" के बजाय "welcome" जैसी मूल कुंजियाँ दिखाई देती हैं, तो सबसे आम कारण I18nextProvider का न होना या i18n कॉन्फ़िगरेशन फ़ाइल का इंपोर्ट न किया जाना है।
4

अनुवाद फ़ाइलें बनाएँ

प्रत्येक भाषा के लिए एक JSON फ़ाइल बनाएँ। स्ट्रिंग्स को सुविधा या पेज के अनुसार व्यवस्थित करने के लिए नेस्टेड कुंजियों का उपयोग करें। अपनी स्रोत भाषा (आमतौर पर अंग्रेज़ी) को सत्य का एकमात्र स्रोत बनाए रखें।

public/locales/en/translation.json
// public/locales/en/translation.json
{
  "nav": {
    "home": "Home",
    "about": "About",
    "settings": "Settings"
  },
  "greeting": "Hello, {{name}}!",
  "cart": {
    "itemCount_one": "{{count}} item",
    "itemCount_other": "{{count}} items"
  }
}

// public/locales/de/translation.json
{
  "nav": {
    "home": "Startseite",
    "about": "Über uns",
    "settings": "Einstellungen"
  },
  "greeting": "Hallo, {{name}}!",
  "cart": {
    "itemCount_one": "{{count}} Artikel",
    "itemCount_other": "{{count}} Artikel"
  }
}
कुंजियों के नाम उनके स्थान के बजाय उनके अर्थ के अनुसार रखें: "homepageCartLabel" की तुलना में "cart.itemCount" बेहतर है। UI का डिज़ाइन बदलने के बाद भी कुंजियाँ उपयोगी रहनी चाहिए।
5

कंपोनेंट में अनुवादों का उपयोग करें

t() फ़ंक्शन पाने के लिए किसी भी कंपोनेंट में useTranslation() कॉल करें। इसका उपयोग साधारण स्ट्रिंग्स, इंटरपोलेटेड वेरिएबल और Trans कंपोनेंट के साथ JSX में एम्बेड किए गए अनुवादों के लिए करें।

Greeting.tsx
import { useTranslation } from 'react-i18next';

function Greeting({ userName }: { userName: string }) {
  const { t } = useTranslation();

  return (
    <div>
      <h1>{t('greeting', { name: userName })}</h1>
      <nav>
        <a href="/">{t('nav.home')}</a>
        <a href="/about">{t('nav.about')}</a>
      </nav>
    </div>
  );
}
Trans component for JSX
import { Trans, useTranslation } from 'react-i18next';

// For JSX inside translations:
// "terms": "By signing up, you agree to our <link>Terms</link>."

function SignUp() {
  const { t } = useTranslation();
  return (
    <Trans i18nKey="terms" components={{
      link: <a href="/terms" className="underline" />
    }} />
  );
}
t(`error.$'{code}'`) जैसी डायनेमिक कुंजियाँ रनटाइम पर काम करती हैं, लेकिन i18next-scanner जैसे टूल उन्हें स्टैटिक रूप से एक्सट्रैक्ट नहीं कर सकते। यदि आप एक्सट्रैक्शन टूल का उपयोग करते हैं, तो डायनेमिक कुंजियों को स्पष्ट रूप से सूचीबद्ध करें या कमेंट हिंट का उपयोग करें।
6

बहुवचन और वेरिएबल संभालें

i18next केवल एकवचन/बहुवचन के आधार पर नहीं, बल्कि CLDR नियमों के अनुसार बहुवचन संभालता है। अरबी में 6 रूप (zero, one, two, few, many, other), जबकि जापानी में 1 (other) रूप होता है। अपनी अनुवाद फ़ाइलों में सभी आवश्यक रूप परिभाषित करें; i18next अपने-आप सही रूप चुन लेता है।

Plural forms by language
// English: 2 forms (one, other)
{
  "itemCount_one": "{{count}} item",
  "itemCount_other": "{{count}} items"
}

// Arabic: 6 forms (zero, one, two, few, many, other)
{
  "itemCount_zero": "لا عناصر",
  "itemCount_one": "عنصر واحد",
  "itemCount_two": "عنصران",
  "itemCount_few": "{{count}} عناصر",
  "itemCount_many": "{{count}} عنصرًا",
  "itemCount_other": "{{count}} عنصر"
}

// Japanese: 1 form (other)
{
  "itemCount_other": "{{count}}個のアイテム"
}
एकवचन पहचानने के लिए count === 1 को कभी हार्डकोड न करें। फ़्रेंच जैसी भाषाएँ 0 को एकवचन मानती हैं। रूसी, अरबी और पोलिश में ऐसे रूप हैं जो अंग्रेज़ी में नहीं होते। बहुवचन नियम i18next को संभालने दें।
7

भाषा बदलने और पहचानने की सुविधा जोड़ें

ऐसा भाषा चयनकर्ता बनाएँ जो i18n.changeLanguage() कॉल करे। पहली बार आने पर यूज़र की पसंदीदा भाषा अपने-आप पहचानने के लिए इसे ब्राउज़र लैंग्वेज डिटेक्टर के साथ जोड़ें और फिर यूज़र की स्पष्ट पसंद को सहेजें।

LanguageSwitcher.tsx
import { useTranslation } from 'react-i18next';

const LANGUAGES = [
  { code: 'en', label: 'English' },
  { code: 'de', label: 'Deutsch' },
  { code: 'ja', label: '日本語' },
  { code: 'es', label: 'Español' },
];

function LanguageSwitcher() {
  const { i18n } = useTranslation();

  return (
    <select
      value={i18n.language}
      onChange={(e) => i18n.changeLanguage(e.target.value)}
    >
      {LANGUAGES.map(({ code, label }) => (
        <option key={code} value={code}>{label}</option>
      ))}
    </select>
  );
}
यदि आप SSR (Next.js, Remix) का उपयोग करते हैं, तो सर्वर क्लाइंट से अलग भाषा पहचान सकता है, क्योंकि सर्वर के पास ब्राउज़र की वरीयताएँ नहीं होतीं। इससे हाइड्रेशन मिसमैच होता है। समाधान: पहचाना गया लोकेल सर्वर से क्लाइंट को prop या cookie के रूप में भेजें, ताकि दोनों समान भाषा में रेंडर करें।
8

अनुवाद स्वचालित करें

i18n सेटअप पूरा होने के बाद AI से अपनी लोकेल फ़ाइलों का अनुवाद करें। अपने IDE में AI सहायक से स्रोत फ़ाइल का अनुवाद करने के लिए कहें या अपनी CI/CD पाइपलाइन में i18n Agent CLI का उपयोग करें।

Terminal
# In your IDE, ask your AI assistant:
> Translate public/locales/en/translation.json to German, Japanese, and Spanish

✓ de/translation.json created (1.2s)
✓ ja/translation.json created (1.5s)
✓ es/translation.json created (1.1s)

# Or use the CLI in CI/CD:
npx i18n-agent translate public/locales/en/translation.json --lang de,ja,es
अनुवाद क्रमिक रूप से करें—स्रोत फ़ाइल में नई कुंजियाँ जोड़ने पर सभी फ़ाइलें दोबारा बनाने के बजाय केवल diff का अनुवाद करें। इससे मानव द्वारा समीक्षित अनुवाद सुरक्षित रहते हैं।

अनुवाद की गुणवत्ता स्वचालित रूप से जाँचें

i18n-validate की मदद से रिलीज़ से पहले अनुपलब्ध कुंजियाँ और खराब प्लेसहोल्डर पकड़ें। वास्तविक अनुवाद आने से पहले i18n-pseudo से नकली अनुवादों का उपयोग करके अपने UI की जाँच करें।

आम समस्याएँ

अनुवादों में मूल कुंजियाँ दिखाई देना

कारण: I18nextProvider अनुपलब्ध है, ऐप के रूट पर i18n कॉन्फ़िगरेशन इंपोर्ट नहीं किया गया, नेमस्पेस लोड नहीं हुआ या अनुवाद अभी एसिंक्रोनस रूप से लोड हो रहे हैं। संकेतों के लिए debug: true के साथ ब्राउज़र कंसोल जाँचें।

फ़ॉलबैक के बिना Suspense त्रुटि

"A component suspended while responding to synchronous input" — अपने ऐप के चारों ओर '&lt;Suspense&gt;' बाउंड्री जोड़ें या i18next init कॉन्फ़िगरेशन में useSuspense: false सेट करें।

SSR हाइड्रेशन मिसमैच

सर्वर एक लोकेल में रेंडर करता है और क्लाइंट दूसरे लोकेल में हाइड्रेट करता है। सुनिश्चित करें कि दोनों समान लोकेल स्रोत का उपयोग करें—इसे सर्वर से prop के रूप में भेजें और केवल ब्राउज़र की पहचान पर निर्भर न रहें।

अनुवाद कुंजियों के लिए ऑटोकंप्लीट उपलब्ध न होना

अपने रिसोर्स टाइप के साथ i18next मॉड्यूल को विस्तारित करें: declare module 'i18next' '{ interface CustomTypeOptions { resources: typeof resources } }'. इससे आपको ऑटोकंप्लीट के साथ टाइप-सुरक्षित t() कॉल मिलते हैं।

सुझाई गई फ़ाइल संरचना

Project Structure
my-react-app/
├── public/
│   └── locales/
│       ├── en/
│       │   ├── translation.json    # Default namespace
│       │   ├── common.json         # Shared strings
│       │   └── dashboard.json      # Feature namespace
│       ├── de/
│       │   ├── translation.json
│       │   ├── common.json
│       │   └── dashboard.json
│       └── ja/
│           └── ...
├── src/
│   ├── i18n.ts                     # i18n configuration
│   ├── main.tsx                    # App entry with Provider
│   ├── App.tsx
│   └── components/
│       └── LanguageSwitcher.tsx
└── package.json

i18n Agent अभी आज़माएँ

अपनी अनुवाद फ़ाइल यहाँ छोड़ें

JSON, YAML, PO, XML, CSV, Markdown, Properties

या ब्राउज़ करने के लिए क्लिक करें

लक्षित भाषाएँ

साइन अप की ज़रूरत नहींतुरंत अनुमान

अक्सर पूछे जाने वाले प्रश्न