अपने प्रश्न को पूछें और दस्तावेज़ का सारांश प्राप्त करें, इस पृष्ठ और आपके चुने हुए AI प्रदाता का उपयोग करके
इस पृष्ठ की सामग्री एक AI द्वारा अनुवादित की गई है।
अंग्रेजी में मूल सामग्री के अंतिम संस्करण देखेंIf you have an idea for improving this documentation, please feel free to contribute by submitting a pull request on GitHub.
GitHub link to the documentationCopy doc Markdown to clipboard
नया Intlayer v9 - क्या नया है?
Intlayer v9 में आपका स्वागत है! यह मेजर रिलीज़ प्रमुख i18n लाइब्रेरीज़ (react-i18next, next-intl, vue-i18n, आदि) के लिए Compat Adapter Packages के साथ Intlayer पर माइग्रेशन की राह को आसान बनाने में एक बड़ा मील का पत्थर है, और यह रिच कंटेंट स्ट्रक्चर्स: Collections और Variants के लिए सपोर्ट जोड़ता है।
विषय-सूची
Compat Adapter Packages
लोकप्रिय i18n लाइब्रेरीज़ से Intlayer पर माइग्रेट करना अब पहले से कहीं अधिक आसान है। हमने पांच compat पैकेजेस बनाए हैं जो स्टैंडर्ड i18n लाइब्रेरीज़ के समान exact same public APIs को एक्सपोज़ करते हैं, लेकिन रनटाइम (runtime) पर सभी ट्रांसलेशन वर्क को Intlayer को सौंप (delegate) देते हैं।
Strict Typing के साथ समान Public API एक्सपोज़ करें
इंपोर्ट्स (imports) को बदलकर, आप न्यूनतम कोड परिवर्तनों के साथ Intlayer के सभी लाभ (आपके वास्तविक डिक्शनरीज़ के खिलाफ कंपाइल-टाइम टाइप सेफ्टी सहित) प्राप्त कर सकते हैं:
@intlayer/i18next@intlayer/react-i18next@intlayer/next-intl@intlayer/react-intl@intlayer/next-i18next@intlayer/vue-i18n@intlayer/lingui
उदाहरण के लिए, बस इसे बदलें:
कोड को क्लिपबोर्ड पर कॉपी करें
import { useTranslation } from "react-i18next";इसमें:
कोड को क्लिपबोर्ड पर कॉपी करें
import { useTranslation } from "@intlayer/react-i18next";आपके कीज़ (keys) अब आपके Intlayer डिक्शनरीज़ के खिलाफ strictly typed होंगे, जो आपके IDE में पूर्ण dot-path ऑटो-कम्प्लीशन प्रदान करेंगे!
Bundler Alias Plugins (Vite, Next.js, Turbopack)
बिना अपने सभी इंपोर्ट स्टेटमेंट्स को मैन्युअल रूप से दोबारा लिखे माइग्रेट करने की अनुमति देने के लिए, प्रत्येक compat एडाप्टर पैकेज में /plugin सबपाथ के तहत एक custom bundler plugin (Vite या Next.js) शामिल है।
ये प्लगइन्स बिल्ड टाइम (build time) पर मौजूदा इंपोर्ट्स (जैसे react-i18next या next-intl) को उनके @intlayer/* समकक्षों में स्वचालित रूप से रीराइट (rewrite) कर देते हैं।
Next.js (Webpack / Turbopack) का उदाहरण
withIntlayer के बजाय, अपने Next.js कॉन्फ़िगरेशन को compat प्लगइन के साथ रैप करें:
कोड को क्लिपबोर्ड पर कॉपी करें
import { createNextI18nPlugin } from "@intlayer/next-i18next/plugin";import type { NextConfig } from "next";const withIntlayer = createNextI18nPlugin();const nextConfig: NextConfig = {};export default withIntlayer(nextConfig);Vite (React, Vue, Solid, Svelte) का उदाहरण
कोड को क्लिपबोर्ड पर कॉपी करें
import vueI18nVitePlugin from "@intlayer/vue-i18n/plugin";export default defineConfig({ plugins: [vueI18nVitePlugin()],});Mutualized Runtime Resolver
सभी compat एडाप्टर्स अब ट्रांसलेशन रिज़ॉल्यूशन को एक सिंगल, अत्यधिक ऑप्टिमाइज़्ड रनटाइम पार्सर के माध्यम से रूट करते हैं: @intlayer/core/messageFormat।
- Interpolate Message: यह स्टैंडर्ड
{{var}}(whitespace और dot-paths), ICU फॉर्मेटेड आर्ग्युमेंट्स ({v, number, percent}आदि), और बेयर{var}टेम्पलेट्स को रिज़ॉल्व करता है। - Message Node Resolver: यह नेस्टेड नोड्स को रिज़ॉल्व करता है:
insert(),plural()(CLDR plural rules),enu()(enumeration),gender(), HTML टैग्स, एरेज़ (arrays), और कॉलेबल फ़ंक्शन नोड्स। - Tokenized Tag Parser: यह आउट-ऑफ-द-बॉक्स रिच-टेक्स्ट रेंडरिंग को सक्षम करने के लिए इनलाइन XML/HTML टैग्स और नम्बर्ड टैग्स (जैसे,
<1>children</1>) का समर्थन करता है।
Feature Spec: Collections & Variants
Intlayer v9 स्टैटिक की-वैल्यू ऑब्जेक्ट्स से आगे बढ़कर डिक्शनरीज़ को डायनेमिक लेआउट स्ट्रक्चर्स घोषित करने की अनुमति देता है जो एंड-टू-एंड पूरी तरह से टाइप्ड (typed) होते हैं।
1. Collections
ऑर्डर किए गए आइटम्स की एक CMS-मैनेज्ड सूची परिभाषित करें (जैसे FAQs, प्रोडक्ट्स, या ब्लॉग लिस्ट्स):
कोड को क्लिपबोर्ड पर कॉपी करें
import { t, type Dictionary } from "intlayer";export default { key: "faq", item: 1, content: { question: t({ en: "What is Intlayer?", fr: "Qu'est-ce qu'Intlayer ?" }), answer: t({ en: "An i18n toolkit.", fr: "Une boîte à outils i18n." }), },} satisfies Dictionary;कोड को क्लिपबोर्ड पर कॉपी करें
import { t, type Dictionary } from "intlayer";export default { key: "faq", item: 2, content: { question: t({ en: "Is it free?", fr: "Est-ce gratuit ?" }), answer: t({ en: "Yes, open-source.", fr: "Oui, open-source." }), },} satisfies Dictionary;उपयोग:
कोड को क्लिपबोर्ड पर कॉपी करें
// Fetch all items as an arrayconst allFaqs = useIntlayer("faq"); // -> { question: string, answer: string }[]// Fetch a single item by indexconst faq = useIntlayer("faq", { item: 2 }); // -> { question: string, answer: string }2. Variants
A/B टेस्ट्स, सीज़नल हेडर्स, फ़ीचर फ़्लैग्स, या कस्टम लैंडिंग पेजेस डिलीवर करें:
स्ट्रिंग वेरिएंट (उदा. A/B टेस्टिंग)
कोड को क्लिपबोर्ड पर कॉपी करें
import { t, type Dictionary } from "intlayer";export default { key: "hero-banner", variant: "default", content: { control: t({ hi: "स्वागत है", en: "Welcome", fr: "Bienvenue" }), black_friday: t({ hi: "अभी खरीदें", en: "Shop now", fr: "Acheter maintenant", }), },} satisfies Dictionary;उपयोग:
कोड को क्लिपबोर्ड पर कॉपी करें
const banner = useIntlayer("hero-banner", { variant: "black_friday" });ऑब्जेक्ट वेरिएंट (उदा. डायनेमिक रिकॉर्ड्स)
कोड को क्लिपबोर्ड पर कॉपी करें
import { t, type Dictionary } from "intlayer";export default { key: "product-copy", variant: { id: "prod_123", category: "books", }, content: { title: t({ hi: "क्लीन कोड", en: "Clean Code", fr: "Code Propre" }), },} satisfies Dictionary;उपयोग:
कोड को क्लिपबोर्ड पर कॉपी करें
// केवल अनुरोधित आइटम को डायनेमिक रूप से फ़ेच करता है (Suspense की आवश्यकता है)const product = useIntlayer("product-copy", { variant: { id: "prod_123", category: "books" },});Vite Plugin: बंडल्ड Compiler & Proxy
intlayer() Vite plugin अब compiler और locale-routing proxy को सीधे बंडल करता है, इसलिए अधिकांश projects को vite.config.ts में केवल एक ही plugin की आवश्यकता है:
कोड को क्लिपबोर्ड पर कॉपी करें
import { defineConfig } from "vite";import { intlayer } from "vite-intlayer";export default defineConfig({ plugins: [intlayer()],});- Compiler: जब
compiler.enabledकोtrueपर सेट किया जाता है औरcompiler.outputpath कॉन्फ़िगर की जाती है तो स्वचालित रूप से सक्रिय हो जाता है। आपको अबintlayerCompiler()को अलग से रजिस्टर करने की आवश्यकता नहीं है। - Proxy: नए
routing.enableProxyoption (trueडिफ़ॉल्ट रूप से) के आधार पर स्वचालित रूप से सक्रिय हो जाता है। यह development, preview, और production SSR में locale detection / redirect / rewrite middleware को wire करता है। आपको अबintlayerProxy()को अलग से रजिस्टर करने की आवश्यकता नहीं है।
routing.enableProxy विकल्प
एक नया routing.enableProxy विकल्प नियंत्रित करता है कि locale-routing proxy को plug किया गया है या नहीं। यह डिफ़ॉल्ट रूप से true होता है। इसे disable करें जब आप locale routing को स्वयं handle करना चाहते हैं:
कोड को क्लिपबोर्ड पर कॉपी करें
import type { IntlayerConfig } from "intlayer";const config: IntlayerConfig = { routing: { enableProxy: false, // डिफ़ॉल्ट: true },};export default config;स्टैंडअलोन intlayerCompiler() और intlayerProxy() plugins advanced setups के लिए exported रहते हैं। उन्हें intlayer() के साथ register करना सुरक्षित है — प्रत्येक plugin स्वयं को deduplicate करता है और केवल एक बार चलता है।
कंपाइलर डिफ़ॉल्ट रूप से अक्षम
Intlayer v9 से, कंपाइलर डिफ़ॉल्ट रूप से अक्षम है (compiler.enabled अब डिफ़ॉल्ट रूप से false है)। अपनी .content.ts फ़ाइलों के बिल्ड-टाइम एक्सट्रैक्शन को सक्षम करने के लिए, अपने कॉन्फ़िगरेशन में compiler.enabled: true सेट करें:
कोड को क्लिपबोर्ड पर कॉपी करें
import type { IntlayerConfig } from "intlayer";const config: IntlayerConfig = { compiler: { enabled: true, // डिफ़ॉल्ट: false — v9 से कंपाइलर को सक्षम करने के लिए आवश्यक output: ({ fileName }) => `./${fileName}.content.ts`, },};export default config;जब कंपाइलर अक्षम होता है, तो Intlayer बिल्ड-टाइम एक्सट्रैक्शन चरण को छोड़ देता है और आपके पहले से घोषित डिक्शनरीज़ पर निर्भर करता है। इसे केवल तभी सक्षम करें जब आप चाहते हैं कि बंडलर प्लगइन (@intlayer/swc, @intlayer/babel, या intlayer() Vite प्लगइन) सामग्री को स्वचालित रूप से एक्सट्रैक्ट करे।
React Native: सिंगल-पैकेज इम्पोर्ट
React Native या Expo ऐप में, अब आपको react-intlayer और react-native-intlayer दोनों के बीच तालमेल बिठाने की ज़रूरत नहीं है। react-native-intlayer पैकेज अब पूर्ण react-intlayer API को फिर से निर्यात करता है (हुक्स, यूटिलिटीज, और /format, /html, और /markdown सबपाथ), और इसका IntlayerProvider स्वचालित रूप से React Native पॉलीफ़िल्स लागू करता है।
सभी चीज़ें एकल react-native-intlayer पैकेज से इम्पोर्ट करें:
कोड को क्लिपबोर्ड पर कॉपी करें
import { IntlayerProvider, useIntlayer, useLocale,} from "react-native-intlayer";कोड को क्लिपबोर्ड पर कॉपी करें
npm install intlayer react-native-intlayerreact-intlayerसे इम्पोर्ट करना काम करता रहेगा, लेकिनreact-native-intlayerअब React Native के लिए अनुशंसित एकल प्रवेश बिंदु है — इसका प्रदाता वे पॉलीफ़िल्स प्रदान करता है जो वेब-उन्मुखreact-intlayerप्रदाता नहीं करता है।
CMS SDK: Intlayer को हेडलेस कंटेंट डेटाबेस के रूप में उपयोग करें
Intlayer v9 में @intlayer/api के भीतर एक साफ़, स्वतः-प्रमाणित SDK शामिल है, जिससे आप CMS के साथ प्रोग्रामेटिक रूप से इंटरैक्ट कर सकते हैं — प्रोजेक्ट्स प्राप्त करें, डिक्शनरीज़ प्राप्त करें, और उन्हें अपने सर्वर, स्क्रिप्ट्स या CI से पुश या अपडेट करें। प्रमाणीकरण (OAuth2 client_credentials) आपके लिए संभाला और रिफ्रेश किया जाता है।
SDK को दो अलग-अलग इम्पोर्ट्स में विभाजित किया गया है ताकि आपके बंडल में केवल वही डोमेन शामिल हों जिन्हें आप वास्तव में उपयोग करते हैं:
createIntlayerCMS— एक हल्का ऑथेंटिकेटर जो क्रेडेंशियल्स और प्रबंधित टोकन रखता है (कोई डोमेन क्लाइंट बंडल नहीं होता)।dictionaryEndpoint,projectEndpoint, … — प्रति-डोमेन एंडपॉइंट बाइंडर, प्रत्येक अपने स्वयं के सब-पाथ से इम्पोर्ट किया जाता है।
कोड को क्लिपबोर्ड पर कॉपी करें
import { createIntlayerCMS } from "@intlayer/api";import { dictionaryEndpoint } from "@intlayer/api/dictionary";// कॉन्फ़िगरेशन वैकल्पिक है: क्रेडेंशियल्स INTLAYER_CLIENT_ID /// INTLAYER_CLIENT_SECRET पर फ़ॉलबैक करते हैं, जिन्हें `@intlayer/config/built` हल करता है।const cms = createIntlayerCMS();// पढ़ेंconst { data: dictionaries } = await dictionaryEndpoint(cms).getDictionaries();// लिखें — CMS को डेटाबेस की तरह उपयोग करेंawait dictionaryEndpoint(cms).pushDictionaries([myDictionary]);सुरक्षा: CMS क्रेडेंशियल्स आपके कंटेंट पर लिखने की अनुमति देते हैं। ऑथेंटिकेटर हमेशा केवल सर्वर साइड पर ही बनाएं —clientId/clientSecretको कभी ब्राउज़र पर न भेजें।
स्व-होस्टिंग (Self-Hosting)
Intlayer v9 एक ही कमांड से अपना स्वयं का Intlayer इंस्टेंस चलाने के लिए प्रथम-श्रेणी समर्थन प्रदान करता है — किसी Intlayer Cloud खाते की आवश्यकता नहीं है।
कोड को क्लिपबोर्ड पर कॉपी करें
curl -fsSL https://intlayer.org/install.sh | shइंस्टॉलर एक docker-compose.yml और एक .env डाउनलोड करता है, आवश्यक सीक्रेट्स (secrets) को स्वचालित रूप से जनरेट करता है, और docker compose up -d चलाता है। सब कुछ — डैशबोर्ड, API, डेटाबेस, ऑब्जेक्ट स्टोरेज, और ट्रांजेक्शनल ईमेल — कंटेनर्स में स्थानीय रूप से चलता है।
शामिल सेवाएं
सभी डेटा सामग्री को स्पष्ट रूप से देखने के लिए तालिका को मोडल में खोलें
| सेवा | उद्देश्य |
|---|---|
| app (TanStack Start) | पोर्ट 3000 पर डैशबोर्ड UI |
| backend (Fastify/Bun) | पोर्ट 3100 पर REST API |
| MongoDB 7 (सिंगल-नोड रेप्लिका सेट) | प्राथमिक डेटाबेस |
| Redis 7 | जॉब क्यूज़ और कैशिंग |
| MinIO | S3-संगत ऑब्जेक्ट स्टोरेज (अवतार, स्क्रीनशॉट) |
| Mailpit | लोकल SMTP सिंक + पोर्ट 8025 पर ट्रांजेक्शनल ईमेल के लिए वेब UI |
Chromium (Puppeteer स्क्रीनशॉट जनरेशन के लिए उपयोग किया जाता है) बैकएंड इमेज के अंदर बंडल किया गया है — किसी अतिरिक्त कंटेनर की आवश्यकता नहीं है।
v8 से माइग्रेशन नोट्स
यदि आप v8 से अपग्रेड कर रहे हैं, तो ध्यान दें कि v9 में कोई ब्रेकिंग बदलाव (breaking changes) शामिल नहीं हैं। लेकिन यहाँ मुख्य बदलाव दिए गए हैं:
- कंपाइलर डिफ़ॉल्ट रूप से अक्षम:
compiler.enabledअब डिफ़ॉल्ट रूप सेfalseहै। यदि आप अपनी.content.tsफ़ाइलों के बिल्ड-टाइम एक्सट्रैक्शन पर निर्भर हैं, तो अपनेintlayer.config.tsमेंcompiler.enabled: trueसेट करें। - Locales & Dialects: यदि बाहरी i18n डिपेंडेंसीज़ का उपयोग कर रहे हैं, तो इंपोर्ट्स को स्वचालित रूप से रीराइट करने के लिए अपने कॉन्फ़िगरेशन या बंडलर सेटअप में उनके संबंधित compat एडाप्टर प्लगइन्स जोड़ें।
- Custom Selectors:
useIntlayerको कॉल करते समय, दूसरा पैरामीटर अब एक ऑप्शन ऑब्जेक्ट के लिए आरक्षित है जिसमें{ locale, item, variant }शामिल हैं। यदि आपने पहले सीधे लोकेल स्ट्रिंग पास की थी, तो आप अभी भी ऐसा कर सकते हैं, लेकिन उन्नत चयनों (advanced selections) के लिए ऑप्शंस ऑब्जेक्ट का उपयोग करने की अनुशंसा की जाती है।