--- createdAt: 2026-06-12 updatedAt: 2026-06-12 title: 变体 description: 在 Intlayer 内容文件中使用 variant 元数据字段来声明命名内容替代方案(A/B 测试、季节性横幅、受功能标志控制的文案),并在运行时切换它们而无需更改代码。 keywords: - 变体 - A/B 测试 - 功能标志 - 动态内容 - Intlayer - 国际化 slugs: - doc - concept - variants history: - version: 9.0.0 date: 2026-06-12 changes: "发布变体字典功能" author: aymericzip --- # 变体 **变体**(Variant)是一组共享相同字典键(`key`)但声明不同变体名称(`variant`)的内容文件。Intlayer 会根据传递给 `useIntlayer` 的选择器提供合适的文件。 ## 声明变体 每个文件代表一个命名替代方案。如果省略 `variant`(或将其设置为 `"default"`),则表示它是默认(回退)变体。 ```ts fileName="hero-banner.content.ts" contentDeclarationFormat={["typescript", "esm", "commonjs"]} 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; ``` ```ts fileName="hero-banner.black-friday.content.ts" contentDeclarationFormat={["typescript", "esm", "commonjs"]} 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; ``` ## 使用变体 ### 默认变体 ```tsx fileName="Hero.tsx" contentDeclarationFormat={["typescript", "esm", "commonjs"]} import { useIntlayer } from "react-intlayer"; export const Hero = () => { const { headline, cta } = useIntlayer("hero-banner"); // → 默认变体 return (

{headline}

{cta}
); }; ```
```tsx fileName="Hero.tsx" contentDeclarationFormat={["typescript", "esm", "commonjs"]} import { useIntlayer } from "next-intlayer"; export const Hero = () => { const { headline, cta } = useIntlayer("hero-banner"); // → 默认变体 return (

{headline}

{cta}
); }; ```
```vue fileName="Hero.vue" contentDeclarationFormat={["typescript", "esm", "commonjs"]} ``` ```svelte fileName="Hero.svelte" contentDeclarationFormat={["typescript", "esm", "commonjs"]}

{$content.headline}

{$content.cta}
```
```tsx fileName="Hero.tsx" contentDeclarationFormat={["typescript", "esm", "commonjs"]} import { useIntlayer } from "preact-intlayer"; export const Hero = () => { const { headline, cta } = useIntlayer("hero-banner"); // → 默认变体 return (

{headline}

{cta}
); }; ```
```tsx fileName="Hero.tsx" contentDeclarationFormat={["typescript", "esm", "commonjs"]} import { useIntlayer } from "solid-intlayer"; export const Hero = () => { const content = useIntlayer("hero-banner"); // → 默认变体 return (

{content().headline}

{content().cta}
); }; ```
```typescript fileName="hero.component.ts" contentDeclarationFormat={["typescript", "esm", "commonjs"]} import { Component } from "@angular/core"; import { useIntlayer } from "angular-intlayer"; @Component({ selector: "app-hero", template: `

{{ content().headline }}

{{ content().cta }}
`, }) export class HeroComponent { content = useIntlayer("hero-banner"); } ```
```javascript fileName="hero.js" import { useIntlayer } from "vanilla-intlayer"; const { headline, cta } = useIntlayer("hero-banner"); document.body.innerHTML = `

${headline}

${cta}
`; ```
### 命名变体 ```tsx const { headline, cta } = useIntlayer("hero-banner", { variant: "black_friday", }); ``` ### 使用显式语言环境的命名变体 ```tsx const content = useIntlayer("hero-banner", { variant: "black_friday", locale: "zh", }); ``` ## 典型使用场景 - 由实验键值驱动的文案 A/B 测试 - 季节性或促销横幅 - 受功能标志(feature flags)控制的消息文案 - 针对特定区域的营销活动