@intlayer/docs 9.0.0-canary.7 → 9.0.0-canary.9

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.
Files changed (98) hide show
  1. package/dist/cjs/generated/docs.entry.cjs +0 -20
  2. package/dist/cjs/generated/docs.entry.cjs.map +1 -1
  3. package/dist/esm/generated/docs.entry.mjs +0 -20
  4. package/dist/esm/generated/docs.entry.mjs.map +1 -1
  5. package/dist/types/generated/docs.entry.d.ts +0 -1
  6. package/dist/types/generated/docs.entry.d.ts.map +1 -1
  7. package/docs/ar/dynamic_dictionaries/index.md +24 -18
  8. package/docs/ar/dynamic_dictionaries/variants.md +280 -22
  9. package/docs/ar/plugins/sync-json.md +0 -1
  10. package/docs/ar/releases/v9.md +35 -12
  11. package/docs/de/dynamic_dictionaries/index.md +22 -22
  12. package/docs/de/dynamic_dictionaries/variants.md +272 -14
  13. package/docs/de/plugins/sync-json.md +0 -1
  14. package/docs/de/releases/v9.md +35 -12
  15. package/docs/en/dynamic_dictionaries/index.md +20 -14
  16. package/docs/en/dynamic_dictionaries/variants.md +266 -8
  17. package/docs/en/plugins/sync-json.md +0 -1
  18. package/docs/en/releases/v9.md +35 -12
  19. package/docs/en-GB/dynamic_dictionaries/index.md +21 -15
  20. package/docs/en-GB/dynamic_dictionaries/variants.md +268 -10
  21. package/docs/en-GB/plugins/sync-json.md +0 -1
  22. package/docs/en-GB/releases/v9.md +35 -12
  23. package/docs/es/dynamic_dictionaries/index.md +25 -19
  24. package/docs/es/dynamic_dictionaries/variants.md +275 -17
  25. package/docs/es/plugins/sync-json.md +0 -1
  26. package/docs/es/releases/v9.md +35 -12
  27. package/docs/fr/dynamic_dictionaries/index.md +26 -20
  28. package/docs/fr/dynamic_dictionaries/variants.md +273 -15
  29. package/docs/fr/plugins/sync-json.md +0 -1
  30. package/docs/fr/releases/v9.md +35 -12
  31. package/docs/hi/dynamic_dictionaries/index.md +28 -22
  32. package/docs/hi/dynamic_dictionaries/variants.md +282 -24
  33. package/docs/hi/plugins/sync-json.md +0 -1
  34. package/docs/hi/releases/v9.md +35 -12
  35. package/docs/id/dynamic_dictionaries/index.md +25 -19
  36. package/docs/id/dynamic_dictionaries/variants.md +274 -16
  37. package/docs/id/plugins/sync-json.md +0 -1
  38. package/docs/id/releases/v9.md +35 -12
  39. package/docs/it/dynamic_dictionaries/index.md +26 -20
  40. package/docs/it/dynamic_dictionaries/variants.md +273 -15
  41. package/docs/it/plugins/sync-json.md +0 -1
  42. package/docs/it/releases/v9.md +35 -12
  43. package/docs/ja/dynamic_dictionaries/index.md +27 -21
  44. package/docs/ja/dynamic_dictionaries/variants.md +276 -18
  45. package/docs/ja/plugins/sync-json.md +0 -1
  46. package/docs/ja/releases/v9.md +35 -12
  47. package/docs/ko/dynamic_dictionaries/index.md +23 -17
  48. package/docs/ko/dynamic_dictionaries/variants.md +273 -15
  49. package/docs/ko/plugins/sync-json.md +0 -1
  50. package/docs/ko/releases/v9.md +35 -12
  51. package/docs/pl/dynamic_dictionaries/index.md +26 -20
  52. package/docs/pl/dynamic_dictionaries/variants.md +275 -17
  53. package/docs/pl/plugins/sync-json.md +0 -1
  54. package/docs/pl/releases/v9.md +35 -12
  55. package/docs/pt/dynamic_dictionaries/index.md +25 -19
  56. package/docs/pt/dynamic_dictionaries/variants.md +276 -18
  57. package/docs/pt/plugins/sync-json.md +0 -1
  58. package/docs/pt/releases/v9.md +35 -12
  59. package/docs/ru/dynamic_dictionaries/index.md +25 -19
  60. package/docs/ru/dynamic_dictionaries/variants.md +277 -19
  61. package/docs/ru/plugins/sync-json.md +0 -1
  62. package/docs/ru/releases/v9.md +35 -12
  63. package/docs/tr/dynamic_dictionaries/index.md +27 -21
  64. package/docs/tr/dynamic_dictionaries/variants.md +274 -16
  65. package/docs/tr/plugins/sync-json.md +0 -1
  66. package/docs/tr/releases/v9.md +35 -12
  67. package/docs/uk/dynamic_dictionaries/index.md +25 -19
  68. package/docs/uk/dynamic_dictionaries/variants.md +277 -19
  69. package/docs/uk/plugins/sync-json.md +0 -1
  70. package/docs/uk/releases/v9.md +35 -12
  71. package/docs/vi/dynamic_dictionaries/index.md +28 -22
  72. package/docs/vi/dynamic_dictionaries/variants.md +278 -20
  73. package/docs/vi/plugins/sync-json.md +0 -1
  74. package/docs/vi/releases/v9.md +35 -12
  75. package/docs/zh/dynamic_dictionaries/index.md +24 -18
  76. package/docs/zh/dynamic_dictionaries/variants.md +274 -16
  77. package/docs/zh/plugins/sync-json.md +0 -1
  78. package/docs/zh/releases/v9.md +35 -12
  79. package/package.json +6 -6
  80. package/src/generated/docs.entry.ts +0 -20
  81. package/docs/ar/dynamic_dictionaries/dynamic_content.md +0 -271
  82. package/docs/de/dynamic_dictionaries/dynamic_content.md +0 -271
  83. package/docs/en/dynamic_dictionaries/dynamic_content.md +0 -271
  84. package/docs/en-GB/dynamic_dictionaries/dynamic_content.md +0 -271
  85. package/docs/es/dynamic_dictionaries/dynamic_content.md +0 -271
  86. package/docs/fr/dynamic_dictionaries/dynamic_content.md +0 -271
  87. package/docs/hi/dynamic_dictionaries/dynamic_content.md +0 -271
  88. package/docs/id/dynamic_dictionaries/dynamic_content.md +0 -271
  89. package/docs/it/dynamic_dictionaries/dynamic_content.md +0 -271
  90. package/docs/ja/dynamic_dictionaries/dynamic_content.md +0 -271
  91. package/docs/ko/dynamic_dictionaries/dynamic_content.md +0 -271
  92. package/docs/pl/dynamic_dictionaries/dynamic_content.md +0 -271
  93. package/docs/pt/dynamic_dictionaries/dynamic_content.md +0 -271
  94. package/docs/ru/dynamic_dictionaries/dynamic_content.md +0 -271
  95. package/docs/tr/dynamic_dictionaries/dynamic_content.md +0 -271
  96. package/docs/uk/dynamic_dictionaries/dynamic_content.md +0 -271
  97. package/docs/vi/dynamic_dictionaries/dynamic_content.md +0 -271
  98. 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-12
