故事书:如何根据全局变量更新 i18 语言环境

Posted

技术标签:

【中文标题】故事书:如何根据全局变量更新 i18 语言环境【英文标题】:Storybook: how to update i18 locale depending on globals 【发布时间】:2021-09-19 16:04:46 【问题描述】:

我尝试从 @storybook/addon-knobs 迁移到 @storybook/addon-controls,但遇到了问题。

我有一个用于更新 i18n 语言环境旋钮。 它还从 rtl 切换到 ltr。 它完美无瑕:

import  select  from '@storybook/addon-knobs'
import Vue from "vue";

// import vue plugins
import VueI18n from "vue-i18n";

// import language file
const message = require("./translations.json");

// i18n and store
Vue.use(VueI18n);

import store from "../src/store";
addDecorator(() => (
  template: "<story/>",
  i18n: new VueI18n(
    defaultLocale: 'en',
    locale: 'en',
    locales: [ 'en', 'ar' ],
    messages: 
      en: message.en,
      ar: message.ar,
    ,
  ),
  // add a props to toggle language
  props: 
    storybookLocale: 
      type: String,
      default: select('I18n locale', ['en', 'ar'], 'en'),
    ,
  ,
  watch: 
    // add a watcher to toggle language
    storybookLocale: 
      handler() 
        this.$i18n.locale = this.storybookLocale;
        let dir = this.storybookLocale === 'ar' ? 'rtl' : 'ltr';
        document.querySelector('html').setAttribute('dir', dir);
      ,
      immediate: true,
    ,
  ,
));

现在,当我尝试使用@storybook/addon-controls 时,我不明白该怎么做。

我已阅读Storybook documentation 并且能够移除我的旋钮以在工具栏中添加新选择。

export const globalTypes = 
  storybookLocale: 
    name: 'storybookLocale',
    description: 'Internationalization locale',
    defaultValue: 'en',
    toolbar: 
      icon: 'globe',
      items: [
         value: 'en', right: '????????', title: 'English' ,
         value: 'ar', right: '????????', title: 'Arabic' ,
      ],
    ,
  ,
;

这是一个故事的例子:

import SectionTitle from '../src/components/onboarding/section-title.vue'

export default 
  title: 'Onboarding/Components/Title',
  component: SectionTitle,
;

const Template = (args,  argTypes ) => (
  props: Object.keys(argTypes),
  components:  SectionTitle ,
  template: '<SectionTitle v-bind="$props" />',
);

export const Title:any = Template.bind();
Title.args = 
  stepNumber: 1,

我不知道如何观察这种全球变化来更新我的 i18n 和语言方向。 在文档中,全局在故事中使用,但我希望它是全局的。

任何帮助将不胜感激。

【问题讨论】:

"&lt;story/&gt;" 来自哪里——story 不应该是传递给addDecorator 的回调中的参数吗? &lt;story /&gt; 工作正常,我不是一开始就设置项目的人,这不是我改变的东西。也许它应该是一个参数。 你能分享一个例子吗? 【参考方案1】:

我更熟悉 React,但我认为这些方面的东西应该可以工作。

解决方案

监听context.globals 作为第二个参数传递给装饰器。 将addDecorator 替换为导出的decorators 数组。 将this.storybookLocale 更新为 context.globals.storybookLocale

笔记

文档解释了如何为全局变量 here 使用装饰器。 我找到了这个相关的article,但最终并没有从中受益,因为您已经进行了基本设置。他们确实会执行一些额外的步骤,但我不确定它们对您的情况是否必要。

.storybook/preview.js

import Vue from "vue";
import VueI18n from "vue-i18n";
import store from "../src/store";
import message from "./translations.json";

Vue.use(VueI18n);

export const globalTypes = 
  storybookLocale: 
    name: 'storybookLocale',
    description: 'Internationalization locale',
    defaultValue: 'en',
    toolbar: 
      icon: 'globe',
      items: [
         value: 'en', right: '??', title: 'English' ,
         value: 'ar', right: '??', title: 'Arabic' ,
      ],
    ,
  ,
;

export const decorators = [
  (story, context) => (
    template: "<story/>",
    i18n: new VueI18n(
      defaultLocale: 'en',
      locale: 'en',
      locales: [ 'en', 'ar' ],
      messages: 
        en: message.en,
        ar: message.ar,
      ,
    ),
    props: 
      storybookLocale: 
        type: String,
        default: 'en',
      ,
    ,
    watch: 
      storybookLocale: 
        handler() 
          this.$i18n.locale = context.globals.storybookLocale;
          let dir = storybookLocale === 'ar' ? 'rtl' : 'ltr';
          document.querySelector('html').setAttribute('dir', dir);
        ,
        immediate: true,
      ,
    ,
  )
];

【讨论】:

您好,感谢您的回答。似乎观察者仅在加载时触发,之后它永远不会触发。 (我有一个控制台登录 handler(),它只显示一次。 我想看一个示例故事 - 之前对这个问题发表了评论。 已添加,抱歉我错过了评论。 @JBallin

以上是关于故事书:如何根据全局变量更新 i18 语言环境的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 i18n 和 rails 配置语言环境别名?

Vue 项目中实现多语言国际化 ( i18n )

如何使用 spring-boot 和 thymeleaf 设置标准 i18n 语言环境?

使用 i18n 和 Nuxt 时设置语言属性?

如何为仅支持Ruby的项目向i18n添加可用的语言环境?

下一个翻译成故事书