Zadaj pytanie i otrzymaj streszczenie dokumentu, odwołując się do tej strony i wybranego dostawcy AI
Ta dokumentacja jest nieaktualna, wersja bazowa została zaktualizowana w 22 sierpnia 2026.
Przejdź do angielskiej wersji dokumentuHistoria wersji
- "Wydanie funkcji wariantów"v9.0.012.06.2026
- "`variant` akceptuje teraz ciąg znaków lub obiekt — dawne rekordy `meta` / dynamiczne są deklarowane jako warianty obiektowe"v9.1.026.06.2026
- "Wariant deklaruje tylko klucze, które nadpisuje; niezadeklarowane warianty powracają do domyślnego wpisu"v9.1.131.07.2026
- "Dostawcy przyjmują otaczający prop `variant`; selektory przyjmują uporządkowany łańcuch preferencji"v9.1.24.08.2026
Treść tej strony została przetłumaczona przy użyciu sztucznej inteligencji.
Zobacz ostatnią wersję oryginalnej treści w języku angielskimJeśli masz pomysł na ulepszenie tej dokumentacji, zachęcamy do przesłania pull requesta na GitHubie.
Link do dokumentacji na GitHubieKopiuj dokument Markdown do schowka
Warianty
Wariant to zestaw plików treści, które dzielą ten sam klucz słownika (key), lecz każdy ma inną wartość variant. Intlayer udostępnia odpowiedni plik na podstawie selektora przekazanego do useIntlayer.
Wartość variant może przyjmować dwie formy:
- Ciąg znaków — pojedyncza nazwana alternatywa (testy A/B, banery sezonowe, feature flagi).
- Obiekt — strukturalny dyskryminator adresowany zestawem pól (rekordy CMS, treść zależna od użytkownika, dowolna treść z nieprzezroczystym ID jako kluczem). Tożsamością jest cały obiekt: selektor musi dostarczyć równy obiekt, aby rozwiązać wpis.
Forma obiektowa zastępuje dawne polemeta. Wszędzie, gdzie wcześniej pisałeśmeta: { id, … }, napiszvariant: { id, … }i wybierz ją przez{ variant: { id, … } }.
Warianty nazwane (tekstowe)
Każdy plik reprezentuje jedną nazwaną alternatywę. Pominięcie variant (lub ustawienie na "default") oznacza go jako domyślny.
Skopiuj kod do schowka
import { t, type Dictionary } from "intlayer";
const dictionary = {
key: "hero-banner",
variant: "default",
content: {
headline: t({
en: "Build faster with Intlayer",
fr: "Développez plus vite avec Intlayer",
}),
cta: t({ en: "Get started", fr: "Commencer" }),
},
} satisfies Dictionary;
export default dictionary;
Skopiuj kod do schowka
import { t, type Dictionary } from "intlayer";
const dictionary = {
key: "hero-banner",
variant: "black_friday",
content: {
headline: t({
en: "50 % off — today only",
fr: "−50 % — aujourd'hui seulement",
}),
cta: t({ en: "Shop now", fr: "Acheter maintenant" }),
},
} satisfies Dictionary;
export default dictionary;
Warianty częściowe
Wariant deklaruje tylko klucze, które nadpisuje; reszta jest dziedziczona z wpisu domyślnego.
Skopiuj kod do schowka
import { t, type Dictionary } from "intlayer";
const dictionary = {
key: "hero-banner",
variant: "summer",
content: {
headline: t({
en: "Build faster all summer",
fr: "Développez plus vite tout l'été",
}),
},
} satisfies Dictionary;
export default dictionary;
Skopiuj kod do schowka
Dlatego dodajesz plik wariantu tylko tam, gdzie brzmienie faktycznie się różni. Klucz jest rozwiązywany na null tylko wtedy, gdy deklaruje warianty, ale nie ma domyślnego wpisu.
Korzystanie z wariantów nazwanych
Wariant domyślny
Skopiuj kod do schowka
import { useIntlayer } from "react-intlayer";
export const Hero = () => {
const { headline, cta } = useIntlayer("hero-banner");
// → wariant domyślny
return (
<section>
<h1>{headline}</h1>
<a>{cta}</a>
</section>
);
};
Skopiuj kod do schowka
import { useIntlayer } from "next-intlayer";
export const Hero = () => {
const { headline, cta } = useIntlayer("hero-banner");
// → wariant domyślny
return (
<section>
<h1>{headline}</h1>
<a>{cta}</a>
</section>
);
};
Skopiuj kod do schowka
<script setup>
import { useIntlayer } from "vue-intlayer";
const { headline, cta } = useIntlayer("hero-banner");
</script>
<template>
<section>
<h1>{{ headline }}</h1>
<a>{{ cta }}</a>
</section>
</template>
Skopiuj kod do schowka
<script lang="ts">
import { useIntlayer } from "svelte-intlayer";
const content = useIntlayer("hero-banner");
</script>
<section>
<h1>{$content.headline}</h1>
<a>{$content.cta}</a>
</section>
Skopiuj kod do schowka
import { useIntlayer } from "preact-intlayer";
export const Hero = () => {
const { headline, cta } = useIntlayer("hero-banner");
// → wariant domyślny
return (
<section>
<h1>{headline}</h1>
<a>{cta}</a>
</section>
);
};
Skopiuj kod do schowka
import { useIntlayer } from "solid-intlayer";
export const Hero = () => {
const content = useIntlayer("hero-banner");
// → wariant domyślny
return (
<section>
<h1>{content().headline}</h1>
<a>{content().cta}</a>
</section>
);
};
Skopiuj kod do schowka
import { Component } from "@angular/core";
import { useIntlayer } from "angular-intlayer";
@Component({
selector: "app-hero",
template: `
<section>
<h1>{{ content().headline }}</h1>
<a>{{ content().cta }}</a>
</section>
`,
})
export class HeroComponent {
content = useIntlayer("hero-banner");
}
Skopiuj kod do schowka
Wariant nazwany
Skopiuj kod do schowka
Wariant nazwany z jawnym locale
Skopiuj kod do schowka
Warianty obiektowe (strukturalne)
Wariant obiektowy adresuje treść dowolnym zestawem par klucz-wartość zadeklarowanych w polu variant — co umożliwia modelowanie rekordów CMS, treści zależnej od użytkownika lub dowolnej treści z nieprzezroczystym ID jako kluczem. Tożsamością jest cały obiekt: selektor musi dostarczyć równy obiekt, aby wpis został rozwiązany.
Skopiuj kod do schowka
import { t, type Dictionary } from "intlayer";
const dictionary = {
key: "product",
variant: { id: "prod_abc", userId: "user_123" },
content: {
name: t({ en: "Widget Pro", fr: "Widget Pro" }),
description: t({ en: "The best widget.", fr: "Le meilleur widget." }),
},
} satisfies Dictionary;
export default dictionary;
Skopiuj kod do schowka
import { t, type Dictionary } from "intlayer";
const dictionary = {
key: "product",
variant: { id: "prod_abcd", userId: "user_123" },
content: {
name: t({ en: "Widget Lite", fr: "Widget Lite" }),
description: t({ en: "A lighter option.", fr: "Une option plus légère." }),
},
} satisfies Dictionary;
export default dictionary;
Korzystanie z wariantów obiektowych
Przekaż pasujący obiekt do variant. Każde pole zadeklarowane w słowniku musi zostać podane i być równe; w przeciwnym razie wynik to null. Kolejność pól nie ma znaczenia.
Skopiuj kod do schowka
import { useIntlayer } from "react-intlayer";
export const Product = ({
productId,
userId,
}: {
productId: string;
userId: string;
}) => {
const content = useIntlayer("product", {
variant: { id: productId, userId },
});
if (!content) return null;
return <p>{content.description}</p>;
};
Skopiuj kod do schowka
import { useIntlayer } from "next-intlayer";
export const Product = ({
productId,
userId,
}: {
productId: string;
userId: string;
}) => {
const content = useIntlayer("product", {
variant: { id: productId, userId },
});
if (!content) return null;
return <p>{content.description}</p>;
};
Skopiuj kod do schowka
<script setup>
import { useIntlayer } from "vue-intlayer";
const props = defineProps({
productId: String,
userId: String,
});
const content = useIntlayer("product", {
variant: { id: props.productId, userId: props.userId },
});
</script>
<template>
<p v-if="content">{{ content.description }}</p>
</template>
Skopiuj kod do schowka
<script lang="ts">
import { useIntlayer } from "svelte-intlayer";
export let productId: string;
export let userId: string;
const content = useIntlayer("product", {
variant: { id: productId, userId },
});
</script>
{#if $content}
<p>{$content.description}</p>
{/if}
Skopiuj kod do schowka
import { useIntlayer } from "preact-intlayer";
export const Product = ({
productId,
userId,
}: {
productId: string;
userId: string;
}) => {
const content = useIntlayer("product", {
variant: { id: productId, userId },
});
if (!content) return null;
return <p>{content.description}</p>;
};
Skopiuj kod do schowka
import { useIntlayer } from "solid-intlayer";
export const Product = (props: {
productId: string;
userId: string;
}) => {
const content = useIntlayer("product", {
variant: { id: props.productId, userId: props.userId },
});
return (
<>
{content() && <p>{content().description}</p>}
</>
);
};
Skopiuj kod do schowka
import { Component, Input, OnInit } from "@angular/core";
import { useIntlayer } from "angular-intlayer";
@Component({
selector: "app-product",
template: `
@if (content()) {
<p>{{ content().description }}</p>
}
`,
})
export class ProductComponent implements OnInit {
@Input() productId!: string;
@Input() userId!: string;
content: any;
ngOnInit() {
this.content = useIntlayer("product", {
variant: { id: this.productId, userId: this.userId },
});
}
}
Skopiuj kod do schowka
Z jawnym locale
Skopiuj kod do schowka
Brakujące pole — brak dopasowania
Skopiuj kod do schowka
Wariant otaczający
Niektóre wymiary wariantu są stałe przez całą sesję — najemca, typ szkoły, poziom planu. Są rozstrzygane raz i żaden komponent nie powinien przekazywać ich ręcznie.
Nie opakowujuseIntlayerwe własny hook, aby je wstrzyknąć. Optymalizacja na etapie budowania przepisuje wyłącznie dosłowne wywołanieuseIntlayer("key")zaimportowane z pakietu frameworka, więc nic za opakowaniem nie trafi do bundla.
Zamiast tego zadeklaruj wariant raz na dostawcy, dokładnie jak locale:
Skopiuj kod do schowka
import { IntlayerProvider } from "react-intlayer";
export const App = ({ locale, schoolType }) => (
<IntlayerProvider locale={locale} variant={schoolType}>
<Hero />
</IntlayerProvider>
);
Skopiuj kod do schowka
import { IntlayerProvider } from "next-intlayer/server";
export default async function Layout({ children, params }) {
const { locale } = await params;
const schoolType = await getSchoolType();
return (
<IntlayerProvider locale={locale} variant={schoolType}>
{children}
</IntlayerProvider>
);
}
Skopiuj kod do schowka
import { IntlayerServerProvider } from "next-intlayer/server";
import { IntlayerClientProvider } from "next-intlayer";
export default async function Layout({ children, params }) {
const { locale } = await params;
const schoolType = await getSchoolType();
return (
<IntlayerServerProvider locale={locale} variant={schoolType}>
<IntlayerClientProvider locale={locale} variant={schoolType}>
{children}
</IntlayerClientProvider>
</IntlayerServerProvider>
);
}
Skopiuj kod do schowka
import { createApp } from "vue";
import { installIntlayer } from "vue-intlayer";
import App from "./App.vue";
const app = createApp(App);
installIntlayer(app, { locale: "en", variant: schoolType });
app.mount("#app");
Skopiuj kod do schowka
<script lang="ts">
import { setupIntlayer } from "svelte-intlayer";
export let schoolType: string;
setupIntlayer("en", schoolType);
</script>
<slot />
Skopiuj kod do schowka
import { IntlayerProvider } from "preact-intlayer";
export const App = ({ locale, schoolType }) => (
<IntlayerProvider locale={locale} variant={schoolType}>
<Hero />
</IntlayerProvider>
);
Skopiuj kod do schowka
import { IntlayerProvider } from "solid-intlayer";
export const App = (props) => (
<IntlayerProvider locale={props.locale} variant={props.schoolType}>
<Hero />
</IntlayerProvider>
);
Skopiuj kod do schowka
import { ApplicationConfig } from "@angular/core";
import { provideIntlayer } from "angular-intlayer";
export const appConfig: ApplicationConfig = {
providers: [provideIntlayer("en", true, schoolType)],
};
Skopiuj kod do schowka
Każdy odczyt słownika poniżej dostawcy rozstrzyga się teraz względem tego wariantu, a selektor w miejscu wywołania zawsze wygrywa:
Skopiuj kod do schowka
Formy
Prop variant przyjmuje trzy formy:
Otwórz tabelę w oknie modalnym, aby wyraźnie zobaczyć całą zawartość
| Forma | Znaczenie |
|---|---|
variant="school1" | jeden nazwany wariant dla każdego klucza |
variant={["school1", "default"]} | uporządkowany łańcuch preferencji |
variant={{ "hero-banner": "school1", default: "base" }} | jeden wariant na klucz słownika |
Łańcuch preferencji
Łańcuch jest przechodzony od lewej do prawej względem wpisów deklarowanych przez każdy klucz i wygrywa pierwszy zadeklarowany. Gdy żaden nie jest zadeklarowany, używany jest niejawny wpis domyślny — dokładnie tak jak dla pojedynczej wartości.
Skopiuj kod do schowka
Zatem ["black_friday", "summer"] czyta się jako „black friday, jeśli ten klucz go ma, w przeciwnym razie summer, w przeciwnym razie domyślny”. Łańcuchy są akceptowane także w miejscu wywołania:
Skopiuj kod do schowka
Zauważ, że jest to lustrzane odbicie tablicy przyjmowanej przez pole variant pliku treści: tam tablica deklaruje jeden wpis na element, tutaj konsumuje je w kolejności priorytetu.
Mapa według klucza
Adresuj każdy klucz słownika osobno. Zarezerwowany wpis default obejmuje wszystkie klucze niewymienione na liście:
Skopiuj kod do schowka
Na dostawcy zwykły obiekt jest zawsze odczytywany jako mapa według klucza, nigdy jako wariant obiektowy — oba są strukturalnie identyczne. Aby ustalić wariant obiektowy globalnie, zagnieźdź go pod wpisem: variant={{ default: { id: "prod_abc" } }}.
Ponieważ klucze mapy są sprawdzane względem zadeklarowanych kluczy słowników, literówka — lub wariant obiektowy zapisany wprost, taki jak variant={{ id: "prod_abc" }} — jest błędem kompilacji.
Tryb ładowania
Warianty obiektowe są często ładowane leniwie. Ustaw importMode w słowniku, aby to kontrolować:
Skopiuj kod do schowka
const dictionary = {
key: "product",
importMode: "fetch", // or "dynamic"
variant: { id: "prod_abc", userId: "user_123" },
content: { … },
} satisfies Dictionary;
export default dictionary;
Zobacz optymalizację bundla, aby poznać szczegóły trybów static, dynamic i fetch.
Typowe przypadki użycia
- Testy A/B tekstu sterowane kluczem eksperymentu
- Banery sezonowe lub promocyjne
- Komunikaty z feature flag
- Kampanie marketingowe specyficzne dla locale
- Teksty marketingowe per produkt zarządzane w CMS
- Treść zależna od użytkownika lub konta
- Dowolna treść adresowana nieprzezroczystym ID w czasie wykonywania
