@intlayer/docs 9.1.0 → 9.1.2
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/docs/ar/dynamic_dictionaries/variants.md +248 -5
- package/docs/de/dynamic_dictionaries/variants.md +208 -1
- package/docs/en/dynamic_dictionaries/variants.md +208 -1
- package/docs/en-GB/dynamic_dictionaries/variants.md +208 -1
- package/docs/es/dynamic_dictionaries/variants.md +208 -1
- package/docs/fr/dynamic_dictionaries/variants.md +208 -1
- package/docs/hi/dynamic_dictionaries/variants.md +210 -3
- package/docs/id/dynamic_dictionaries/variants.md +208 -1
- package/docs/it/dynamic_dictionaries/variants.md +209 -2
- package/docs/ja/dynamic_dictionaries/variants.md +209 -2
- package/docs/ko/dynamic_dictionaries/variants.md +209 -2
- package/docs/pl/dynamic_dictionaries/variants.md +209 -2
- package/docs/pt/dynamic_dictionaries/variants.md +208 -1
- package/docs/ru/dynamic_dictionaries/variants.md +209 -2
- package/docs/tr/dynamic_dictionaries/variants.md +209 -2
- package/docs/uk/dynamic_dictionaries/variants.md +208 -1
- package/docs/vi/dynamic_dictionaries/variants.md +210 -3
- package/docs/zh/dynamic_dictionaries/variants.md +209 -2
- package/package.json +6 -6
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2026-06-12
|
|
3
|
-
updatedAt: 2026-
|
|
3
|
+
updatedAt: 2026-08-04
|
|
4
4
|
title: المتغيرات
|
|
5
5
|
description: استخدم حقل البيانات الوصفية variant في ملفات محتوى Intlayer لإعلان بدائل محتوى مُسمّاة أو منظّمة — اختبارات A/B، لافتات موسمية، نصوص بأعلام الميزات، سجلات CMS، محتوى خاص بالمستخدم — والتبديل بينها في وقت التشغيل دون تغييرات في الشيفرة.
|
|
6
6
|
keywords:
|
|
@@ -22,7 +22,13 @@ history:
|
|
|
22
22
|
changes: "إصدار ميزة المتغيرات"
|
|
23
23
|
- version: 9.1.0
|
|
24
24
|
date: 2026-06-26
|
|
25
|
-
changes: "
|
|
25
|
+
changes: "تقبل `variant` الآن سلسلة أو كائنًا — تُعلن السجلات الديناميكية أو `meta` السابقة كمتغيرات كائنات"
|
|
26
|
+
- version: 9.1.1
|
|
27
|
+
date: 2026-07-31
|
|
28
|
+
changes: "تُعرّف المتغيرة فقط المفاتيح التي تتجاوزها؛ بينما تتراجع المتغيرات غير المُعرّفة إلى الإدخال الافتراضي"
|
|
29
|
+
- version: 9.1.2
|
|
30
|
+
date: 2026-08-04
|
|
31
|
+
changes: "تقبل المزوِّدات خاصية `variant` محيطية؛ وتقبل المحدِّدات سلسلة تفضيل مرتَّبة"
|
|
26
32
|
author: aymericzip
|
|
27
33
|
---
|
|
28
34
|
|
|
@@ -37,9 +43,9 @@ author: aymericzip
|
|
|
37
43
|
|
|
38
44
|
> يحلّ الشكل الكائني محل حقل `meta` السابق. في كل مكان كنت تكتب فيه سابقًا `meta: { id, … }`، اكتب `variant: { id, … }`، وحدّدها بـ `{ variant: { id, … } }`.
|
|
39
45
|
|
|
40
|
-
## المتغيرات
|
|
46
|
+
## المتغيرات المسماة (سلسلة نصية)
|
|
41
47
|
|
|
42
|
-
يمثّل كل ملف بديلًا مُسمّى واحدًا.
|
|
48
|
+
يمثّل كل ملف بديلًا مُسمّى واحدًا. وإغفال `variant` (أو ضبطه على `"default"`) يجعله البديل الاحتياطي.
|
|
43
49
|
|
|
44
50
|
```ts fileName="hero-banner.content.ts" contentDeclarationFormat={["typescript", "esm", "commonjs"]}
|
|
45
51
|
import { t, type Dictionary } from "intlayer";
|
|
@@ -77,10 +83,77 @@ const dictionary = {
|
|
|
77
83
|
export default dictionary;
|
|
78
84
|
```
|
|
79
85
|
|
|
80
|
-
###
|
|
86
|
+
### المتغيرات الجزئية
|
|
87
|
+
|
|
88
|
+
تُعرّف المتغيرة **فقط المفاتيح التي تتجاوزها**؛ ويتم وراثة الباقي من الإدخال الافتراضي.
|
|
89
|
+
|
|
90
|
+
```ts fileName="hero-banner.summer.content.ts" contentDeclarationFormat={["typescript", "esm", "commonjs"]}
|
|
91
|
+
import { t, type Dictionary } from "intlayer";
|
|
92
|
+
|
|
93
|
+
const dictionary = {
|
|
94
|
+
key: "hero-banner",
|
|
95
|
+
variant: "summer",
|
|
96
|
+
content: {
|
|
97
|
+
headline: t({
|
|
98
|
+
en: "Build faster all summer",
|
|
99
|
+
fr: "Développez plus vite tout l'été",
|
|
100
|
+
}),
|
|
101
|
+
},
|
|
102
|
+
} satisfies Dictionary;
|
|
103
|
+
|
|
104
|
+
export default dictionary;
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
```tsx
|
|
108
|
+
useIntlayer("hero-banner", { variant: "summer" });
|
|
109
|
+
// → { headline: "Développez plus vite tout l'été", cta: "Commencer" } — تم وراثة `cta`
|
|
110
|
+
|
|
111
|
+
useIntlayer("hero-banner", { variant: "never-declared" });
|
|
112
|
+
// → الإدخال الافتراضي
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
لذلك لا تضيف ملف متغيرة إلا عندما تختلف الصياغة بالفعل. يتحول المفتاح إلى `null` فقط عندما يُعرّف متغيرات ولكن دون إدخال افتراضي.
|
|
116
|
+
|
|
117
|
+
### استخدام المتغيرات المسماة
|
|
81
118
|
|
|
82
119
|
#### المتغير الافتراضي
|
|
83
120
|
|
|
121
|
+
```ts fileName="hero-banner.content.ts" contentDeclarationFormat={["typescript", "esm", "commonjs"]}
|
|
122
|
+
import { t, type Dictionary } from "intlayer";
|
|
123
|
+
|
|
124
|
+
const dictionary = {
|
|
125
|
+
key: "hero-banner",
|
|
126
|
+
variant: "default",
|
|
127
|
+
content: {
|
|
128
|
+
headline: t({
|
|
129
|
+
en: "Build faster with Intlayer",
|
|
130
|
+
fr: "Développez plus vite avec Intlayer",
|
|
131
|
+
}),
|
|
132
|
+
cta: t({ en: "Get started", fr: "Commencer" }),
|
|
133
|
+
},
|
|
134
|
+
} satisfies Dictionary;
|
|
135
|
+
|
|
136
|
+
export default dictionary;
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
```ts fileName="hero-banner.black-friday.content.ts" contentDeclarationFormat={["typescript", "esm", "commonjs"]}
|
|
140
|
+
import { t, type Dictionary } from "intlayer";
|
|
141
|
+
|
|
142
|
+
const dictionary = {
|
|
143
|
+
key: "hero-banner",
|
|
144
|
+
variant: "black_friday",
|
|
145
|
+
content: {
|
|
146
|
+
headline: t({
|
|
147
|
+
en: "50 % off — today only",
|
|
148
|
+
fr: "−50 % — aujourd'hui seulement",
|
|
149
|
+
}),
|
|
150
|
+
cta: t({ en: "Shop now", fr: "Acheter maintenant" }),
|
|
151
|
+
},
|
|
152
|
+
} satisfies Dictionary;
|
|
153
|
+
|
|
154
|
+
export default dictionary;
|
|
155
|
+
```
|
|
156
|
+
|
|
84
157
|
<Tabs group="framework">
|
|
85
158
|
<Tab label="React" value="react">
|
|
86
159
|
```tsx fileName="Hero.tsx" contentDeclarationFormat={["typescript", "esm", "commonjs"]}
|
|
@@ -464,6 +537,176 @@ const content = useIntlayer("product", {
|
|
|
464
537
|
const content = useIntlayer("product", { variant: { id: "prod_abc" } });
|
|
465
538
|
```
|
|
466
539
|
|
|
540
|
+
## المتغير المحيطي
|
|
541
|
+
|
|
542
|
+
بعض أبعاد المتغيرات ثابتة طوال الجلسة — المستأجر، ونوع المدرسة، ومستوى الخطة. تُحلّ مرة واحدة، ولا ينبغي لأي مكوّن أن يمررها يدويًا.
|
|
543
|
+
|
|
544
|
+
> لا تغلّف `useIntlayer` داخل خطّاف خاص بك لحقنها. فتحسين وقت البناء لا يعيد كتابة سوى استدعاء `useIntlayer("key")` الحرفي المستورد من حزمة إطار العمل، لذا لن يُحزَم أي شيء خلف غلاف.
|
|
545
|
+
|
|
546
|
+
بدلًا من ذلك، صرّح عن المتغير مرة واحدة على المزوِّد، تمامًا مثل `locale`:
|
|
547
|
+
|
|
548
|
+
<Tabs group="framework">
|
|
549
|
+
<Tab label="React" value="react">
|
|
550
|
+
```tsx fileName="App.tsx" contentDeclarationFormat={["typescript", "esm", "commonjs"]}
|
|
551
|
+
import { IntlayerProvider } from "react-intlayer";
|
|
552
|
+
|
|
553
|
+
export const App = ({ locale, schoolType }) => (
|
|
554
|
+
<IntlayerProvider locale={locale} variant={schoolType}>
|
|
555
|
+
<Hero />
|
|
556
|
+
</IntlayerProvider>
|
|
557
|
+
);
|
|
558
|
+
```
|
|
559
|
+
|
|
560
|
+
</Tab>
|
|
561
|
+
<Tab label="Next.js" value="nextjs">
|
|
562
|
+
```tsx fileName="layout.tsx" contentDeclarationFormat={["typescript", "esm", "commonjs"]}
|
|
563
|
+
import { IntlayerServerProvider } from "next-intlayer/server";
|
|
564
|
+
import { IntlayerClientProvider } from "next-intlayer";
|
|
565
|
+
|
|
566
|
+
export default async function Layout({ children, params }) {
|
|
567
|
+
const { locale } = await params;
|
|
568
|
+
const schoolType = await getSchoolType();
|
|
569
|
+
|
|
570
|
+
return (
|
|
571
|
+
<IntlayerServerProvider locale={locale} variant={schoolType}>
|
|
572
|
+
<IntlayerClientProvider locale={locale} variant={schoolType}>
|
|
573
|
+
{children}
|
|
574
|
+
</IntlayerClientProvider>
|
|
575
|
+
</IntlayerServerProvider>
|
|
576
|
+
);
|
|
577
|
+
}
|
|
578
|
+
```
|
|
579
|
+
|
|
580
|
+
</Tab>
|
|
581
|
+
<Tab label="Vue" value="vue">
|
|
582
|
+
```ts fileName="main.ts" contentDeclarationFormat={["typescript", "esm", "commonjs"]}
|
|
583
|
+
import { createApp } from "vue";
|
|
584
|
+
import { installIntlayer } from "vue-intlayer";
|
|
585
|
+
import App from "./App.vue";
|
|
586
|
+
|
|
587
|
+
const app = createApp(App);
|
|
588
|
+
|
|
589
|
+
installIntlayer(app, { locale: "en", variant: schoolType });
|
|
590
|
+
|
|
591
|
+
app.mount("#app");
|
|
592
|
+
```
|
|
593
|
+
|
|
594
|
+
</Tab>
|
|
595
|
+
<Tab label="Svelte" value="svelte">
|
|
596
|
+
```svelte fileName="+layout.svelte" contentDeclarationFormat={["typescript", "esm", "commonjs"]}
|
|
597
|
+
<script lang="ts">
|
|
598
|
+
import { setupIntlayer } from "svelte-intlayer";
|
|
599
|
+
|
|
600
|
+
export let schoolType: string;
|
|
601
|
+
|
|
602
|
+
setupIntlayer("en", schoolType);
|
|
603
|
+
</script>
|
|
604
|
+
|
|
605
|
+
<slot />
|
|
606
|
+
```
|
|
607
|
+
|
|
608
|
+
</Tab>
|
|
609
|
+
<Tab label="Preact" value="preact">
|
|
610
|
+
```tsx fileName="App.tsx" contentDeclarationFormat={["typescript", "esm", "commonjs"]}
|
|
611
|
+
import { IntlayerProvider } from "preact-intlayer";
|
|
612
|
+
|
|
613
|
+
export const App = ({ locale, schoolType }) => (
|
|
614
|
+
<IntlayerProvider locale={locale} variant={schoolType}>
|
|
615
|
+
<Hero />
|
|
616
|
+
</IntlayerProvider>
|
|
617
|
+
);
|
|
618
|
+
```
|
|
619
|
+
|
|
620
|
+
</Tab>
|
|
621
|
+
<Tab label="Solid" value="solid">
|
|
622
|
+
```tsx fileName="App.tsx" contentDeclarationFormat={["typescript", "esm", "commonjs"]}
|
|
623
|
+
import { IntlayerProvider } from "solid-intlayer";
|
|
624
|
+
|
|
625
|
+
export const App = (props) => (
|
|
626
|
+
<IntlayerProvider locale={props.locale} variant={props.schoolType}>
|
|
627
|
+
<Hero />
|
|
628
|
+
</IntlayerProvider>
|
|
629
|
+
);
|
|
630
|
+
```
|
|
631
|
+
|
|
632
|
+
</Tab>
|
|
633
|
+
<Tab label="Angular" value="angular">
|
|
634
|
+
```typescript fileName="app.config.ts" contentDeclarationFormat={["typescript", "esm", "commonjs"]}
|
|
635
|
+
import { ApplicationConfig } from "@angular/core";
|
|
636
|
+
import { provideIntlayer } from "angular-intlayer";
|
|
637
|
+
|
|
638
|
+
export const appConfig: ApplicationConfig = {
|
|
639
|
+
providers: [provideIntlayer("en", true, schoolType)],
|
|
640
|
+
};
|
|
641
|
+
```
|
|
642
|
+
|
|
643
|
+
</Tab>
|
|
644
|
+
<Tab label="Vanilla JS" value="vanilla">
|
|
645
|
+
```javascript fileName="main.js"
|
|
646
|
+
import { installIntlayer } from "vanilla-intlayer";
|
|
647
|
+
|
|
648
|
+
installIntlayer({ locale: "en", variant: schoolType });
|
|
649
|
+
```
|
|
650
|
+
|
|
651
|
+
</Tab>
|
|
652
|
+
</Tabs>
|
|
653
|
+
|
|
654
|
+
أصبحت كل قراءة قاموس أسفل المزوِّد تُحلّ وفق ذلك المتغير، ويفوز دائمًا المحدِّد الموجود في موضع الاستدعاء:
|
|
655
|
+
|
|
656
|
+
```tsx
|
|
657
|
+
useIntlayer("hero-banner");
|
|
658
|
+
// → متغير المزوِّد
|
|
659
|
+
|
|
660
|
+
useIntlayer("hero-banner", { variant: "summer" });
|
|
661
|
+
// → "summer" — يستبدل متغير المزوِّد ولا يوسّعه
|
|
662
|
+
```
|
|
663
|
+
|
|
664
|
+
### الأشكال
|
|
665
|
+
|
|
666
|
+
تقبل خاصية `variant` ثلاثة أشكال:
|
|
667
|
+
|
|
668
|
+
| الشكل | المعنى |
|
|
669
|
+
| --------------------------------------------------------- | ----------------------------- |
|
|
670
|
+
| `variant="school1"` | متغير مسمّى واحد لكل المفاتيح |
|
|
671
|
+
| `variant={["school1", "default"]}` | سلسلة تفضيل مرتَّبة |
|
|
672
|
+
| `variant={{ "hero-banner": "school1", default: "base" }}` | متغير لكل مفتاح قاموس |
|
|
673
|
+
|
|
674
|
+
#### سلسلة التفضيل
|
|
675
|
+
|
|
676
|
+
تُجرَّب السلسلة من اليسار إلى اليمين مقابل المدخلات التي يصرّح بها كل مفتاح، ويفوز أول مدخل مُصرَّح به. وعندما لا يكون أي منها مُصرَّحًا به، يُستخدم المدخل الافتراضي الضمني — تمامًا كما في حالة القيمة المفردة.
|
|
677
|
+
|
|
678
|
+
```tsx
|
|
679
|
+
<IntlayerProvider variant={["school1", "school2"]} />
|
|
680
|
+
// `hero-banner` لا يصرّح بمدخل `school1` لكنه يصرّح بـ `school2` ← "school2"
|
|
681
|
+
// مفتاح لا يصرّح بأي منهما ← المدخل الافتراضي
|
|
682
|
+
```
|
|
683
|
+
|
|
684
|
+
لذا تُقرأ `["black_friday", "summer"]` على أنها «black friday إن كان لهذا المفتاح واحد، وإلا summer، وإلا الافتراضي». وتُقبل السلاسل أيضًا في موضع الاستدعاء:
|
|
685
|
+
|
|
686
|
+
```tsx
|
|
687
|
+
useIntlayer("hero-banner", { variant: ["black_friday", "summer"] });
|
|
688
|
+
```
|
|
689
|
+
|
|
690
|
+
> لاحظ أن هذا هو الصورة المعكوسة للمصفوفة التي يقبلها **حقل** `variant` في ملف المحتوى: فهناك تُصرِّح المصفوفة بمدخل لكل عنصر، أما هنا فتستهلكها بترتيب الأولوية.
|
|
691
|
+
|
|
692
|
+
#### خريطة لكل مفتاح
|
|
693
|
+
|
|
694
|
+
خاطب كل مفتاح قاموس على حدة. ويغطي المدخل المحجوز `default` كل المفاتيح غير المذكورة:
|
|
695
|
+
|
|
696
|
+
```tsx
|
|
697
|
+
<IntlayerProvider
|
|
698
|
+
variant={{
|
|
699
|
+
"hero-banner": "school1",
|
|
700
|
+
product: ["school1", "default"],
|
|
701
|
+
default: "base",
|
|
702
|
+
}}
|
|
703
|
+
/>
|
|
704
|
+
```
|
|
705
|
+
|
|
706
|
+
> على المزوِّد، يُقرأ الكائن البسيط **دائمًا** كخريطة لكل مفتاح، ولا يُقرأ أبدًا كمتغير كائني — فالاثنان متطابقان بنيويًا. ولتثبيت متغير كائني عالميًا، ضعه متداخلًا تحت مدخل: `variant={{ default: { id: "prod_abc" } }}`.
|
|
707
|
+
|
|
708
|
+
ولأن مفاتيح الخريطة تُدقَّق مقابل مفاتيح القواميس المصرَّح بها، فإن أي خطأ مطبعي — أو متغيرًا كائنيًا مكتوبًا مباشرة مثل `variant={{ id: "prod_abc" }}` — يُعدّ خطأ في وقت الترجمة.
|
|
709
|
+
|
|
467
710
|
## وضع التحميل
|
|
468
711
|
|
|
469
712
|
غالبًا ما تُحمَّل المتغيرات الكائنية بشكل كسول. اضبط `importMode` على القاموس للتحكم في ذلك:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2026-06-12
|
|
3
|
-
updatedAt: 2026-
|
|
3
|
+
updatedAt: 2026-08-04
|
|
4
4
|
title: Varianten
|
|
5
5
|
description: Verwenden Sie das variant-Metadatenfeld in Intlayer-Inhaltsdateien, um benannte oder strukturierte Inhaltsalternativen zu deklarieren — A/B-Tests, saisonale Banner, Feature-Flag-Texte, CMS-Datensätze, benutzerspezifische Inhalte — und zur Laufzeit ohne Codeänderungen zwischen ihnen zu wechseln.
|
|
6
6
|
keywords:
|
|
@@ -23,6 +23,12 @@ history:
|
|
|
23
23
|
- version: 9.1.0
|
|
24
24
|
date: 2026-06-26
|
|
25
25
|
changes: "`variant` akzeptiert jetzt einen String oder ein Objekt — die früheren `meta` / dynamischen Datensätze werden als Objekt-Varianten deklariert"
|
|
26
|
+
- version: 9.1.1
|
|
27
|
+
date: 2026-07-31
|
|
28
|
+
changes: "Eine Variante deklariert nur die Schlüssel, die sie überschreibt; nicht deklarierte Varianten fallen auf den Standardeintrag zurück"
|
|
29
|
+
- version: 9.1.2
|
|
30
|
+
date: 2026-08-04
|
|
31
|
+
changes: "Provider akzeptieren eine ambiente `variant`-Prop; Selektoren akzeptieren eine geordnete Präferenzkette"
|
|
26
32
|
author: aymericzip
|
|
27
33
|
---
|
|
28
34
|
|
|
@@ -77,6 +83,37 @@ const dictionary = {
|
|
|
77
83
|
export default dictionary;
|
|
78
84
|
```
|
|
79
85
|
|
|
86
|
+
### Teilvarianten
|
|
87
|
+
|
|
88
|
+
Eine Variante deklariert **nur die Schlüssel, die sie überschreibt**; der Rest wird vom Standardeintrag geerbt.
|
|
89
|
+
|
|
90
|
+
```ts fileName="hero-banner.summer.content.ts" contentDeclarationFormat={["typescript", "esm", "commonjs"]}
|
|
91
|
+
import { t, type Dictionary } from "intlayer";
|
|
92
|
+
|
|
93
|
+
const dictionary = {
|
|
94
|
+
key: "hero-banner",
|
|
95
|
+
variant: "summer",
|
|
96
|
+
content: {
|
|
97
|
+
headline: t({
|
|
98
|
+
en: "Build faster all summer",
|
|
99
|
+
fr: "Développez plus vite tout l'été",
|
|
100
|
+
}),
|
|
101
|
+
},
|
|
102
|
+
} satisfies Dictionary;
|
|
103
|
+
|
|
104
|
+
export default dictionary;
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
```tsx
|
|
108
|
+
useIntlayer("hero-banner", { variant: "summer" });
|
|
109
|
+
// → { headline: "Développez plus vite tout l'été", cta: "Commencer" } — `cta` geerbt
|
|
110
|
+
|
|
111
|
+
useIntlayer("hero-banner", { variant: "never-declared" });
|
|
112
|
+
// → der Standardeintrag
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Fügen Sie also nur dort eine Varianten-Datei hinzu, wo der Wortlaut tatsächlich abweicht. Ein Schlüssel wird nur dann in `null` aufgelöst, wenn er Varianten deklariert, aber keinen Standardeintrag.
|
|
116
|
+
|
|
80
117
|
### Benannte Varianten verwenden
|
|
81
118
|
|
|
82
119
|
#### Standardvariante
|
|
@@ -464,6 +501,176 @@ const content = useIntlayer("product", {
|
|
|
464
501
|
const content = useIntlayer("product", { variant: { id: "prod_abc" } });
|
|
465
502
|
```
|
|
466
503
|
|
|
504
|
+
## Ambiente Variante
|
|
505
|
+
|
|
506
|
+
Manche Variantendimensionen stehen für eine ganze Sitzung fest — der Mandant, der Schultyp, die Tarifstufe. Sie werden einmal aufgelöst, und keine Komponente sollte sie von Hand durchreichen müssen.
|
|
507
|
+
|
|
508
|
+
> Kapseln Sie `useIntlayer` nicht in einen eigenen Hook, um sie einzuschleusen. Die Optimierung zur Bauzeit schreibt nur einen literalen `useIntlayer("key")`-Aufruf um, der aus dem Framework-Paket importiert wurde — hinter einem Wrapper wird nichts gebündelt.
|
|
509
|
+
|
|
510
|
+
Deklarieren Sie die Variante stattdessen einmal am Provider, genau wie `locale`:
|
|
511
|
+
|
|
512
|
+
<Tabs group="framework">
|
|
513
|
+
<Tab label="React" value="react">
|
|
514
|
+
```tsx fileName="App.tsx" contentDeclarationFormat={["typescript", "esm", "commonjs"]}
|
|
515
|
+
import { IntlayerProvider } from "react-intlayer";
|
|
516
|
+
|
|
517
|
+
export const App = ({ locale, schoolType }) => (
|
|
518
|
+
<IntlayerProvider locale={locale} variant={schoolType}>
|
|
519
|
+
<Hero />
|
|
520
|
+
</IntlayerProvider>
|
|
521
|
+
);
|
|
522
|
+
```
|
|
523
|
+
|
|
524
|
+
</Tab>
|
|
525
|
+
<Tab label="Next.js" value="nextjs">
|
|
526
|
+
```tsx fileName="layout.tsx" contentDeclarationFormat={["typescript", "esm", "commonjs"]}
|
|
527
|
+
import { IntlayerServerProvider } from "next-intlayer/server";
|
|
528
|
+
import { IntlayerClientProvider } from "next-intlayer";
|
|
529
|
+
|
|
530
|
+
export default async function Layout({ children, params }) {
|
|
531
|
+
const { locale } = await params;
|
|
532
|
+
const schoolType = await getSchoolType();
|
|
533
|
+
|
|
534
|
+
return (
|
|
535
|
+
<IntlayerServerProvider locale={locale} variant={schoolType}>
|
|
536
|
+
<IntlayerClientProvider locale={locale} variant={schoolType}>
|
|
537
|
+
{children}
|
|
538
|
+
</IntlayerClientProvider>
|
|
539
|
+
</IntlayerServerProvider>
|
|
540
|
+
);
|
|
541
|
+
}
|
|
542
|
+
```
|
|
543
|
+
|
|
544
|
+
</Tab>
|
|
545
|
+
<Tab label="Vue" value="vue">
|
|
546
|
+
```ts fileName="main.ts" contentDeclarationFormat={["typescript", "esm", "commonjs"]}
|
|
547
|
+
import { createApp } from "vue";
|
|
548
|
+
import { installIntlayer } from "vue-intlayer";
|
|
549
|
+
import App from "./App.vue";
|
|
550
|
+
|
|
551
|
+
const app = createApp(App);
|
|
552
|
+
|
|
553
|
+
installIntlayer(app, { locale: "en", variant: schoolType });
|
|
554
|
+
|
|
555
|
+
app.mount("#app");
|
|
556
|
+
```
|
|
557
|
+
|
|
558
|
+
</Tab>
|
|
559
|
+
<Tab label="Svelte" value="svelte">
|
|
560
|
+
```svelte fileName="+layout.svelte" contentDeclarationFormat={["typescript", "esm", "commonjs"]}
|
|
561
|
+
<script lang="ts">
|
|
562
|
+
import { setupIntlayer } from "svelte-intlayer";
|
|
563
|
+
|
|
564
|
+
export let schoolType: string;
|
|
565
|
+
|
|
566
|
+
setupIntlayer("en", schoolType);
|
|
567
|
+
</script>
|
|
568
|
+
|
|
569
|
+
<slot />
|
|
570
|
+
```
|
|
571
|
+
|
|
572
|
+
</Tab>
|
|
573
|
+
<Tab label="Preact" value="preact">
|
|
574
|
+
```tsx fileName="App.tsx" contentDeclarationFormat={["typescript", "esm", "commonjs"]}
|
|
575
|
+
import { IntlayerProvider } from "preact-intlayer";
|
|
576
|
+
|
|
577
|
+
export const App = ({ locale, schoolType }) => (
|
|
578
|
+
<IntlayerProvider locale={locale} variant={schoolType}>
|
|
579
|
+
<Hero />
|
|
580
|
+
</IntlayerProvider>
|
|
581
|
+
);
|
|
582
|
+
```
|
|
583
|
+
|
|
584
|
+
</Tab>
|
|
585
|
+
<Tab label="Solid" value="solid">
|
|
586
|
+
```tsx fileName="App.tsx" contentDeclarationFormat={["typescript", "esm", "commonjs"]}
|
|
587
|
+
import { IntlayerProvider } from "solid-intlayer";
|
|
588
|
+
|
|
589
|
+
export const App = (props) => (
|
|
590
|
+
<IntlayerProvider locale={props.locale} variant={props.schoolType}>
|
|
591
|
+
<Hero />
|
|
592
|
+
</IntlayerProvider>
|
|
593
|
+
);
|
|
594
|
+
```
|
|
595
|
+
|
|
596
|
+
</Tab>
|
|
597
|
+
<Tab label="Angular" value="angular">
|
|
598
|
+
```typescript fileName="app.config.ts" contentDeclarationFormat={["typescript", "esm", "commonjs"]}
|
|
599
|
+
import { ApplicationConfig } from "@angular/core";
|
|
600
|
+
import { provideIntlayer } from "angular-intlayer";
|
|
601
|
+
|
|
602
|
+
export const appConfig: ApplicationConfig = {
|
|
603
|
+
providers: [provideIntlayer("en", true, schoolType)],
|
|
604
|
+
};
|
|
605
|
+
```
|
|
606
|
+
|
|
607
|
+
</Tab>
|
|
608
|
+
<Tab label="Vanilla JS" value="vanilla">
|
|
609
|
+
```javascript fileName="main.js"
|
|
610
|
+
import { installIntlayer } from "vanilla-intlayer";
|
|
611
|
+
|
|
612
|
+
installIntlayer({ locale: "en", variant: schoolType });
|
|
613
|
+
```
|
|
614
|
+
|
|
615
|
+
</Tab>
|
|
616
|
+
</Tabs>
|
|
617
|
+
|
|
618
|
+
Jeder Wörterbuchzugriff unterhalb des Providers wird nun gegen diese Variante aufgelöst, und ein Selektor an der Aufrufstelle gewinnt immer:
|
|
619
|
+
|
|
620
|
+
```tsx
|
|
621
|
+
useIntlayer("hero-banner");
|
|
622
|
+
// → die Variante des Providers
|
|
623
|
+
|
|
624
|
+
useIntlayer("hero-banner", { variant: "summer" });
|
|
625
|
+
// → "summer" — ersetzt die Provider-Variante, sie wird nicht erweitert
|
|
626
|
+
```
|
|
627
|
+
|
|
628
|
+
### Formen
|
|
629
|
+
|
|
630
|
+
Die `variant`-Prop akzeptiert drei Formen:
|
|
631
|
+
|
|
632
|
+
| Form | Bedeutung |
|
|
633
|
+
| --------------------------------------------------------- | ------------------------------------------ |
|
|
634
|
+
| `variant="school1"` | eine benannte Variante für jeden Schlüssel |
|
|
635
|
+
| `variant={["school1", "default"]}` | eine geordnete Präferenzkette |
|
|
636
|
+
| `variant={{ "hero-banner": "school1", default: "base" }}` | eine Variante pro Wörterbuchschlüssel |
|
|
637
|
+
|
|
638
|
+
#### Präferenzkette
|
|
639
|
+
|
|
640
|
+
Eine Kette wird von links nach rechts gegen die von jedem Schlüssel deklarierten Einträge geprüft; der erste deklarierte gewinnt. Ist keiner deklariert, wird der implizite Standardeintrag verwendet — genau wie bei einem Einzelwert.
|
|
641
|
+
|
|
642
|
+
```tsx
|
|
643
|
+
<IntlayerProvider variant={["school1", "school2"]} />
|
|
644
|
+
// `hero-banner` deklariert keinen `school1`-Eintrag, aber `school2` → "school2"
|
|
645
|
+
// ein Schlüssel, der keinen von beiden deklariert → der Standardeintrag
|
|
646
|
+
```
|
|
647
|
+
|
|
648
|
+
`["black_friday", "summer"]` liest sich also als „black friday, falls dieser Schlüssel eine hat, sonst summer, sonst Standard“. Ketten werden auch an der Aufrufstelle akzeptiert:
|
|
649
|
+
|
|
650
|
+
```tsx
|
|
651
|
+
useIntlayer("hero-banner", { variant: ["black_friday", "summer"] });
|
|
652
|
+
```
|
|
653
|
+
|
|
654
|
+
> Beachten Sie, dass dies das Spiegelbild des Arrays ist, das das `variant`-**Feld** einer Inhaltsdatei akzeptiert: dort _deklariert_ ein Array einen Eintrag je Element, hier _konsumiert_ es sie in Prioritätsreihenfolge.
|
|
655
|
+
|
|
656
|
+
#### Zuordnung je Schlüssel
|
|
657
|
+
|
|
658
|
+
Sprechen Sie jeden Wörterbuchschlüssel einzeln an. Der reservierte Eintrag `default` deckt alle nicht aufgeführten Schlüssel ab:
|
|
659
|
+
|
|
660
|
+
```tsx
|
|
661
|
+
<IntlayerProvider
|
|
662
|
+
variant={{
|
|
663
|
+
"hero-banner": "school1",
|
|
664
|
+
product: ["school1", "default"],
|
|
665
|
+
default: "base",
|
|
666
|
+
}}
|
|
667
|
+
/>
|
|
668
|
+
```
|
|
669
|
+
|
|
670
|
+
> An einem Provider wird ein einfaches Objekt **immer** als Zuordnung je Schlüssel gelesen, nie als Objektvariante — beide sind strukturell identisch. Um eine Objektvariante global festzulegen, verschachteln Sie sie unter einem Eintrag: `variant={{ default: { id: "prod_abc" } }}`.
|
|
671
|
+
|
|
672
|
+
Da die Schlüssel der Zuordnung gegen Ihre deklarierten Wörterbuchschlüssel geprüft werden, ist ein Tippfehler — oder eine direkt geschriebene Objektvariante wie `variant={{ id: "prod_abc" }}` — ein Compilerfehler.
|
|
673
|
+
|
|
467
674
|
## Lademodus
|
|
468
675
|
|
|
469
676
|
Objekt-Varianten werden oft verzögert geladen. Setzen Sie `importMode` im Wörterbuch, um dies zu steuern:
|