рдЕрдкрдиреЗ рдкреНрд░рд╢реНрди рдХреЛ рдкреВрдЫреЗрдВ рдФрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХрд╛ рд╕рд╛рд░рд╛рдВрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ, рдЗрд╕ рдкреГрд╖реНрда рдФрд░ рдЖрдкрдХреЗ рдЪреБрдиреЗ рд╣реБрдП AI рдкреНрд░рджрд╛рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ
рдпрд╣ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдкреБрд░рд╛рдирд╛ рд╣реИ, рдЖрдзрд╛рд░ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЗрд╕ рддрд┐рдерд┐ рдкрд░ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ 22 рдЕрдЧрд╕реНрдд 2026.
рдЕрдВрдЧреНрд░реЗрдЬреА рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдкрд░ рдЬрд╛рдПрдБрд╕рдВрд╕реНрдХрд░рдг рдЗрддрд┐рд╣рд╛рд╕
- "рд╡реИрд░рд┐рдПрдВрдЯ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рд░рд┐рд▓реАрдЬрд╝"v9.0.012/6/2026
- "`variant` рдЕрдм рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдпрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ тАФ рдкреВрд░реНрд╡ `meta` / рдЧрддрд┐рд╢реАрд▓ рд░рд┐рдХреЙрд░реНрдб рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рд╡реЗрд░рд┐рдПрдВрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ"v9.1.026/6/2026
- "рд╡реЗрд░рд┐рдПрдВрдЯ рдХреЗрд╡рд▓ рдЙрдиреНрд╣реАрдВ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЛ рдШреЛрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рд╡рд╣ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддрд╛ рд╣реИ; рдЕрдШреЛрд╖рд┐рдд рд╡реЗрд░рд┐рдПрдВрдЯ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдкрд░ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддреЗ рд╣реИрдВ"v9.1.131/7/2026
- "рдкреНрд░реЛрд╡рд╛рдЗрдбрд░ рдПрдХ рдкрд░рд┐рд╡реЗрд╢реА `variant` рдкреНрд░реЙрдк рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ; рд╕реЗрд▓реЗрдХреНрдЯрд░ рдПрдХ рдХреНрд░рдорд┐рдд рд╡рд░реАрдпрддрд╛ рд╢реГрдВрдЦрд▓рд╛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ"v9.1.24/8/2026
рдЗрд╕ рдкреГрд╖реНрда рдХреА рд╕рд╛рдордЧреНрд░реА рдПрдХ AI рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХреА рдЧрдИ рд╣реИред
рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ рдореВрд▓ рд╕рд╛рдордЧреНрд░реА рдХреЗ рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг рджреЗрдЦреЗрдВрдЕрдЧрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрд╕ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рд╕реБрдзрд╛рд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ рд╣реИ, рддреЛ рдХреГрдкрдпрд╛ GitHub рдкрд░ рдПрдХ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рд╕рдмрдорд┐рдЯ рдХрд░рдХреЗ рдпреЛрдЧрджрд╛рди рджреЗрдиреЗ рдореЗрдВ рд╕рдВрдХреЛрдЪ рди рдХрд░реЗрдВред
рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЗ рд▓рд┐рдП GitHub рд▓рд┐рдВрдХрджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХрд╛ Markdown рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
рд╡реИрд░рд┐рдПрдВрдЯ
рдПрдХ рд╡реИрд░рд┐рдПрдВрдЯ рд╕рд╛рдордЧреНрд░реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рд╣реИ рдЬреЛ рд╕рдорд╛рди рдбрд┐рдХреНрд╢рдирд░реА key рд╕рд╛рдЭрд╛ рдХрд░рддреА рд╣реИрдВ рд▓реЗрдХрд┐рди рдкреНрд░рддреНрдпреЗрдХ рдХрд╛ рдПрдХ рдЕрд▓рдЧ variant рдорд╛рди рд╣реЛрддрд╛ рд╣реИред Intlayer useIntlayer рдХреЛ рдкрд╛рд╕ рдХрд┐рдП рдЧрдП рд╕реЗрд▓реЗрдХреНрдЯрд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЙрдкрдпреБрдХреНрдд рдлрд╝рд╛рдЗрд▓ рдкрд░реЛрд╕рддрд╛ рд╣реИред
variant рдорд╛рди рджреЛ рд░реВрдк рд▓реЗ рд╕рдХрддрд╛ рд╣реИ:
- рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ тАФ рдПрдХрд▓ рдирд╛рдорд┐рдд рд╡рд┐рдХрд▓реНрдк (A/B рдкрд░реАрдХреНрд╖рдг, рдореМрд╕рдореА рдмреИрдирд░, рдлрд╝реАрдЪрд░ рдлрд╝реНрд▓реИрдЧ)ред
- рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ тАФ рдлрд╝реАрд▓реНрдб рдХреЗ рд╕реЗрдЯ рджреНрд╡рд╛рд░рд╛ рд╕рдВрдмреЛрдзрд┐рдд рдПрдХ рд╕рдВрд░рдЪрд┐рдд рд╡рд┐рднреЗрджрдХ (CMS рд░рд┐рдХреЙрд░реНрдб, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рд╛рдордЧреНрд░реА, рдЕрдкрд╛рд░рджрд░реНрд╢реА ID рджреНрд╡рд╛рд░рд╛ рдХреБрдВрдЬреАрдмрджреНрдз рдХреЛрдИ рднреА рд╕рд╛рдордЧреНрд░реА)ред рдкреВрд░рд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реА рдкрд╣рдЪрд╛рди рд╣реИ: рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрд▓реЗрдХреНрдЯрд░ рдХреЛ рдПрдХ рд╕рдорд╛рди рдСрдмреНрдЬреЗрдХреНрдЯ рджреЗрдирд╛ рд╣реЛрдЧрд╛ред
рдСрдмреНрдЬреЗрдХреНрдЯ рд░реВрдк рдкреБрд░рд╛рдиреЗmetaрдлрд╝реАрд▓реНрдб рдХреА рдЬрдЧрд╣ рд▓реЗрддрд╛ рд╣реИред рдЬрд╣рд╛рдБ рднреА рдЖрдк рдкрд╣рд▓реЗmeta: { id, тАж }рд▓рд┐рдЦрддреЗ рдереЗ, рд╡рд╣рд╛рдБvariant: { id, тАж }рд▓рд┐рдЦреЗрдВ рдФрд░ рдЗрд╕реЗ{ variant: { id, тАж } }рдХреЗ рд╕рд╛рде рдЪреБрдиреЗрдВред
рдирд╛рдорд┐рдд (рд╕реНрдЯреНрд░рд┐рдВрдЧ) рд╡реИрд░рд┐рдПрдВрдЯ
рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рд╛рдЗрд▓ рдПрдХ рдирд╛рдорд┐рдд рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреА рд╣реИред variant рдХреЛ рдЫреЛрдбрд╝рдирд╛ (рдпрд╛ "default" рдкрд░ рд╕реЗрдЯ рдХрд░рдирд╛) рдЗрд╕реЗ рдлрд╝реЙрд▓рдмреИрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддрд╛ рд╣реИред
рдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
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;
рдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
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;
рдЖрдВрд╢рд┐рдХ рд╡реЗрд░рд┐рдПрдВрдЯ
рдПрдХ рд╡реЗрд░рд┐рдПрдВрдЯ рдХреЗрд╡рд▓ рдЙрдиреНрд╣реАрдВ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЛ рдШреЛрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рд╡рд╣ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддрд╛ рд╣реИ; рдмрд╛рдХреА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рддреА рд╣реИрдВред
рдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
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;
рдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
рдЗрд╕рд▓рд┐рдП рдЖрдк рдХреЗрд╡рд▓ рд╡рд╣реАрдВ рд╡реЗрд░рд┐рдПрдВрдЯ рдлрд╝рд╛рдЗрд▓ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рд╢рдмреНрдж рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рднрд┐рдиреНрди рд╣реЛрддреЗ рд╣реИрдВред рдПрдХ рдХреБрдВрдЬреА рдХреЗрд╡рд▓ рддрднреА null рдкрд░ рд╣рд▓ рд╣реЛрддреА рд╣реИ рдЬрдм рд╡рд╣ рд╡реЗрд░рд┐рдПрдВрдЯ рдШреЛрд╖рд┐рдд рдХрд░рддреА рд╣реИ рд▓реЗрдХрд┐рди рдХреЛрдИ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред
рдирд╛рдорд┐рдд рд╡реЗрд░рд┐рдПрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реИрд░рд┐рдПрдВрдЯ
рдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
import { useIntlayer } from "react-intlayer";
export const Hero = () => {
const { headline, cta } = useIntlayer("hero-banner");
// тЖТ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реИрд░рд┐рдПрдВрдЯ
return (
<section>
<h1>{headline}</h1>
<a>{cta}</a>
</section>
);
};
рдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
import { useIntlayer } from "next-intlayer";
export const Hero = () => {
const { headline, cta } = useIntlayer("hero-banner");
// тЖТ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реИрд░рд┐рдПрдВрдЯ
return (
<section>
<h1>{headline}</h1>
<a>{cta}</a>
</section>
);
};
рдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
<script setup>
import { useIntlayer } from "vue-intlayer";
const { headline, cta } = useIntlayer("hero-banner");
</script>
<template>
<section>
<h1>{{ headline }}</h1>
<a>{{ cta }}</a>
</section>
</template>
рдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
<script lang="ts">
import { useIntlayer } from "svelte-intlayer";
const content = useIntlayer("hero-banner");
</script>
<section>
<h1>{$content.headline}</h1>
<a>{$content.cta}</a>
</section>
рдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
import { useIntlayer } from "preact-intlayer";
export const Hero = () => {
const { headline, cta } = useIntlayer("hero-banner");
// тЖТ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реИрд░рд┐рдПрдВрдЯ
return (
<section>
<h1>{headline}</h1>
<a>{cta}</a>
</section>
);
};
рдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
import { useIntlayer } from "solid-intlayer";
export const Hero = () => {
const content = useIntlayer("hero-banner");
// тЖТ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реИрд░рд┐рдПрдВрдЯ
return (
<section>
<h1>{content().headline}</h1>
<a>{content().cta}</a>
</section>
);
};
рдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
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");
}
рдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
рдирд╛рдорд┐рдд рд╡реИрд░рд┐рдПрдВрдЯ
рдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
рд╕реНрдкрд╖реНрдЯ locale рдХреЗ рд╕рд╛рде рдирд╛рдорд┐рдд рд╡реИрд░рд┐рдПрдВрдЯ
рдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
рдСрдмреНрдЬреЗрдХреНрдЯ (рд╕рдВрд░рдЪрд┐рдд) рд╡реИрд░рд┐рдПрдВрдЯ
рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рд╡реИрд░рд┐рдПрдВрдЯ variant рдлрд╝реАрд▓реНрдб рдореЗрдВ рдШреЛрд╖рд┐рдд рдордирдорд╛рдиреЗ key-value рдпреБрдЧреНрдореЛрдВ рдХреЗ рд╕реЗрдЯ рджреНрд╡рд╛рд░рд╛ рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реИ тАФ рдЬрд┐рд╕рд╕реЗ CMS рд░рд┐рдХреЙрд░реНрдб, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рд╛рдордЧреНрд░реА, рдпрд╛ рдРрд╕реА рдХреЛрдИ рднреА рд╕рд╛рдордЧреНрд░реА рдореЙрдбрд▓ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреА рдХреБрдВрдЬреА рдПрдХ рдЕрдкрд╛рд░рджрд░реНрд╢реА ID рд╣реИред рдкрд╣рдЪрд╛рди рдкреВрд░рд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ: рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рд╣рд▓ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрд▓реЗрдХреНрдЯрд░ рдХреЛ рдПрдХ рд╕рдорд╛рди рдСрдмреНрдЬреЗрдХреНрдЯ рджреЗрдирд╛ рд╣реЛрдЧрд╛ред
рдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
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;
рдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
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;
рдСрдмреНрдЬреЗрдХреНрдЯ рд╡реИрд░рд┐рдПрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ
рдорд┐рд▓рд╛рди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдСрдмреНрдЬреЗрдХреНрдЯ variant рдореЗрдВ рдкрд╛рд╕ рдХрд░реЗрдВред рдбрд┐рдХреНрд╢рдирд░реА рдореЗрдВ рдШреЛрд╖рд┐рдд рдкреНрд░рддреНрдпреЗрдХ рдлрд╝реАрд▓реНрдб рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рд╕рдорд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП; рдЕрдиреНрдпрдерд╛ рдкрд░рд┐рдгрд╛рдо null рд╣реЛрддрд╛ рд╣реИред рдлрд╝реАрд▓реНрдб рдХрд╛ рдХреНрд░рдо рдорд╛рдпрдиреЗ рдирд╣реАрдВ рд░рдЦрддрд╛ред
рдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
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>;
};
рдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
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>;
};
рдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
<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>
рдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
<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}
рдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
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>;
};
рдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
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>}
</>
);
};
рдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
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 },
});
}
}
рдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
рд╕реНрдкрд╖реНрдЯ locale рдХреЗ рд╕рд╛рде
рдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
рдЕрдиреБрдкрд╕реНрдерд┐рдд рдлрд╝реАрд▓реНрдб тАФ рдХреЛрдИ рдорд┐рд▓рд╛рди рдирд╣реАрдВ
рдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
рдкрд░рд┐рд╡реЗрд╢реА рд╡реИрд░рд┐рдПрдВрдЯ
рдХреБрдЫ рд╡реИрд░рд┐рдПрдВрдЯ рдЖрдпрд╛рдо рдкреВрд░реЗ рд╕рддреНрд░ рдХреЗ рд▓рд┐рдП рд╕реНрдерд┐рд░ рд░рд╣рддреЗ рд╣реИрдВ тАФ рдЯреЗрдиреЗрдВрдЯ, рд╡рд┐рджреНрдпрд╛рд▓рдп рдХрд╛ рдкреНрд░рдХрд╛рд░, рдкреНрд▓рд╛рди рд╕реНрддрд░ред рдпреЗ рдПрдХ рд╣реА рдмрд╛рд░ рд╣рд▓ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдХрд┐рд╕реА рднреА рдХреЙрдореНрдкреЛрдиреЗрдВрдЯ рдХреЛ рдЗрдиреНрд╣реЗрдВ рд╣рд╛рде рд╕реЗ рдкрд╛рд╕ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЗрдиреНрд╣реЗрдВ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПuseIntlayerрдХреЛ рдЕрдкрдиреЗ рд╣реБрдХ рдореЗрдВ рди рд▓рдкреЗрдЯреЗрдВред рдмрд┐рд▓реНрдб-рдЯрд╛рдЗрдо рдЕрдиреБрдХреВрд▓рди рдХреЗрд╡рд▓ рдлреНрд░реЗрдорд╡рд░реНрдХ рдкреИрдХреЗрдЬ рд╕реЗ рдЖрдпрд╛рддрд┐рдд рд╢рд╛рдмреНрджрд┐рдХuseIntlayer("key")рдХреЙрд▓ рдХреЛ рд╣реА рдкреБрдирд░реНрд▓рд┐рдЦрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХрд┐рд╕реА рд░реИрдкрд░ рдХреЗ рдкреАрдЫреЗ рдХреБрдЫ рднреА рдмрдВрдбрд▓ рдирд╣реАрдВ рд╣реЛрддрд╛ред
рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╡реИрд░рд┐рдПрдВрдЯ рдХреЛ рдкреНрд░реЛрд╡рд╛рдЗрдбрд░ рдкрд░ рдПрдХ рд╣реА рдмрд╛рд░ рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ, рдареАрдХ locale рдХреА рддрд░рд╣:
рдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
import { IntlayerProvider } from "react-intlayer";
export const App = ({ locale, schoolType }) => (
<IntlayerProvider locale={locale} variant={schoolType}>
<Hero />
</IntlayerProvider>
);
рдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
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>
);
}
рдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
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>
);
}
рдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
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");
рдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
<script lang="ts">
import { setupIntlayer } from "svelte-intlayer";
export let schoolType: string;
setupIntlayer("en", schoolType);
</script>
<slot />
рдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
import { IntlayerProvider } from "preact-intlayer";
export const App = ({ locale, schoolType }) => (
<IntlayerProvider locale={locale} variant={schoolType}>
<Hero />
</IntlayerProvider>
);
рдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
import { IntlayerProvider } from "solid-intlayer";
export const App = (props) => (
<IntlayerProvider locale={props.locale} variant={props.schoolType}>
<Hero />
</IntlayerProvider>
);
рдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
import { ApplicationConfig } from "@angular/core";
import { provideIntlayer } from "angular-intlayer";
export const appConfig: ApplicationConfig = {
providers: [provideIntlayer("en", true, schoolType)],
};
рдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
рдЕрдм рдкреНрд░реЛрд╡рд╛рдЗрдбрд░ рдХреЗ рдиреАрдЪреЗ рдкреНрд░рддреНрдпреЗрдХ рдбрд┐рдХреНрд╢рдирд░реА рдкрдарди рдЙрд╕реА рд╡реИрд░рд┐рдПрдВрдЯ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рд╣рд▓ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдХреЙрд▓-рд╕реНрдерд▓ рдХрд╛ рд╕реЗрд▓реЗрдХреНрдЯрд░ рд╣рдореЗрд╢рд╛ рдЬреАрддрддрд╛ рд╣реИ:
рдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
рд░реВрдк
variant рдкреНрд░реЙрдк рддреАрди рд░реВрдк рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ:
рд╕рднреА рдбреЗрдЯрд╛ рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдореЛрдбрд▓ рдореЗрдВ рдЦреЛрд▓реЗрдВ
| рд░реВрдк | рдЕрд░реНрде |
|---|---|
variant="school1" | рд╣рд░ рдХреБрдВрдЬреА рдХреЗ рд▓рд┐рдП рдПрдХ рдирд╛рдорд┐рдд рд╡реИрд░рд┐рдПрдВрдЯ |
variant={["school1", "default"]} | рдПрдХ рдХреНрд░рдорд┐рдд рд╡рд░реАрдпрддрд╛ рд╢реГрдВрдЦрд▓рд╛ |
variant={{ "hero-banner": "school1", default: "base" }} | рдкреНрд░рддрд┐ рдбрд┐рдХреНрд╢рдирд░реА рдХреБрдВрдЬреА рдПрдХ рд╡реИрд░рд┐рдПрдВрдЯ |
рд╡рд░реАрдпрддрд╛ рд╢реГрдВрдЦрд▓рд╛
рд╢реГрдВрдЦрд▓рд╛ рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдХреБрдВрдЬреА рджреНрд╡рд╛рд░рд╛ рдШреЛрд╖рд┐рдд рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдмрд╛рдПрдБ рд╕реЗ рджрд╛рдПрдБ рдЖрдЬрд╝рдорд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдкрд╣рд▓реА рдШреЛрд╖рд┐рдд рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдЬреАрддрддреА рд╣реИред рдЬрдм рдХреЛрдИ рднреА рдШреЛрд╖рд┐рдд рди рд╣реЛ, рддреЛ рдирд┐рд╣рд┐рдд рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣реЛрддрд╛ рд╣реИ тАФ рдареАрдХ рд╡реИрд╕реЗ рд╣реА рдЬреИрд╕реЗ рдПрдХрд▓ рдорд╛рди рдХреЗ рд▓рд┐рдПред
рдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
рдЕрддрдГ ["black_friday", "summer"] рдХрд╛ рдЕрд░реНрде рд╣реИ ┬лрдпрджрд┐ рдЗрд╕ рдХреБрдВрдЬреА рдХреЗ рдкрд╛рд╕ black friday рд╣реИ рддреЛ рд╡рд╣реА, рдЕрдиреНрдпрдерд╛ summer, рдЕрдиреНрдпрдерд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ┬╗ред рд╢реГрдВрдЦрд▓рд╛рдПрдБ рдХреЙрд▓-рд╕реНрдерд▓ рдкрд░ рднреА рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИрдВ:
рдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рдХрдВрдЯреЗрдВрдЯ рдлрд╝рд╛рдЗрд▓ рдХреЗ variant рдлрд╝реАрд▓реНрдб рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдРрд░реЗ рдХрд╛ рджрд░реНрдкрдг рдкреНрд░рддрд┐рдмрд┐рдВрдм рд╣реИ: рд╡рд╣рд╛рдБ рдПрдХ рдРрд░реЗ рдкреНрд░рддрд┐ рддрддреНрд╡ рдПрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдШреЛрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдпрд╣рд╛рдБ рд╡рд╣ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХреНрд░рдо рдореЗрдВ рдЙрдкрднреЛрдЧ рдХрд░рддрд╛ рд╣реИред
рдкреНрд░рддрд┐-рдХреБрдВрдЬреА рдореИрдк
рдкреНрд░рддреНрдпреЗрдХ рдбрд┐рдХреНрд╢рдирд░реА рдХреБрдВрдЬреА рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░реЗрдВред рдЖрд░рдХреНрд╖рд┐рдд default рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдЙрди рд╕рднреА рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░рддреА рд╣реИ рдЬреЛ рд╕реВрдЪреАрдмрджреНрдз рдирд╣реАрдВ рд╣реИрдВ:
рдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
рдкреНрд░реЛрд╡рд╛рдЗрдбрд░ рдкрд░ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рд╣рдореЗрд╢рд╛ рдкреНрд░рддрд┐-рдХреБрдВрдЬреА рдореИрдк рдХреЗ рд░реВрдк рдореЗрдВ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХрднреА рдСрдмреНрдЬреЗрдХреНрдЯ рд╡реИрд░рд┐рдПрдВрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ тАФ рджреЛрдиреЛрдВ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рд░реВрдк рд╕реЗ рд╕рдорд╛рди рд╣реИрдВред рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рд╡реИрд░рд┐рдПрдВрдЯ рдХреЛ рд╡реИрд╢реНрд╡рд┐рдХ рд░реВрдк рд╕реЗ рддрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрд╕реЗ рдХрд┐рд╕реА рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЗ рдиреАрдЪреЗ рдиреЗрд╕реНрдЯ рдХрд░реЗрдВ: variant={{ default: { id: "prod_abc" } }}ред
рдЪреВрдБрдХрд┐ рдореИрдк рдХреА рдХреБрдВрдЬрд┐рдпрд╛рдБ рдЖрдкрдХреА рдШреЛрд╖рд┐рдд рдбрд┐рдХреНрд╢рдирд░реА рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рд╡рд┐рд░реБрджреНрдз рдЬрд╛рдБрдЪреА рдЬрд╛рддреА рд╣реИрдВ, рдХреЛрдИ рдЯрд╛рдЗрдкреЛ тАФ рдпрд╛ рд╕реАрдзреЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рд╡реИрд░рд┐рдПрдВрдЯ, рдЬреИрд╕реЗ variant={{ id: "prod_abc" }} тАФ рд╕рдВрдХрд▓рди-рд╕рдордп рддреНрд░реБрдЯрд┐ рд╣реИред
рд▓реЛрдбрд┐рдВрдЧ рдореЛрдб
рдСрдмреНрдЬреЗрдХреНрдЯ рд╡реИрд░рд┐рдПрдВрдЯ рдЕрдХреНрд╕рд░ рдЖрд▓рд╕реА рд░реВрдк рд╕реЗ рд▓реЛрдб рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЗрд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдХреНрд╢рдирд░реА рдкрд░ importMode рд╕реЗрдЯ рдХрд░реЗрдВ:
рдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
const dictionary = {
key: "product",
importMode: "fetch", // or "dynamic"
variant: { id: "prod_abc", userId: "user_123" },
content: { тАж },
} satisfies Dictionary;
export default dictionary;
static, dynamic рдФрд░ fetch рдореЛрдб рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП рдмрдВрдбрд▓ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рджреЗрдЦреЗрдВред
рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓реЗ
- рдкреНрд░рдпреЛрдЧ key рджреНрд╡рд╛рд░рд╛ рд╕рдВрдЪрд╛рд▓рд┐рдд A/B рдЯреЗрдХреНрд╕реНрдЯ рдкрд░реАрдХреНрд╖рдг
- рдореМрд╕рдореА рдпрд╛ рдкреНрд░рдЪрд╛рд░рд╛рддреНрдордХ рдмреИрдирд░
- рдлрд╝реАрдЪрд░-рдлрд╝реНрд▓реИрдЧ рд╕рдВрджреЗрд╢
- locale-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рд░реНрдХреЗрдЯрд┐рдВрдЧ рдЕрднрд┐рдпрд╛рди
- CMS рдореЗрдВ рдкреНрд░рдмрдВрдзрд┐рдд рдкреНрд░рддрд┐-рдЙрддреНрдкрд╛рдж рдорд╛рд░реНрдХреЗрдЯрд┐рдВрдЧ рдЯреЗрдХреНрд╕реНрдЯ
- рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдпрд╛ рдЦрд╛рддрд╛-рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рд╛рдордЧреНрд░реА
- рд░рдирдЯрд╛рдЗрдо рдкрд░ рдЕрдкрд╛рд░рджрд░реНрд╢реА ID рджреНрд╡рд╛рд░рд╛ рдХреБрдВрдЬреАрдмрджреНрдз рдХреЛрдИ рднреА рд╕рд╛рдордЧреНрд░реА