3
+ updatedAt: 2026-06-26
4
4
  title: Variantes
5
- description: Utilisez le champ de métadonnées de variante dans les fichiers de contenu Intlayer pour déclarer des alternatives de contenu nommées (tests A/B, bannières saisonnières, texte avec feature flags) et basculez entre elles au moment de l'exécution sans modification de code.
5
+ description: Utilisez le champ de métadonnées variant dans les fichiers de contenu Intlayer pour déclarer des alternatives de contenu nommées ou structurées — tests A/B, bannières saisonnières, contenu sous feature flag, enregistrements de CMS, contenu propre à un utilisateur — et basculer entre elles à l'exécution sans changement de code.
6
6
  keywords:
7
7
  - Variantes
8
8
  - Tests A/B
9
9
  - Feature Flags
10
- - Contenu Dynamique
10
+ - Contenu dynamique
11
+ - Enregistrements dynamiques
12
+ - CMS
11
13
  - Intlayer
12
14
  - Internationalisation
13
15
  slugs:
@@ -17,15 +19,25 @@ slugs:
17
19
  history:
18
20
  - version: 9.0.0
19
21
  date: 2026-06-12
20
- changes: "Lancement de la fonctionnalité des variantes de dictionnaires"
22
+ changes: "Sortie de la fonctionnalité des variantes"
23
+ - version: 9.1.0
24
+ date: 2026-06-26
25
+ changes: "`variant` accepte désormais une chaîne ou un objet — les anciens `meta` / enregistrements dynamiques se déclarent comme variantes objet"
21
26
  author: aymericzip
