加入直播:周四美国东部时间上午 11 点,Storybook 9 发布及问答

Storybook i18next 插件

为 Storybook 添加 i18next 支持

在 Github 上查看

Storybook react-i18next 插件

简单易用的 react-i18next Storybook 集成。

所需的同级依赖

  • 版本 4.x - storybook - ^9.0.0

  • 版本 3.x - storybook - ^8.0.0

  • i18next - ^22.0.0 || ^23.0.0 || ^24.0.0 || ^25.0.0

  • i18next-browser-languagedetector - ^7.0.0 || ^8.0.0

  • i18next-http-backend: ^2.0.0 || ^3.0.0

  • react-i18next - ^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0

此 Storybook 插件假设您的项目已配置并使用了 i18nextreact-i18next,并且所有必需的包都已安装并正常工作。

安装

将此插件作为开发依赖安装。

npm i -D storybook-react-i18next

如果您的项目中尚未安装 i18nextreact-i18next,则需要将它们作为依赖项安装。

npm i -S i18next react-i18next i18next-browser-languagedetector i18next-http-backend

使用方法

安装后,按照以下 3 个步骤在 Storybook 中启用此插件。

main.ts

将此插件插入到您的 addons 数组中

{
  addons: [
    // other addons...
    'storybook-react-i18next',
  ]
}

i18next.ts

在您的 .storybook 文件夹中创建一个名为 i18next.ts(或您喜欢的任何名称)的文件。

在此文件中,复制并粘贴以下代码,并进行您需要的任何修改(资源文件路径、语言等)。

import {initReactI18next} from 'react-i18next';
import i18n from 'i18next';
import Backend from 'i18next-http-backend';
import LanguageDetector from 'i18next-browser-languagedetector';

const ns = ['common'];
const supportedLngs = ['en', 'fr', 'ja'];
const resources = ns.reduce((acc, n) => {
    supportedLngs.forEach((lng) => {
    if (!acc[lng]) acc[lng] = {};
        acc[lng] = {
            ...acc[lng],
            [n]: require(`../public/locales/${lng}/${n}.json`),
        };
    });
    return acc;
}, {});

i18n.use(initReactI18next)
    .use(LanguageDetector)
    .use(Backend)
    .init({
        //debug: true,
        lng: 'en',
        fallbackLng: 'en',
        defaultNS: 'common',
        ns,
        interpolation: {escapeValue: false},
        react: {useSuspense: false},
        supportedLngs,
        resources,
    });

export default i18n;

有关配置选项的详细信息,请参阅 i18next 配置选项 文档。


preview.ts

在您的 preview.ts 中,您需要将 localeslocale 添加到 initialGlobals(如果您未安装最新版本的 storybook,则添加到 globals),并将从上述文件导出的 i18n 添加到 parameters 中。

locales 是一个对象,其中键是区域设置/语言的“id”,值是您希望在下拉列表中显示的名称。

locale 是您希望的默认区域设置。

import i18n from './i18next';

const preview: Preview = {
    initialGlobals: {
        locale: 'en',
        locales: {
            en: 'English',
            fr: 'Français',
            ja: '日本語',
        },
    },
    parameters: {
        i18n,
    },
};

export default preview;

您也可以使用完整的区域设置字符串作为键。这取决于您的 i18next 配置。

import i18n from './i18next';

const preview: Preview = {
    initialGlobals: {
        locale: 'en_US',
        locales: {
            en_US: 'English (US)',
            en_GB: 'English (GB)',
            fr_FR: 'Français',
            ja_JP: '日本語',
        },
    },
    parameters: {
        i18n,
    },
};

export default preview;

locales 对象的值也可以是一个对象,包含 titleleftright 作为键。

如果您想在左侧或右侧包含一个表情符号旗帜或其他字符串,这将非常有用。

例如

import i18n from './i18next';

const preview: Preview = {
    initialGlobals: {
        locale: "en",
        locales: {
            en: {icon: '🇺🇸', title: 'English', right: 'EN'},
            fr: {icon: '🇫🇷', title: 'Français', right: 'FR'},
            ja: {icon: '🇯🇵', title: '日本語', right: 'JP'},
        },
    },
    parameters: {
        i18n,
    },
};

export default preview;

或者像这样

import i18n from './i18next';

const preview: Preview = {
    initialGlobals: {
        locale: 'en_US',
        locales: {
            en_US: {title: 'English', right: 'US'},
            en_GB: {title: 'English', right: 'GB'},
            fr_FR: {title: 'Français', right: 'FR'},
            ja_JP: {title: '日本語', right: 'JP'},
        },
    },
    parameters: {
        i18n,
    },
};

export default preview;

Story 参数区域设置

如果您希望某个 story 使用特定的区域设置,请在其 parameters 中进行设置。

export const Default: StoryObj = {
    render: () => <YourComponent/>,
};

export const Japanese: StoryObj = {
    parameters: {
        locale: 'ja',
    },
    render: () => <YourComponent/>,
};

请注意,这样做会将当前区域设置切换到参数中指定的区域设置,因此当您切换到一个没有参数的 story 时,它将保留在上一个选定的区域设置。

在上面的示例中,如果您查看日语 story,然后单击返回到默认 story,区域设置将保持为 ja


完成这些步骤并启动 storybook 后,您应该会在工具栏中看到一个地球图标。

单击此地球图标将显示一个下拉列表,其中包含您在 parameters 中定义的区域设置。

切换区域设置将使用您的区域设置 json 文件中定义的字符串。