ice icon indicating copy to clipboard operation
ice copied to clipboard

build-plugin-ice-i18n 如何配置使切换语言时不刷新页面?

Open we6288815 opened this issue 2 years ago • 4 comments

What is the current behavior? 发生了什么?

import { useLocale } from 'ice'; const [, setLocale] = useLocale(); 使用setLocale切换语言时,会刷新页面。

What is the expected behavior? 期望的结果是什么?

使用setLocale切换语言时,不需要刷新页面即可预览多语言效果。

Any additional comments? 相关环境信息?

  • ice.js Version:^2.0.0
  • build.json Configuration

"plugins": [ [ "build-plugin-moment-locales", { "locales": ["zh-cn"] } ], [ "build-plugin-ice-i18n", { "locales": ["en-US", "zh-CN", "de"], "defaultLocale": "en-US" } ] ]

  • Node Version:
  • Platform: windows 10 x64

we6288815 avatar Feb 21 '22 08:02 we6288815

现在没有刷新页面的吧。可以方便发一个可复现的最小 demo 么

luhc228 avatar Feb 21 '22 08:02 luhc228

好的,我看看弄个demo

we6288815 avatar Feb 21 '22 08:02 we6288815

引入ConfigProvider切换语言就会刷新页面,注释掉就不会

import * as React from 'react';
import { IntlProvider } from 'react-intl';
import { ConfigProvider } from '@alifd/next';

// 引入基础组件的语言包
import enUS from '@alifd/next/lib/locale/en-us';
import zhCN from '@alifd/next/lib/locale/zh-cn';

// 引入 locale 配置文件
import localeEnUS from '@/locales/en-US';
import localeZhCN from '@/locales/zh-CN';
import { getDefaultLocale, useLocale } from 'ice';

// 设置语言包
// addLocaleData([...en, ...zh]);

const localeInfo = {
  'zh-CN': {
    nextLocale: zhCN,
    appLocale: 'zh',
    appMessages: localeZhCN,
  },
  'en-US': {
    nextLocale: enUS,
    appLocale: 'en',
    appMessages: localeEnUS,
  },
};

interface Props {
  children: React.ReactNode;
}

function LocaleProvider(props: Props) {
  const { children } = props;
  const [locale] = useLocale();
  const defaultLocale = getDefaultLocale();

  const myLocale = localeInfo[locale]
    ? localeInfo[locale]
    : localeInfo[defaultLocale];

  return (
    <IntlProvider locale={myLocale.appLocale} messages={myLocale.appMessages} defaultLocale={defaultLocale}>
      {/** 引入ConfigProvider切换语言就会刷新页面,注释掉就不会 */}
      <ConfigProvider locale={myLocale.nextLocale}>
        {React.Children.only(children)}
      </ConfigProvider>
    </IntlProvider>
  );
}

export default LocaleProvider;

we6288815 avatar Feb 21 '22 09:02 we6288815

ConfigProvider 只会让组件 rerender,不会刷新整个页面

bindoon avatar Feb 22 '22 02:02 bindoon

可以确认下是刷新还是重新渲染,如果还有问题可以提供复现 demo

ClarkXia avatar Aug 26 '22 03:08 ClarkXia