@intlayer/docs 9.0.0-canary.7 → 9.0.0-canary.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/generated/docs.entry.cjs +0 -20
- package/dist/cjs/generated/docs.entry.cjs.map +1 -1
- package/dist/esm/generated/docs.entry.mjs +0 -20
- package/dist/esm/generated/docs.entry.mjs.map +1 -1
- package/dist/types/generated/docs.entry.d.ts +0 -1
- package/dist/types/generated/docs.entry.d.ts.map +1 -1
- package/docs/ar/dynamic_dictionaries/index.md +24 -18
- package/docs/ar/dynamic_dictionaries/variants.md +280 -22
- package/docs/ar/plugins/sync-json.md +0 -1
- package/docs/ar/releases/v9.md +35 -12
- package/docs/de/dynamic_dictionaries/index.md +22 -22
- package/docs/de/dynamic_dictionaries/variants.md +272 -14
- package/docs/de/plugins/sync-json.md +0 -1
- package/docs/de/releases/v9.md +35 -12
- package/docs/en/dynamic_dictionaries/index.md +20 -14
- package/docs/en/dynamic_dictionaries/variants.md +266 -8
- package/docs/en/plugins/sync-json.md +0 -1
- package/docs/en/releases/v9.md +35 -12
- package/docs/en-GB/dynamic_dictionaries/index.md +21 -15
- package/docs/en-GB/dynamic_dictionaries/variants.md +268 -10
- package/docs/en-GB/plugins/sync-json.md +0 -1
- package/docs/en-GB/releases/v9.md +35 -12
- package/docs/es/dynamic_dictionaries/index.md +25 -19
- package/docs/es/dynamic_dictionaries/variants.md +275 -17
- package/docs/es/plugins/sync-json.md +0 -1
- package/docs/es/releases/v9.md +35 -12
- package/docs/fr/dynamic_dictionaries/index.md +26 -20
- package/docs/fr/dynamic_dictionaries/variants.md +273 -15
- package/docs/fr/plugins/sync-json.md +0 -1
- package/docs/fr/releases/v9.md +35 -12
- package/docs/hi/dynamic_dictionaries/index.md +28 -22
- package/docs/hi/dynamic_dictionaries/variants.md +282 -24
- package/docs/hi/plugins/sync-json.md +0 -1
- package/docs/hi/releases/v9.md +35 -12
- package/docs/id/dynamic_dictionaries/index.md +25 -19
- package/docs/id/dynamic_dictionaries/variants.md +274 -16
- package/docs/id/plugins/sync-json.md +0 -1
- package/docs/id/releases/v9.md +35 -12
- package/docs/it/dynamic_dictionaries/index.md +26 -20
- package/docs/it/dynamic_dictionaries/variants.md +273 -15
- package/docs/it/plugins/sync-json.md +0 -1
- package/docs/it/releases/v9.md +35 -12
- package/docs/ja/dynamic_dictionaries/index.md +27 -21
- package/docs/ja/dynamic_dictionaries/variants.md +276 -18
- package/docs/ja/plugins/sync-json.md +0 -1
- package/docs/ja/releases/v9.md +35 -12
- package/docs/ko/dynamic_dictionaries/index.md +23 -17
- package/docs/ko/dynamic_dictionaries/variants.md +273 -15
- package/docs/ko/plugins/sync-json.md +0 -1
- package/docs/ko/releases/v9.md +35 -12
- package/docs/pl/dynamic_dictionaries/index.md +26 -20
- package/docs/pl/dynamic_dictionaries/variants.md +275 -17
- package/docs/pl/plugins/sync-json.md +0 -1
- package/docs/pl/releases/v9.md +35 -12
- package/docs/pt/dynamic_dictionaries/index.md +25 -19
- package/docs/pt/dynamic_dictionaries/variants.md +276 -18
- package/docs/pt/plugins/sync-json.md +0 -1
- package/docs/pt/releases/v9.md +35 -12
- package/docs/ru/dynamic_dictionaries/index.md +25 -19
- package/docs/ru/dynamic_dictionaries/variants.md +277 -19
- package/docs/ru/plugins/sync-json.md +0 -1
- package/docs/ru/releases/v9.md +35 -12
- package/docs/tr/dynamic_dictionaries/index.md +27 -21
- package/docs/tr/dynamic_dictionaries/variants.md +274 -16
- package/docs/tr/plugins/sync-json.md +0 -1
- package/docs/tr/releases/v9.md +35 -12
- package/docs/uk/dynamic_dictionaries/index.md +25 -19
- package/docs/uk/dynamic_dictionaries/variants.md +277 -19
- package/docs/uk/plugins/sync-json.md +0 -1
- package/docs/uk/releases/v9.md +35 -12
- package/docs/vi/dynamic_dictionaries/index.md +28 -22
- package/docs/vi/dynamic_dictionaries/variants.md +278 -20
- package/docs/vi/plugins/sync-json.md +0 -1
- package/docs/vi/releases/v9.md +35 -12
- package/docs/zh/dynamic_dictionaries/index.md +24 -18
- package/docs/zh/dynamic_dictionaries/variants.md +274 -16
- package/docs/zh/plugins/sync-json.md +0 -1
- package/docs/zh/releases/v9.md +35 -12
- package/package.json +6 -6
- package/src/generated/docs.entry.ts +0 -20
- package/docs/ar/dynamic_dictionaries/dynamic_content.md +0 -271
- package/docs/de/dynamic_dictionaries/dynamic_content.md +0 -271
- package/docs/en/dynamic_dictionaries/dynamic_content.md +0 -271
- package/docs/en-GB/dynamic_dictionaries/dynamic_content.md +0 -271
- package/docs/es/dynamic_dictionaries/dynamic_content.md +0 -271
- package/docs/fr/dynamic_dictionaries/dynamic_content.md +0 -271
- package/docs/hi/dynamic_dictionaries/dynamic_content.md +0 -271
- package/docs/id/dynamic_dictionaries/dynamic_content.md +0 -271
- package/docs/it/dynamic_dictionaries/dynamic_content.md +0 -271
- package/docs/ja/dynamic_dictionaries/dynamic_content.md +0 -271
- package/docs/ko/dynamic_dictionaries/dynamic_content.md +0 -271
- package/docs/pl/dynamic_dictionaries/dynamic_content.md +0 -271
- package/docs/pt/dynamic_dictionaries/dynamic_content.md +0 -271
- package/docs/ru/dynamic_dictionaries/dynamic_content.md +0 -271
- package/docs/tr/dynamic_dictionaries/dynamic_content.md +0 -271
- package/docs/uk/dynamic_dictionaries/dynamic_content.md +0 -271
- package/docs/vi/dynamic_dictionaries/dynamic_content.md +0 -271
- package/docs/zh/dynamic_dictionaries/dynamic_content.md +0 -271
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2026-06-12
|
|
3
|
-
updatedAt: 2026-06-
|
|
4
|
-
title:
|
|
5
|
-
description:
|
|
3
|
+
updatedAt: 2026-06-26
|
|
4
|
+
title: वैरिएंट
|
|
5
|
+
description: नामित या संरचित सामग्री विकल्प — A/B परीक्षण, मौसमी बैनर, फ़ीचर-फ़्लैग टेक्स्ट, CMS रिकॉर्ड, उपयोगकर्ता-विशिष्ट सामग्री — घोषित करने और कोड बदले बिना रनटाइम पर उनके बीच स्विच करने के लिए Intlayer सामग्री फ़ाइलों में variant मेटाडेटा फ़ील्ड का उपयोग करें।
|
|
6
6
|
keywords:
|
|
7
|
-
-
|
|
7
|
+
- वैरिएंट
|
|
8
8
|
- A/B परीक्षण
|
|
9
|
-
-
|
|
9
|
+
- फ़ीचर फ़्लैग
|
|
10
10
|
- डायनेमिक सामग्री
|
|
11
|
+
- डायनेमिक रिकॉर्ड
|
|
12
|
+
- CMS
|
|
11
13
|
- Intlayer
|
|
12
14
|
- अंतर्राष्ट्रीयकरण
|
|
13
15
|
slugs:
|
|
@@ -17,17 +19,27 @@ slugs:
|
|
|
17
19
|
history:
|
|
18
20
|
- version: 9.0.0
|
|
19
21
|
date: 2026-06-12
|
|
20
|
-
changes: "
|
|
22
|
+
changes: "वैरिएंट सुविधा का रिलीज़"
|
|
23
|
+
- version: 9.1.0
|
|
24
|
+
date: 2026-06-26
|
|
25
|
+
changes: "अब `variant` एक स्ट्रिंग या ऑब्जेक्ट स्वीकार करता है — पूर्व `meta` / डायनेमिक रिकॉर्ड ऑब्जेक्ट वैरिएंट के रूप में घोषित किए जाते हैं"
|
|
21
26
|
author: aymericzip
|
|
22
27
|
---
|
|
23
28
|
|
|
24
|
-
#
|
|
29
|
+
# वैरिएंट
|
|
25
30
|
|
|
26
|
-
एक
|
|
31
|
+
एक **वैरिएंट** सामग्री फ़ाइलों का एक समूह है जो समान डिक्शनरी `key` साझा करती हैं लेकिन प्रत्येक का एक अलग `variant` मान होता है। Intlayer `useIntlayer` को पास किए गए सेलेक्टर के आधार पर उपयुक्त फ़ाइल परोसता है।
|
|
27
32
|
|
|
28
|
-
|
|
33
|
+
`variant` मान **दो रूप** ले सकता है:
|
|
29
34
|
|
|
30
|
-
|
|
35
|
+
- **एक स्ट्रिंग** — एकल नामित विकल्प (A/B परीक्षण, मौसमी बैनर, फ़ीचर फ़्लैग)।
|
|
36
|
+
- **एक ऑब्जेक्ट** — फ़ील्ड के सेट द्वारा संबोधित एक संरचित विभेदक (CMS रिकॉर्ड, उपयोगकर्ता-विशिष्ट सामग्री, अपारदर्शी ID द्वारा कुंजीबद्ध कोई भी सामग्री)। पूरा ऑब्जेक्ट ही पहचान है: प्रविष्टि हल करने के लिए सेलेक्टर को एक **समान** ऑब्जेक्ट देना होगा।
|
|
37
|
+
|
|
38
|
+
> ऑब्जेक्ट रूप पुराने `meta` फ़ील्ड की जगह लेता है। जहाँ भी आप पहले `meta: { id, … }` लिखते थे, वहाँ `variant: { id, … }` लिखें और इसे `{ variant: { id, … } }` के साथ चुनें।
|
|
39
|
+
|
|
40
|
+
## नामित (स्ट्रिंग) वैरिएंट
|
|
41
|
+
|
|
42
|
+
प्रत्येक फ़ाइल एक नामित विकल्प का प्रतिनिधित्व करती है। `variant` को छोड़ना (या `"default"` पर सेट करना) इसे फ़ॉलबैक के रूप में चिह्नित करता है।
|
|
31
43
|
|
|
32
44
|
```ts fileName="hero-banner.content.ts" contentDeclarationFormat={["typescript", "esm", "commonjs"]}
|
|
33
45
|
import { t, type Dictionary } from "intlayer";
|
|
@@ -65,9 +77,9 @@ const dictionary = {
|
|
|
65
77
|
export default dictionary;
|
|
66
78
|
```
|
|
67
79
|
|
|
68
|
-
|
|
80
|
+
### नामित वैरिएंट का उपयोग
|
|
69
81
|
|
|
70
|
-
|
|
82
|
+
#### डिफ़ॉल्ट वैरिएंट
|
|
71
83
|
|
|
72
84
|
<Tabs group="framework">
|
|
73
85
|
<Tab label="React" value="react">
|
|
@@ -76,7 +88,7 @@ export default dictionary;
|
|
|
76
88
|
|
|
77
89
|
export const Hero = () => {
|
|
78
90
|
const { headline, cta } = useIntlayer("hero-banner");
|
|
79
|
-
// → डिफ़ॉल्ट
|
|
91
|
+
// → डिफ़ॉल्ट वैरिएंट
|
|
80
92
|
|
|
81
93
|
return (
|
|
82
94
|
<section>
|
|
@@ -94,7 +106,7 @@ export default dictionary;
|
|
|
94
106
|
|
|
95
107
|
export const Hero = () => {
|
|
96
108
|
const { headline, cta } = useIntlayer("hero-banner");
|
|
97
|
-
// → डिफ़ॉल्ट
|
|
109
|
+
// → डिफ़ॉल्ट वैरिएंट
|
|
98
110
|
|
|
99
111
|
return (
|
|
100
112
|
<section>
|
|
@@ -142,7 +154,7 @@ export default dictionary;
|
|
|
142
154
|
|
|
143
155
|
export const Hero = () => {
|
|
144
156
|
const { headline, cta } = useIntlayer("hero-banner");
|
|
145
|
-
// → डिफ़ॉल्ट
|
|
157
|
+
// → डिफ़ॉल्ट वैरिएंट
|
|
146
158
|
|
|
147
159
|
return (
|
|
148
160
|
<section>
|
|
@@ -160,7 +172,7 @@ export default dictionary;
|
|
|
160
172
|
|
|
161
173
|
export const Hero = () => {
|
|
162
174
|
const content = useIntlayer("hero-banner");
|
|
163
|
-
// → डिफ़ॉल्ट
|
|
175
|
+
// → डिफ़ॉल्ट वैरिएंट
|
|
164
176
|
|
|
165
177
|
return (
|
|
166
178
|
<section>
|
|
@@ -209,7 +221,7 @@ export default dictionary;
|
|
|
209
221
|
</Tab>
|
|
210
222
|
</Tabs>
|
|
211
223
|
|
|
212
|
-
|
|
224
|
+
#### नामित वैरिएंट
|
|
213
225
|
|
|
214
226
|
```tsx
|
|
215
227
|
const { headline, cta } = useIntlayer("hero-banner", {
|
|
@@ -217,18 +229,264 @@ const { headline, cta } = useIntlayer("hero-banner", {
|
|
|
217
229
|
});
|
|
218
230
|
```
|
|
219
231
|
|
|
220
|
-
|
|
232
|
+
#### स्पष्ट locale के साथ नामित वैरिएंट
|
|
221
233
|
|
|
222
234
|
```tsx
|
|
223
235
|
const content = useIntlayer("hero-banner", {
|
|
224
236
|
variant: "black_friday",
|
|
225
|
-
locale: "
|
|
237
|
+
locale: "fr",
|
|
226
238
|
});
|
|
227
239
|
```
|
|
228
240
|
|
|
229
|
-
##
|
|
241
|
+
## ऑब्जेक्ट (संरचित) वैरिएंट
|
|
242
|
+
|
|
243
|
+
एक ऑब्जेक्ट वैरिएंट `variant` फ़ील्ड में घोषित मनमाने key-value युग्मों के सेट द्वारा सामग्री को संबोधित करता है — जिससे CMS रिकॉर्ड, उपयोगकर्ता-विशिष्ट सामग्री, या ऐसी कोई भी सामग्री मॉडल करना संभव हो जाता है जिसकी कुंजी एक अपारदर्शी ID है। पहचान **पूरा ऑब्जेक्ट** है: प्रविष्टि हल होने के लिए सेलेक्टर को एक समान ऑब्जेक्ट देना होगा।
|
|
244
|
+
|
|
245
|
+
```ts fileName="product.abc.content.ts" contentDeclarationFormat={["typescript", "esm", "commonjs"]}
|
|
246
|
+
import { t, type Dictionary } from "intlayer";
|
|
247
|
+
|
|
248
|
+
const dictionary = {
|
|
249
|
+
key: "product",
|
|
250
|
+
variant: { id: "prod_abc", userId: "user_123" },
|
|
251
|
+
content: {
|
|
252
|
+
name: t({ en: "Widget Pro", fr: "Widget Pro" }),
|
|
253
|
+
description: t({ en: "The best widget.", fr: "Le meilleur widget." }),
|
|
254
|
+
},
|
|
255
|
+
} satisfies Dictionary;
|
|
256
|
+
|
|
257
|
+
export default dictionary;
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
```ts fileName="product.abcd.content.ts" contentDeclarationFormat={["typescript", "esm", "commonjs"]}
|
|
261
|
+
import { t, type Dictionary } from "intlayer";
|
|
262
|
+
|
|
263
|
+
const dictionary = {
|
|
264
|
+
key: "product",
|
|
265
|
+
variant: { id: "prod_abcd", userId: "user_123" },
|
|
266
|
+
content: {
|
|
267
|
+
name: t({ en: "Widget Lite", fr: "Widget Lite" }),
|
|
268
|
+
description: t({ en: "A lighter option.", fr: "Une option plus légère." }),
|
|
269
|
+
},
|
|
270
|
+
} satisfies Dictionary;
|
|
271
|
+
|
|
272
|
+
export default dictionary;
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
### ऑब्जेक्ट वैरिएंट का उपयोग
|
|
276
|
+
|
|
277
|
+
मिलान करने वाला ऑब्जेक्ट `variant` में पास करें। डिक्शनरी में घोषित प्रत्येक फ़ील्ड प्रदान किया जाना चाहिए और समान होना चाहिए; अन्यथा परिणाम `null` होता है। फ़ील्ड का क्रम मायने नहीं रखता।
|
|
278
|
+
|
|
279
|
+
<Tabs group="framework">
|
|
280
|
+
<Tab label="React" value="react">
|
|
281
|
+
```tsx fileName="Product.tsx" contentDeclarationFormat={["typescript", "esm", "commonjs"]}
|
|
282
|
+
import { useIntlayer } from "react-intlayer";
|
|
283
|
+
|
|
284
|
+
export const Product = ({
|
|
285
|
+
productId,
|
|
286
|
+
userId,
|
|
287
|
+
}: {
|
|
288
|
+
productId: string;
|
|
289
|
+
userId: string;
|
|
290
|
+
}) => {
|
|
291
|
+
const content = useIntlayer("product", {
|
|
292
|
+
variant: { id: productId, userId },
|
|
293
|
+
});
|
|
294
|
+
|
|
295
|
+
if (!content) return null;
|
|
296
|
+
|
|
297
|
+
return <p>{content.description}</p>;
|
|
298
|
+
};
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
</Tab>
|
|
302
|
+
<Tab label="Next.js" value="nextjs">
|
|
303
|
+
```tsx fileName="Product.tsx" contentDeclarationFormat={["typescript", "esm", "commonjs"]}
|
|
304
|
+
import { useIntlayer } from "next-intlayer";
|
|
305
|
+
|
|
306
|
+
export const Product = ({
|
|
307
|
+
productId,
|
|
308
|
+
userId,
|
|
309
|
+
}: {
|
|
310
|
+
productId: string;
|
|
311
|
+
userId: string;
|
|
312
|
+
}) => {
|
|
313
|
+
const content = useIntlayer("product", {
|
|
314
|
+
variant: { id: productId, userId },
|
|
315
|
+
});
|
|
316
|
+
|
|
317
|
+
if (!content) return null;
|
|
318
|
+
|
|
319
|
+
return <p>{content.description}</p>;
|
|
320
|
+
};
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
</Tab>
|
|
324
|
+
<Tab label="Vue" value="vue">
|
|
325
|
+
```vue fileName="Product.vue" contentDeclarationFormat={["typescript", "esm", "commonjs"]}
|
|
326
|
+
<script setup>
|
|
327
|
+
import { useIntlayer } from "vue-intlayer";
|
|
328
|
+
|
|
329
|
+
const props = defineProps({
|
|
330
|
+
productId: String,
|
|
331
|
+
userId: String,
|
|
332
|
+
});
|
|
333
|
+
|
|
334
|
+
const content = useIntlayer("product", {
|
|
335
|
+
variant: { id: props.productId, userId: props.userId },
|
|
336
|
+
});
|
|
337
|
+
</script>
|
|
338
|
+
|
|
339
|
+
<template>
|
|
340
|
+
<p v-if="content">{{ content.description }}</p>
|
|
341
|
+
</template>
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
</Tab>
|
|
345
|
+
<Tab label="Svelte" value="svelte">
|
|
346
|
+
```svelte fileName="Product.svelte" contentDeclarationFormat={["typescript", "esm", "commonjs"]}
|
|
347
|
+
<script lang="ts">
|
|
348
|
+
import { useIntlayer } from "svelte-intlayer";
|
|
349
|
+
|
|
350
|
+
export let productId: string;
|
|
351
|
+
export let userId: string;
|
|
352
|
+
|
|
353
|
+
const content = useIntlayer("product", {
|
|
354
|
+
variant: { id: productId, userId },
|
|
355
|
+
});
|
|
356
|
+
</script>
|
|
357
|
+
|
|
358
|
+
{#if $content}
|
|
359
|
+
<p>{$content.description}</p>
|
|
360
|
+
{/if}
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
</Tab>
|
|
364
|
+
<Tab label="Preact" value="preact">
|
|
365
|
+
```tsx fileName="Product.tsx" contentDeclarationFormat={["typescript", "esm", "commonjs"]}
|
|
366
|
+
import { useIntlayer } from "preact-intlayer";
|
|
367
|
+
|
|
368
|
+
export const Product = ({
|
|
369
|
+
productId,
|
|
370
|
+
userId,
|
|
371
|
+
}: {
|
|
372
|
+
productId: string;
|
|
373
|
+
userId: string;
|
|
374
|
+
}) => {
|
|
375
|
+
const content = useIntlayer("product", {
|
|
376
|
+
variant: { id: productId, userId },
|
|
377
|
+
});
|
|
378
|
+
|
|
379
|
+
if (!content) return null;
|
|
380
|
+
|
|
381
|
+
return <p>{content.description}</p>;
|
|
382
|
+
};
|
|
383
|
+
```
|
|
384
|
+
|
|
385
|
+
</Tab>
|
|
386
|
+
<Tab label="Solid" value="solid">
|
|
387
|
+
```tsx fileName="Product.tsx" contentDeclarationFormat={["typescript", "esm", "commonjs"]}
|
|
388
|
+
import { useIntlayer } from "solid-intlayer";
|
|
389
|
+
|
|
390
|
+
export const Product = (props: {
|
|
391
|
+
productId: string;
|
|
392
|
+
userId: string;
|
|
393
|
+
}) => {
|
|
394
|
+
const content = useIntlayer("product", {
|
|
395
|
+
variant: { id: props.productId, userId: props.userId },
|
|
396
|
+
});
|
|
397
|
+
|
|
398
|
+
return (
|
|
399
|
+
<>
|
|
400
|
+
{content() && <p>{content().description}</p>}
|
|
401
|
+
</>
|
|
402
|
+
);
|
|
403
|
+
};
|
|
404
|
+
```
|
|
405
|
+
|
|
406
|
+
</Tab>
|
|
407
|
+
<Tab label="Angular" value="angular">
|
|
408
|
+
```typescript fileName="product.component.ts" contentDeclarationFormat={["typescript", "esm", "commonjs"]}
|
|
409
|
+
import { Component, Input, OnInit } from "@angular/core";
|
|
410
|
+
import { useIntlayer } from "angular-intlayer";
|
|
411
|
+
|
|
412
|
+
@Component({
|
|
413
|
+
selector: "app-product",
|
|
414
|
+
template: `
|
|
415
|
+
@if (content()) {
|
|
416
|
+
<p>{{ content().description }}</p>
|
|
417
|
+
}
|
|
418
|
+
`,
|
|
419
|
+
})
|
|
420
|
+
export class ProductComponent implements OnInit {
|
|
421
|
+
@Input() productId!: string;
|
|
422
|
+
@Input() userId!: string;
|
|
423
|
+
|
|
424
|
+
content: any;
|
|
425
|
+
|
|
426
|
+
ngOnInit() {
|
|
427
|
+
this.content = useIntlayer("product", {
|
|
428
|
+
variant: { id: this.productId, userId: this.userId },
|
|
429
|
+
});
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
```
|
|
433
|
+
|
|
434
|
+
</Tab>
|
|
435
|
+
<Tab label="Vanilla JS" value="vanilla">
|
|
436
|
+
```javascript fileName="product.js"
|
|
437
|
+
import { useIntlayer } from "vanilla-intlayer";
|
|
438
|
+
|
|
439
|
+
const content = useIntlayer("product", {
|
|
440
|
+
variant: { id: "prod_abcd", userId: "user_123" },
|
|
441
|
+
});
|
|
442
|
+
|
|
443
|
+
if (content) {
|
|
444
|
+
document.body.innerHTML = `<p>${content.description}</p>`;
|
|
445
|
+
}
|
|
446
|
+
```
|
|
447
|
+
|
|
448
|
+
</Tab>
|
|
449
|
+
</Tabs>
|
|
450
|
+
|
|
451
|
+
#### स्पष्ट locale के साथ
|
|
452
|
+
|
|
453
|
+
```tsx
|
|
454
|
+
const content = useIntlayer("product", {
|
|
455
|
+
variant: { id: "prod_abc", userId: "user_123" },
|
|
456
|
+
locale: "fr",
|
|
457
|
+
});
|
|
458
|
+
```
|
|
459
|
+
|
|
460
|
+
#### अनुपस्थित फ़ील्ड — कोई मिलान नहीं
|
|
461
|
+
|
|
462
|
+
```ts
|
|
463
|
+
// null लौटाता है: `userId` अनुपस्थित है, इसलिए ऑब्जेक्ट घोषित वैरिएंट से मेल नहीं खाता
|
|
464
|
+
const content = useIntlayer("product", { variant: { id: "prod_abc" } });
|
|
465
|
+
```
|
|
466
|
+
|
|
467
|
+
## लोडिंग मोड
|
|
468
|
+
|
|
469
|
+
ऑब्जेक्ट वैरिएंट अक्सर आलसी रूप से लोड किए जाते हैं। इसे नियंत्रित करने के लिए डिक्शनरी पर `importMode` सेट करें:
|
|
470
|
+
|
|
471
|
+
```ts contentDeclarationFormat={["typescript", "esm", "commonjs"]}
|
|
472
|
+
const dictionary = {
|
|
473
|
+
key: "product",
|
|
474
|
+
importMode: "fetch", // or "dynamic"
|
|
475
|
+
variant: { id: "prod_abc", userId: "user_123" },
|
|
476
|
+
content: { … },
|
|
477
|
+
} satisfies Dictionary;
|
|
478
|
+
|
|
479
|
+
export default dictionary;
|
|
480
|
+
```
|
|
481
|
+
|
|
482
|
+
`static`, `dynamic` और `fetch` मोड के विवरण के लिए [बंडल ऑप्टिमाइज़ेशन](https://github.com/aymericzip/intlayer/blob/main/docs/docs/hi/bundle_optimization.md) देखें।
|
|
483
|
+
|
|
484
|
+
## विशिष्ट उपयोग-मामले
|
|
230
485
|
|
|
231
|
-
-
|
|
232
|
-
- मौसमी या
|
|
233
|
-
-
|
|
234
|
-
-
|
|
486
|
+
- प्रयोग key द्वारा संचालित A/B टेक्स्ट परीक्षण
|
|
487
|
+
- मौसमी या प्रचारात्मक बैनर
|
|
488
|
+
- फ़ीचर-फ़्लैग संदेश
|
|
489
|
+
- locale-विशिष्ट मार्केटिंग अभियान
|
|
490
|
+
- CMS में प्रबंधित प्रति-उत्पाद मार्केटिंग टेक्स्ट
|
|
491
|
+
- उपयोगकर्ता-विशिष्ट या खाता-विशिष्ट सामग्री
|
|
492
|
+
- रनटाइम पर अपारदर्शी ID द्वारा कुंजीबद्ध कोई भी सामग्री
|
|
@@ -108,7 +108,6 @@ const config: IntlayerConfig = {
|
|
|
108
108
|
* Will load, and write the output and translations back to the JSON files in the locales directory
|
|
109
109
|
*/
|
|
110
110
|
syncJSON({
|
|
111
|
-
format: "i18next",
|
|
112
111
|
source: ({ key, locale }) => `./locales/${locale}/${key}.json`,
|
|
113
112
|
priority: 0,
|
|
114
113
|
format: "i18next",
|
package/docs/hi/releases/v9.md
CHANGED
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2026-06-14
|
|
3
|
-
updatedAt: 2026-06-
|
|
3
|
+
updatedAt: 2026-06-26
|
|
4
4
|
title: नया Intlayer v9 - क्या नया है?
|
|
5
|
-
description: जानें कि Intlayer v9 में क्या नया है। लोकप्रिय i18n लाइब्रेरीज़ के लिए ड्रॉप-इन कम्पैटिबिलिटी पैकेजेस और Collections
|
|
5
|
+
description: जानें कि Intlayer v9 में क्या नया है। लोकप्रिय i18n लाइब्रेरीज़ के लिए ड्रॉप-इन कम्पैटिबिलिटी पैकेजेस और Collections और Variants के लिए सपोर्ट का परिचय।
|
|
6
6
|
keywords:
|
|
7
7
|
- Intlayer
|
|
8
8
|
- Compatibility
|
|
9
9
|
- Migration
|
|
10
10
|
- Collections
|
|
11
11
|
- Variants
|
|
12
|
-
- Dynamic Records
|
|
13
12
|
- i18next
|
|
14
13
|
- next-intl
|
|
15
14
|
- vue-i18n
|
|
@@ -22,7 +21,7 @@ author: aymericzip
|
|
|
22
21
|
|
|
23
22
|
# नया Intlayer v9 - क्या नया है?
|
|
24
23
|
|
|
25
|
-
Intlayer v9 में आपका स्वागत है! यह मेजर रिलीज़ प्रमुख i18n लाइब्रेरीज़ (`react-i18next`, `next-intl`, `vue-i18n`, आदि) के लिए **Compat Adapter Packages** के साथ Intlayer पर माइग्रेशन की राह को आसान बनाने में एक बड़ा मील का पत्थर है, और यह रिच कंटेंट स्ट्रक्चर्स: **Collections
|
|
24
|
+
Intlayer v9 में आपका स्वागत है! यह मेजर रिलीज़ प्रमुख i18n लाइब्रेरीज़ (`react-i18next`, `next-intl`, `vue-i18n`, आदि) के लिए **Compat Adapter Packages** के साथ Intlayer पर माइग्रेशन की राह को आसान बनाने में एक बड़ा मील का पत्थर है, और यह रिच कंटेंट स्ट्रक्चर्स: **Collections** और **Variants** के लिए सपोर्ट जोड़ता है।
|
|
26
25
|
|
|
27
26
|
## विषय-सूची
|
|
28
27
|
|
|
@@ -41,8 +40,10 @@ Intlayer v9 में आपका स्वागत है! यह मेज
|
|
|
41
40
|
- `@intlayer/i18next`
|
|
42
41
|
- `@intlayer/react-i18next`
|
|
43
42
|
- `@intlayer/next-intl`
|
|
43
|
+
- `@intlayer/react-intl`
|
|
44
44
|
- `@intlayer/next-i18next`
|
|
45
45
|
- `@intlayer/vue-i18n`
|
|
46
|
+
- `@intlayer/lingui`
|
|
46
47
|
|
|
47
48
|
उदाहरण के लिए, बस इसे बदलें:
|
|
48
49
|
|
|
@@ -100,7 +101,7 @@ export default defineConfig({
|
|
|
100
101
|
|
|
101
102
|
---
|
|
102
103
|
|
|
103
|
-
## Feature Spec: Collections
|
|
104
|
+
## Feature Spec: Collections & Variants
|
|
104
105
|
|
|
105
106
|
Intlayer v9 स्टैटिक की-वैल्यू ऑब्जेक्ट्स से आगे बढ़कर डिक्शनरीज़ को डायनेमिक लेआउट स्ट्रक्चर्स घोषित करने की अनुमति देता है जो एंड-टू-एंड पूरी तरह से टाइप्ड (typed) होते हैं।
|
|
106
107
|
|
|
@@ -144,6 +145,8 @@ const faq = useIntlayer("faq", { item: 1 }); // -> { question: string, answer: s
|
|
|
144
145
|
|
|
145
146
|
A/B टेस्ट्स, सीज़नल हेडर्स, फ़ीचर फ़्लैग्स, या कस्टम लैंडिंग पेजेस डिलीवर करें:
|
|
146
147
|
|
|
148
|
+
#### स्ट्रिंग वेरिएंट (उदा. A/B टेस्टिंग)
|
|
149
|
+
|
|
147
150
|
```ts fileName="hero.content.ts"
|
|
148
151
|
import { t, type Dictionary } from "intlayer";
|
|
149
152
|
|
|
@@ -167,16 +170,14 @@ export default {
|
|
|
167
170
|
const banner = useIntlayer("hero-banner", { variant: "black_friday" });
|
|
168
171
|
```
|
|
169
172
|
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
ऐसे डिक्शनरीज़ को परिभाषित करें जिनकी एंट्रीज़ रनटाइम पर क्वेरी IDs के माध्यम से डायनेमिक रूप से लोड होती हैं:
|
|
173
|
+
#### ऑब्जेक्ट वेरिएंट (उदा. डायनेमिक रिकॉर्ड्स)
|
|
173
174
|
|
|
174
175
|
```ts fileName="product.content.ts"
|
|
175
176
|
import { t, type Dictionary } from "intlayer";
|
|
176
177
|
|
|
177
178
|
export default {
|
|
178
179
|
key: "product-copy",
|
|
179
|
-
|
|
180
|
+
variant: {
|
|
180
181
|
id: "prod_123",
|
|
181
182
|
category: "books",
|
|
182
183
|
},
|
|
@@ -229,7 +230,7 @@ export default defineConfig({
|
|
|
229
230
|
});
|
|
230
231
|
```
|
|
231
232
|
|
|
232
|
-
- **Compiler**: जब `compiler.enabled` सेट
|
|
233
|
+
- **Compiler**: जब `compiler.enabled` को `true` पर सेट किया जाता है और `compiler.output` path कॉन्फ़िगर की जाती है तो स्वचालित रूप से सक्रिय हो जाता है। आपको अब `intlayerCompiler()` को अलग से रजिस्टर करने की आवश्यकता नहीं है।
|
|
233
234
|
- **Proxy**: नए `routing.enableProxy` option (`true` डिफ़ॉल्ट रूप से) के आधार पर स्वचालित रूप से सक्रिय हो जाता है। यह development, preview, और production SSR में locale detection / redirect / rewrite middleware को wire करता है। आपको अब `intlayerProxy()` को अलग से रजिस्टर करने की आवश्यकता नहीं है।
|
|
234
235
|
|
|
235
236
|
### `routing.enableProxy` विकल्प
|
|
@@ -252,6 +253,27 @@ export default config;
|
|
|
252
253
|
|
|
253
254
|
---
|
|
254
255
|
|
|
256
|
+
## कंपाइलर डिफ़ॉल्ट रूप से अक्षम
|
|
257
|
+
|
|
258
|
+
Intlayer v9 से, **कंपाइलर डिफ़ॉल्ट रूप से अक्षम है** (`compiler.enabled` अब डिफ़ॉल्ट रूप से `false` है)। अपनी `.content.ts` फ़ाइलों के बिल्ड-टाइम एक्सट्रैक्शन को सक्षम करने के लिए, अपने कॉन्फ़िगरेशन में `compiler.enabled: true` सेट करें:
|
|
259
|
+
|
|
260
|
+
```ts fileName="intlayer.config.ts"
|
|
261
|
+
import type { IntlayerConfig } from "intlayer";
|
|
262
|
+
|
|
263
|
+
const config: IntlayerConfig = {
|
|
264
|
+
compiler: {
|
|
265
|
+
enabled: true, // डिफ़ॉल्ट: false — v9 से कंपाइलर को सक्षम करने के लिए आवश्यक
|
|
266
|
+
output: ({ fileName }) => `./${fileName}.content.ts`,
|
|
267
|
+
},
|
|
268
|
+
};
|
|
269
|
+
|
|
270
|
+
export default config;
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
जब कंपाइलर अक्षम होता है, तो Intlayer बिल्ड-टाइम एक्सट्रैक्शन चरण को छोड़ देता है और आपके पहले से घोषित डिक्शनरीज़ पर निर्भर करता है। इसे केवल तभी सक्षम करें जब आप चाहते हैं कि बंडलर प्लगइन (`@intlayer/swc`, `@intlayer/babel`, या `intlayer()` Vite प्लगइन) सामग्री को स्वचालित रूप से एक्सट्रैक्ट करे।
|
|
274
|
+
|
|
275
|
+
---
|
|
276
|
+
|
|
255
277
|
## React Native: सिंगल-पैकेज इम्पोर्ट
|
|
256
278
|
|
|
257
279
|
React Native या Expo ऐप में, अब आपको `react-intlayer` और `react-native-intlayer` दोनों के बीच तालमेल बिठाने की ज़रूरत नहीं है। `react-native-intlayer` पैकेज अब **पूर्ण `react-intlayer` API को फिर से निर्यात करता है** (हुक्स, यूटिलिटीज, और `/format`, `/html`, और `/markdown` सबपाथ), और इसका `IntlayerProvider` स्वचालित रूप से React Native पॉलीफ़िल्स लागू करता है।
|
|
@@ -278,13 +300,14 @@ npm install intlayer react-native-intlayer
|
|
|
278
300
|
|
|
279
301
|
यदि आप v8 से अपग्रेड कर रहे हैं, तो ध्यान दें कि v9 में कोई ब्रेकिंग बदलाव (breaking changes) शामिल नहीं हैं। लेकिन यहाँ मुख्य बदलाव दिए गए हैं:
|
|
280
302
|
|
|
303
|
+
- **कंपाइलर डिफ़ॉल्ट रूप से अक्षम**: `compiler.enabled` अब डिफ़ॉल्ट रूप से `false` है। यदि आप अपनी `.content.ts` फ़ाइलों के बिल्ड-टाइम एक्सट्रैक्शन पर निर्भर हैं, तो अपने `intlayer.config.ts` में `compiler.enabled: true` सेट करें।
|
|
281
304
|
- **Locales & Dialects**: यदि बाहरी i18n डिपेंडेंसीज़ का उपयोग कर रहे हैं, तो इंपोर्ट्स को स्वचालित रूप से रीराइट करने के लिए अपने कॉन्फ़िगरेशन या बंडलर सेटअप में उनके संबंधित compat एडाप्टर प्लगइन्स जोड़ें।
|
|
282
|
-
- **Custom Selectors**: `useIntlayer` को कॉल करते समय, दूसरा पैरामीटर अब एक ऑप्शन ऑब्जेक्ट के लिए आरक्षित है जिसमें `{ locale, item, variant
|
|
305
|
+
- **Custom Selectors**: `useIntlayer` को कॉल करते समय, दूसरा पैरामीटर अब एक ऑप्शन ऑब्जेक्ट के लिए आरक्षित है जिसमें `{ locale, item, variant }` शामिल हैं। यदि आपने पहले सीधे लोकेल स्ट्रिंग पास की थी, तो आप अभी भी ऐसा कर सकते हैं, लेकिन उन्नत चयनों (advanced selections) के लिए ऑप्शंस ऑब्जेक्ट का उपयोग करने की अनुशंसा की जाती है।
|
|
283
306
|
|
|
284
307
|
---
|
|
285
308
|
|
|
286
309
|
## उपयोगी लिंक्स
|
|
287
310
|
|
|
288
311
|
- [Compat Adapter Packages Guide](https://github.com/aymericzip/intlayer/blob/main/docs/docs/hi/compat/index.md)
|
|
289
|
-
- [Dynamic Dictionaries - Collections
|
|
312
|
+
- [Dynamic Dictionaries - Collections & Variants](https://github.com/aymericzip/intlayer/blob/main/docs/docs/hi/dynamic_dictionaries/index.md)
|
|
290
313
|
- [Configuration Reference](https://github.com/aymericzip/intlayer/blob/main/docs/docs/hi/configuration.md)
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2026-06-12
|
|
3
|
-
updatedAt: 2026-06-
|
|
4
|
-
title: Kamus
|
|
5
|
-
description:
|
|
3
|
+
updatedAt: 2026-06-26
|
|
4
|
+
title: Kamus dinamis
|
|
5
|
+
description: Ikhtisar fitur kamus dinamis Intlayer — koleksi dan varian — untuk membangun konten i18n yang fleksibel dan digerakkan saat runtime.
|
|
6
6
|
keywords:
|
|
7
|
-
- Kamus
|
|
7
|
+
- Kamus dinamis
|
|
8
8
|
- Koleksi
|
|
9
9
|
- Varian
|
|
10
|
-
- Catatan Dinamis
|
|
11
10
|
- Intlayer
|
|
12
11
|
- Internasionalisasi
|
|
13
12
|
slugs:
|
|
@@ -18,31 +17,38 @@ history:
|
|
|
18
17
|
- version: 9.0.0
|
|
19
18
|
date: 2026-06-12
|
|
20
19
|
changes: "Rilis fitur kamus dinamis"
|
|
20
|
+
- version: 9.1.0
|
|
21
|
+
date: 2026-06-26
|
|
22
|
+
changes: "Menggabungkan record dinamis ke dalam varian — `variant` kini menerima string atau objek"
|
|
21
23
|
author: aymericzip
|
|
22
24
|
---
|
|
23
25
|
|
|
24
|
-
# Kamus
|
|
26
|
+
# Kamus dinamis
|
|
25
27
|
|
|
26
|
-
Intlayer mendukung
|
|
28
|
+
Intlayer mendukung dua mekanisme untuk mengekspresikan konten yang melampaui satu kamus statis per kunci. Masing-masing dideklarasikan melalui **field metadata tingkat atas** di file konten; tidak diperlukan fungsi pembungkus.
|
|
27
29
|
|
|
28
|
-
| Fitur
|
|
29
|
-
|
|
|
30
|
-
| [Koleksi](https://github.com/aymericzip/intlayer/blob/main/docs/docs/id/dynamic_dictionaries/collections.md)
|
|
31
|
-
| [Varian](https://github.com/aymericzip/intlayer/blob/main/docs/docs/id/dynamic_dictionaries/variants.md)
|
|
32
|
-
| [Catatan Dinamis](https://github.com/aymericzip/intlayer/blob/main/docs/docs/id/dynamic_dictionaries/dynamic_content.md) | `meta: { id, … }` | `{ id, … }` |
|
|
30
|
+
| Fitur | Field metadata | Selektor di `useIntlayer` |
|
|
31
|
+
| ------------------------------------------------------------------------------------------------------------ | ----------------------------------------- | ------------------------------------------------- |
|
|
32
|
+
| [Koleksi](https://github.com/aymericzip/intlayer/blob/main/docs/docs/id/dynamic_dictionaries/collections.md) | `item: N` | `{ item: N }` |
|
|
33
|
+
| [Varian](https://github.com/aymericzip/intlayer/blob/main/docs/docs/id/dynamic_dictionaries/variants.md) | `variant: "name"` _atau_ `variant: { … }` | `{ variant: "name" }` _atau_ `{ variant: { … } }` |
|
|
33
34
|
|
|
34
|
-
|
|
35
|
+
Keduanya dapat dikombinasikan dengan argumen locale dan mendukung pemuatan selektif / malas melalui `importMode`.
|
|
35
36
|
|
|
36
37
|
## Kapan menggunakan yang mana
|
|
37
38
|
|
|
38
|
-
- **Koleksi** — daftar item terurut yang dikelola dalam file terpisah (entri FAQ,
|
|
39
|
-
- **Varian** — alternatif konten bernama
|
|
40
|
-
-
|
|
39
|
+
- **Koleksi** — daftar item terurut yang dikelola dalam file terpisah (entri FAQ, posting blog, produk).
|
|
40
|
+
- **Varian** — alternatif konten bernama atau terstruktur:
|
|
41
|
+
- varian **string** untuk pengujian A/B, banner musiman, atau feature flag;
|
|
42
|
+
- varian **objek** untuk record CMS, konten khusus pengguna, atau konten apa pun yang dialamatkan oleh sekumpulan field ("record dinamis" sebelumnya).
|
|
41
43
|
|
|
42
|
-
|
|
44
|
+
> Versi sebelumnya menyediakan field `meta` terpisah untuk konten berkunci record. Field ini telah digabungkan ke `variant`: berikan **objek** ke `variant` alih-alih menggunakan `meta`.
|
|
43
45
|
|
|
44
|
-
|
|
46
|
+
## Disambiguasi selektor
|
|
47
|
+
|
|
48
|
+
Sebuah kunci dapat mendeklarasikan kedua dimensi sekaligus (mis. koleksi yang setiap itemnya memiliki varian). Keduanya diselesaikan dengan urutan:
|
|
45
49
|
|
|
46
50
|
```
|
|
47
|
-
variant →
|
|
51
|
+
variant → item
|
|
48
52
|
```
|
|
53
|
+
|
|
54
|
+
Jadi `{ variant: "promo" }` pada kunci variant × item mengembalikan semua item promo sebagai array, dan menambahkan `{ item: 2 }` mempersempitnya menjadi satu entri.
|