22
27
  ---
23
28
 
24
29
  # Variantes
25
30
 
26
- Une **variante** est un ensemble de fichiers de contenu qui partagent la même clé de dictionnaire (`key`) mais portent chacun un nom de variante (`variant`) différent. Intlayer sert le fichier approprié en fonction du sélecteur passé à `useIntlayer`.
31
+ Une **variante** est un ensemble de fichiers de contenu qui partagent la même clé de dictionnaire (`key`) mais portent chacun une valeur `variant` différente. Intlayer sert le fichier approprié en fonction du sélecteur passé à `useIntlayer`.
27
32
 
28
- ## Déclarer des variantes
33
+ La valeur `variant` peut prendre **deux formes** :
34
+
35
+ - **Une chaîne** — une seule alternative nommée (tests A/B, bannières saisonnières, feature flags).
36
+ - **Un objet** — un discriminant structuré adressé par un ensemble de champs (enregistrements de CMS, contenu propre à un utilisateur, tout contenu indexé par un identifiant opaque). L'objet entier constitue l'identité : le sélecteur doit fournir un objet **égal** pour résoudre l'entrée.
37
+
38
+ > La forme objet remplace l'ancien champ `meta`. Partout où vous écriviez `meta: { id, … }`, écrivez `variant: { id, … }`, et sélectionnez-la avec `{ variant: { id, … } }`.
39
+
40
+ ## Variantes nommées (chaîne)
29
41
 
30
42
  Chaque fichier représente une alternative nommée. Omettre `variant` (ou le définir sur `"default"`) le marque comme valeur par défaut (fallback).
31
43
 
@@ -65,9 +77,9 @@ const dictionary = {
65
77
  export default dictionary;
66
78
  ```
67
79
 
68
- ## Consommer des variantes
80
+ ### Consommer des variantes nommées
69
81
 
70
- ### Variante par défaut
82
+ #### Variante par défaut
71
83
 
72
84
  <Tabs group="framework">
73
85
  <Tab label="React" value="react">
@@ -209,7 +221,7 @@ export default dictionary;
209
221
  </Tab>
210
222
  </Tabs>
211
223
 
212
- ### Variante nommée
224
+ #### Variante nommée
213
225
 
214
226
  ```tsx
215
227
  const { headline, cta } = useIntlayer("hero-banner", {
@@ -217,7 +229,7 @@ const { headline, cta } = useIntlayer("hero-banner", {
217
229
  });
218
230
  ```
219
231
 
220
- ### Variante nommée avec locale explicite
232
+ #### Variante nommée avec locale explicite
221
233
 
222
234
  ```tsx
223
235
  const content = useIntlayer("hero-banner", {
@@ -226,9 +238,255 @@ const content = useIntlayer("hero-banner", {
226
238
  });
227
239
  ```
228
240
 
229
- ## Cas d'utilisation typiques
241
+ ## Variantes objet (structurées)
242
+
243
+ Une variante objet adresse le contenu par un ensemble arbitraire de paires clé-valeur déclarées dans le champ `variant` — permettant de modéliser des enregistrements de CMS, du contenu propre à un utilisateur ou tout contenu dont la clé est un identifiant opaque. L'**objet entier** constitue l'identité : le sélecteur doit fournir un objet égal pour que l'entrée soit résolue.
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
+ ### Consommer des variantes objet
276
+
277
+ Passez l'objet correspondant à `variant`. Chaque champ déclaré sur le dictionnaire doit être fourni et égal ; sinon le résultat est `null`. L'ordre des champs n'a pas d'importance.
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
+ #### Avec une locale explicite
452
+
453
+ ```tsx
454
+ const content = useIntlayer("product", {
455
+ variant: { id: "prod_abc", userId: "user_123" },
456
+ locale: "fr",
457
+ });
458
+ ```
459
+
460
+ #### Champ manquant — aucune correspondance
461
+
462
+ ```ts
463
+ // Renvoie null : `userId` est manquant, donc l'objet ne correspond pas à la variante déclarée
464
+ const content = useIntlayer("product", { variant: { id: "prod_abc" } });
465
+ ```
466
+
467
+ ## Mode de chargement
468
+
469
+ Les variantes objet sont souvent chargées de façon différée. Définissez `importMode` sur le dictionnaire pour contrôler ce comportement :
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
+ Voir [optimisation du bundle](https://github.com/aymericzip/intlayer/blob/main/docs/docs/fr/bundle_optimization.md) pour les détails sur les modes `static`, `dynamic` et `fetch`.
483
+
484
+ ## Cas d'usage typiques
230
485
 
231
- - Tests A/B pilotés par une clé d'expérimentation
232
- - Bannières promotionnelles ou saisonnières
233
- - Messages soumis à des feature flags
234
- - Campagnes marketing spécifiques à une zone géographique
486
+ - Tests A/B de texte pilotés par une clé d'expérience
487
+ - Bannières saisonnières ou promotionnelles
488
+ - Messages sous feature flag
489
+ - Campagnes marketing spécifiques à une locale
490
+ - Texte marketing par produit géré dans un CMS
491
+ - Contenu propre à un utilisateur ou à un compte
492
+ - Tout contenu indexé par un identifiant opaque à l'exécution
@@ -108,7 +108,6 @@ const config: IntlayerConfig = {
108
108
  * Chargera et écrira la sortie et les traductions dans les fichiers JSON du répertoire locales
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",
@@ -1,15 +1,14 @@
1
1
  ---
2
2
  createdAt: 2026-06-14
3
- updatedAt: 2026-06-25
3
+ updatedAt: 2026-06-26
4
4
  title: Nouvel Intlayer v9 - Quoi de neuf ?
5
- description: Découvrez les nouveautés d'Intlayer v9. Présentation des packages de compatibilité prêts à l'emploi pour les bibliothèques i18n populaires et prise en charge des Collections, Variants et Dynamic Records.
5
+ description: Découvrez les nouveautés d'Intlayer v9. Présentation des packages de compatibilité prêts à l'emploi pour les bibliothèques i18n populaires et prise en charge des Collections et 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
  # Nouvel Intlayer v9 - Quoi de neuf ?
24
23
 
25
- Bienvenue sur Intlayer v9 ! Cette version majeure marque une étape importante dans la simplification du chemin de migration vers Intlayer avec les **packages d'adaptateurs de compatibilité** pour les principales bibliothèques i18n (`react-i18next`, `next-intl`, `vue-i18n`, etc.) et ajoute la prise en charge de structures de contenu riches : les **Collections**, les **Variants** et les **Dynamic Records**.
24
+ Bienvenue sur Intlayer v9 ! Cette version majeure marque une étape importante dans la simplification du chemin de migration vers Intlayer avec les **packages d'adaptateurs de compatibilité** pour les principales bibliothèques i18n (`react-i18next`, `next-intl`, `vue-i18n`, etc.) et ajoute la prise en charge de structures de contenu riches : les **Collections** et les **Variants**.
26
25
 
27
26
  ## Table des matières
28
27
 
@@ -41,8 +40,10 @@ En remplaçant les imports, vous bénéficiez de tous les avantages d'Intlayer (
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
  Par exemple, changez simplement :
48
49
 
@@ -100,7 +101,7 @@ Tous les adaptateurs de compatibilité acheminent désormais la résolution des
100
101
 
101
102
  ---
102
103
 
103
- ## Spécification des fonctionnalités : Collections, Variants & Dynamic Records
104
+ ## Spécification des fonctionnalités : Collections & Variants
104
105
 
105
106
  Intlayer v9 va au-delà des objets clé-valeur statiques, permettant aux dictionnaires de déclarer des structures de mise en page dynamiques entièrement typées de bout en bout.
106
107
 
@@ -136,6 +137,8 @@ const faq = useIntlayer("faq", { item: 1 }); // -> { question: string, answer: s
136
137
 
137
138
  Proposez des tests A/B, des en-têtes saisonniers, des feature flags ou des pages de destination personnalisées :
138
139
 
140
+ #### Variantes de chaîne (ex. tests A/B)
141
+
139
142
  ```ts fileName="hero.content.ts"
140
143
  import { t, type Dictionary } from "intlayer";
141
144
 
@@ -155,16 +158,14 @@ export default {
155
158
  const banner = useIntlayer("hero-banner", { variant: "black_friday" });
156
159
  ```
157
160
 
158
- ### 3. Dynamic Records
159
-
160
- Définissez des dictionnaires dont les entrées sont chargées dynamiquement au moment de l'exécution via des ID de requête :
161
+ #### Variantes d'objet (ex. Dynamic Records)
161
162
 
162
163
  ```ts fileName="product.content.ts"
163
164
  import { t, type Dictionary } from "intlayer";
164
165
 
165
166
  export default {
166
167
  key: "product-copy",
167
- meta: {
168
+ variant: {
168
169
  id: "prod_123",
169
170
  category: "books",
170
171
  },
@@ -217,7 +218,7 @@ export default defineConfig({
217
218
  });
218
219
  ```
219
220
 
220
- - **Compilateur** : S'active automatiquement lorsque `compiler.enabled` est défini et qu'un chemin `compiler.output` est configuré. Vous n'avez plus besoin d'enregistrer `intlayerCompiler()` séparément.
221
+ - **Compilateur** : S'active automatiquement lorsque `compiler.enabled` est défini à `true` et qu'un chemin `compiler.output` est configuré. Vous n'avez plus besoin d'enregistrer `intlayerCompiler()` séparément.
221
222
  - **Proxy** : S'active automatiquement en fonction de la nouvelle option `routing.enableProxy` (`true` par défaut). Il connecte le middleware de détection de locale / redirection / réécriture en développement, en aperçu et en SSR de production. Vous n'avez plus besoin d'enregistrer `intlayerProxy()` séparément.
222
223
 
223
224
  ### Option `routing.enableProxy`
@@ -240,6 +241,27 @@ Les plugins autonomes `intlayerCompiler()` et `intlayerProxy()` restent exporté
240
241
 
241
242
  ---
242
243
 
244
+ ## Compilateur désactivé par défaut
245
+
246
+ Depuis Intlayer v9, le **compilateur est désactivé par défaut** (`compiler.enabled` vaut désormais `false` par défaut). Pour activer l'extraction de vos fichiers `.content.ts` au moment du build, définissez `compiler.enabled: true` dans votre configuration :
247
+
248
+ ```ts fileName="intlayer.config.ts"
249
+ import type { IntlayerConfig } from "intlayer";
250
+
251
+ const config: IntlayerConfig = {
252
+ compiler: {
253
+ enabled: true, // Par défaut : false — requis pour activer le compilateur depuis la v9
254
+ output: ({ fileName }) => `./${fileName}.content.ts`,
255
+ },
256
+ };
257
+
258
+ export default config;
259
+ ```
260
+
261
+ Lorsque le compilateur est désactivé, Intlayer ignore l'étape d'extraction au build et s'appuie sur vos dictionnaires déjà déclarés. Activez-le uniquement lorsque vous souhaitez que le plugin de bundler (`@intlayer/swc`, `@intlayer/babel`, ou le plugin Vite `intlayer()`) extraie le contenu automatiquement.
262
+
263
+ ---
264
+
243
265
  ## React Native : imports depuis un seul package
244
266
 
245
267
  Dans une application React Native ou Expo, vous n'avez plus besoin de jongler entre `react-intlayer` et `react-native-intlayer`. Le package `react-native-intlayer` **réexporte désormais l'intégralité de l'API `react-intlayer`** (hooks, utilitaires et les sous-chemins `/format`, `/html`, et `/markdown`), et son `IntlayerProvider` applique automatiquement les polyfills React Native.
@@ -266,13 +288,14 @@ npm install intlayer react-native-intlayer
266
288
 
267
289
  Si vous effectuez une mise à niveau depuis la v8, notez que la v9 n'inclut pas de changements majeurs (breaking changes). Voici cependant les changements clés :
268
290
 
291
+ - **Compilateur désactivé par défaut** : `compiler.enabled` vaut désormais `false` par défaut. Si vous dépendez de l'extraction de vos fichiers `.content.ts` au build, définissez `compiler.enabled: true` dans votre `intlayer.config.ts`.
269
292
  - **Locales et dialectes** : Si vous utilisez des dépendances i18n externes, ajoutez leurs plugins d'adaptateur de compatibilité respectifs dans votre configuration ou votre setup de bundler pour réécrire automatiquement les imports.
270
- - **Sélecteurs personnalisés** : Lors de l'appel de `useIntlayer`, le deuxième paramètre est désormais réservé à un objet d'options contenant `{ locale, item, variant, id }`. Si vous passiez auparavant une chaîne de caractères de locale directement, vous pouvez toujours le faire, mais l'utilisation de l'objet d'options est recommandée pour les sélections avancées.
293
+ - **Sélecteurs personnalisés** : Lors de l'appel de `useIntlayer`, le deuxième paramètre est désormais réservé à un objet d'options contenant `{ locale, item, variant }`. Si vous passiez auparavant une chaîne de caractères de locale directement, vous pouvez toujours le faire, mais l'utilisation de l'objet d'options est recommandée pour les sélections avancées.
271
294
 
272
295
  ---
273
296
 
274
297
  ## Liens utiles
275
298
 
276
299
  - [Guide des packages d'adaptateurs de compatibilité](https://github.com/aymericzip/intlayer/blob/main/docs/docs/fr/compat/index.md)
277
- - [Dictionnaires dynamiques - Collections, Variants & Dynamic Records](https://github.com/aymericzip/intlayer/blob/main/docs/docs/fr/dynamic_dictionaries/index.md)
300
+ - [Dictionnaires dynamiques - Collections & Variants](https://github.com/aymericzip/intlayer/blob/main/docs/docs/fr/dynamic_dictionaries/index.md)
278
301
  - [Référence de configuration](https://github.com/aymericzip/intlayer/blob/main/docs/docs/fr/configuration.md)
@@ -1,13 +1,12 @@
1
1
  ---
2
2
  createdAt: 2026-06-12
3
- updatedAt: 2026-06-12
4
- title: डायनेमिक डिक्शनरीज़
5
- description: लचीली, रनटाइम-संचालित i18n सामग्री के निर्माण के लिए Intlayer की तीन डायनेमिक डिक्शनरी सुविधाओं — संग्रह, वेरिएंट और डायनेमिक रिकॉर्ड का अवलोकन।
3
+ updatedAt: 2026-06-26
4
+ title: डायनेमिक डिक्शनरी
5
+ description: Intlayer की डायनेमिक डिक्शनरी सुविधाओं — कलेक्शन और वैरिएंट का अवलोकन, लचीली, रनटाइम-संचालित i18n सामग्री बनाने के लिए।
6
6
  keywords:
7
- - डायनेमिक डिक्शनरीज़
8
- - संग्रह
9
- - वेरिएंट
10
- - डायनेमिक रिकॉर्ड
7
+ - डायनेमिक डिक्शनरी
8
+ - कलेक्शन
9
+ - वैरिएंट
11
10
  - Intlayer
12
11
  - अंतर्राष्ट्रीयकरण
13
12
  slugs:
@@ -17,32 +16,39 @@ slugs:
17
16
  history:
18
17
  - version: 9.0.0
19
18
  date: 2026-06-12
20
- changes: "डायनेमिक डिक्शनरी सुविधा का विमोचन"
19
+ changes: "डायनेमिक डिक्शनरी सुविधा का रिलीज़"
20
+ - version: 9.1.0
21
+ date: 2026-06-26
22
+ changes: "डायनेमिक रिकॉर्ड को वैरिएंट में मिला दिया गया — अब `variant` एक स्ट्रिंग या ऑब्जेक्ट स्वीकार करता है"
21
23
  author: aymericzip
22
24
  ---
23
25
 
24
- # डायनेमिक डिक्शनरीज़
26
+ # डायनेमिक डिक्शनरी
25
27
 
26
- Intlayer सामग्री को व्यक्त करने के लिए तीन तंत्रों का समर्थन करता है जो प्रति कुंजी एकल स्थिर डिक्शनरी से परे जाते हैं। प्रत्येक को सामग्री फ़ाइल में **शीर्ष-स्तरीय मेटाडेटा फ़ील्ड** के माध्यम से घोषित किया जाता है; किसी रैपर फ़ंक्शन की आवश्यकता नहीं होती है।
28
+ Intlayer ऐसी सामग्री व्यक्त करने के लिए दो तंत्रों का समर्थन करता है जो प्रति key एक ही स्थिर डिक्शनरी से आगे जाती है। प्रत्येक को सामग्री फ़ाइल में एक **शीर्ष-स्तरीय मेटाडेटा फ़ील्ड** के माध्यम से घोषित किया जाता है; किसी रैपर फ़ंक्शन की आवश्यकता नहीं है।
27
29
 
28
- | विशेषता | मेटाडेटा फ़ील्ड | `useIntlayer` में चयनकर्ता |
29
- | ------------------------------------------------------------------------------------------------------------------------- | ----------------- | -------------------------- |
30
- | [संग्रह](https://github.com/aymericzip/intlayer/blob/main/docs/docs/hi/dynamic_dictionaries/collections.md) | `item: N` | `{ item: N }` |
31
- | [वेरिएंट](https://github.com/aymericzip/intlayer/blob/main/docs/docs/hi/dynamic_dictionaries/variants.md) | `variant: "name"` | `{ variant: "name" }` |
32
- | [डायनेमिक रिकॉर्ड](https://github.com/aymericzip/intlayer/blob/main/docs/docs/hi/dynamic_dictionaries/dynamic_content.md) | `meta: { id, … }` | `{ id, … }` |
30
+ | सुविधा | मेटाडेटा फ़ील्ड | `useIntlayer` में सेलेक्टर |
31
+ | ------------------------------------------------------------------------------------------------------------ | --------------------------------------- | ----------------------------------------------- |
32
+ | [कलेक्शन](https://github.com/aymericzip/intlayer/blob/main/docs/docs/hi/dynamic_dictionaries/collections.md) | `item: N` | `{ item: N }` |
33
+ | [वैरिएंट](https://github.com/aymericzip/intlayer/blob/main/docs/docs/hi/dynamic_dictionaries/variants.md) | `variant: "name"` _या_ `variant: { … }` | `{ variant: "name" }` _या_ `{ variant: { … } }` |
33
34
 
34
- तीनों भाषा विकल्प (locale) तर्क के साथ मिलकर काम करते हैं और `importMode` के माध्यम से चुनिंदा / आलसी (lazy) लोडिंग का समर्थन करते हैं।
35
+ दोनों locale तर्क के साथ संयोजित होते हैं और `importMode` के माध्यम से चयनात्मक / आलसी लोडिंग का समर्थन करते हैं।
35
36
 
36
37
  ## कब किसका उपयोग करें
37
38
 
38
- - **संग्रह (Collections)** अलग फ़ाइलों में प्रबंधित वस्तुओं की क्रमबद्ध सूची (FAQ प्रविष्टियां, ब्लॉग पोस्ट, उत्पाद)।
39
- - **वेरिएंट (Variants)** A/B परीक्षण, मौसमी बैनर, या फीचर फ़्लैग के लिए नामांकित सामग्री विकल्प।
40
- - **डायनेमिक रिकॉर्ड (Dynamic records)** अपारदर्शी आईडी द्वारा रनटाइम पर प्राप्त सामग्री (CMS रिकॉर्ड, उपयोगकर्ता-विशिष्ट प्रतिलिपि)।
39
+ - **कलेक्शन**अलग-अलग फ़ाइलों में प्रबंधित आइटम की क्रमबद्ध सूची (FAQ प्रविष्टियाँ, ब्लॉग पोस्ट, उत्पाद)।
40
+ - **वैरिएंट**नामित या संरचित सामग्री विकल्प:
41
+ - A/B परीक्षण, मौसमी बैनर या फ़ीचर फ़्लैग के लिए एक **स्ट्रिंग** वैरिएंट;
42
+ - CMS रिकॉर्ड, उपयोगकर्ता-विशिष्ट सामग्री, या फ़ील्ड के सेट द्वारा संबोधित किसी भी सामग्री के लिए एक **ऑब्जेक्ट** वैरिएंट (पूर्व "डायनेमिक रिकॉर्ड")।
41
43
 
42
- ## चयनकर्ता स्पष्टीकरण
44
+ > पुराने संस्करण रिकॉर्ड-कुंजीबद्ध सामग्री के लिए एक अलग `meta` फ़ील्ड प्रदान करते थे। इसे `variant` में मिला दिया गया है: `meta` का उपयोग करने के बजाय `variant` में एक **ऑब्जेक्ट** पास करें।
43
45
 
44
- जब किसी डिक्शनरी पर एकाधिक चयनकर्ता मौजूद होते हैं, तो रिज़ॉल्यूशन का क्रम होता है:
46
+ ## सेलेक्टर असंदिग्धीकरण
47
+
48
+ एक key एक साथ दोनों आयाम घोषित कर सकती है (उदा. एक कलेक्शन जिसके प्रत्येक आइटम का एक वैरिएंट हो)। इन्हें इस क्रम में हल किया जाता है:
45
49
 
46
50
  ```
47
- variant → meta → item
51
+ variant → item
48
52
  ```
53
+
54
+ इस प्रकार, किसी variant × item key पर `{ variant: "promo" }` सभी promo आइटम को एक array के रूप में लौटाता है, और `{ item: 2 }` जोड़ने से यह एक ही प्रविष्टि तक सीमित हो जाता है।