import React from 'react';
{{#localeList.length}}
import {
_setIntlObject,
addLocaleData,
IntlProvider,
intlShape,
LangContext,
_setLocaleContext
} from 'umi-plugin-locale/lib/locale';
const InjectedWrapper = (() => {
let sfc = (props, context) => {
_setIntlObject(context.intl);
return props.children;
};
sfc.contextTypes = {
intl: intlShape,
};
return sfc;
})();
{{/localeList.length}}
{{#localeList}}
{{#antd}}
{{#momentLocale}}
import 'moment/locale/{{momentLocale}}';
{{/momentLocale}}
{{/antd}}
{{/localeList}}
const baseNavigator = {{{baseNavigator}}};
const baseSeparator = '{{{baseSeparator}}}';
const useLocalStorage = {{{useLocalStorage}}};
{{#antd}}
import { LocaleProvider, version } from 'antd';
import moment from 'moment';
{{#defaultMomentLocale}}
import 'moment/locale/{{defaultMomentLocale}}';
{{/defaultMomentLocale}}
let defaultAntd = require('antd/{{requireModule}}/locale-provider/{{defaultAntdLocale}}');
defaultAntd = defaultAntd.default || defaultAntd;
{{/antd}}
const localeInfo = {
{{#localeList}}
'{{name}}': {
messages: {
{{#paths}}...((locale) => locale.__esModule ? locale.default : locale)(require('{{{.}}}')),{{/paths}}
},
locale: '{{name}}',
{{#antd}}antd: require('antd/{{requireModule}}/locale-provider/{{lang}}_{{country}}'),{{/antd}}
data: require('react-intl/locale-data/{{lang}}'),
momentLocale: '{{momentLocale}}',
},
{{/localeList}}
};
class LocaleWrapper extends React.Component{
state = {
locale: '{{defaultLocale}}',
};
getAppLocale(){
let appLocale = {
locale: '{{defaultLocale}}',
messages: {},
data: require('react-intl/locale-data/{{defaultLang}}'),
momentLocale: '{{defaultMomentLocale}}',
};
const runtimeLocale = require('umi/_runtimePlugin').mergeConfig('locale') || {};
const runtimeLocaleDefault = typeof runtimeLocale.default === 'function' ? runtimeLocale.default() : runtimeLocale.default;
if (
useLocalStorage
&& typeof localStorage !== 'undefined'
&& localStorage.getItem('umi_locale')
&& localeInfo[localStorage.getItem('umi_locale')]
) {
appLocale = localeInfo[localStorage.getItem('umi_locale')];
} else if (
typeof navigator !== 'undefined'
&& localeInfo[navigator.language]
&& baseNavigator
) {
appLocale = localeInfo[navigator.language];
} else if(localeInfo[runtimeLocaleDefault]){
appLocale = localeInfo[runtimeLocaleDefault];
} else {
appLocale = localeInfo['{{defaultLocale}}'] || appLocale;
}
window.g_lang = appLocale.locale;
window.g_langSeparator = baseSeparator || '-';
{{#localeList.length}}
appLocale.data && addLocaleData(appLocale.data);
{{/localeList.length}}
// support dynamic add messages for umi ui
// { 'zh-CN': { key: value }, 'en-US': { key: value } }
const runtimeLocaleMessagesType = typeof runtimeLocale.messages;
if (runtimeLocaleMessagesType === 'object' || runtimeLocaleMessagesType === 'function') {
const runtimeMessage = runtimeLocaleMessagesType === 'object'
? runtimeLocale.messages[appLocale.locale]
: runtimeLocale.messages()[appLocale.locale];
Object.assign(appLocale.messages, runtimeMessage || {});
}
return appLocale;
}
reloadAppLocale = () => {
const appLocale = this.getAppLocale();
this.setState({
locale: appLocale.locale,
});
};
render(){
const appLocale = this.getAppLocale();
// react-intl must use `-` separator
const reactIntlLocale = appLocale.locale.split(baseSeparator).join('-');
const LangContextValue = {
locale: reactIntlLocale,
reloadAppLocale: this.reloadAppLocale,
};
let ret = this.props.children;
{{#localeList.length}}
ret = (
{(value) => {
_setLocaleContext(value);
return this.props.children
}}
)
{{/localeList.length}}
{{#antd}}
// avoid antd ConfigProvider not found
let AntdProvider = LocaleProvider;
const [major, minor] = `${version || ''}`.split('.');
// antd 3.21.0 use ConfigProvider not LocaleProvider
const isConfigProvider = Number(major) > 3 || (Number(major) >= 3 && Number(minor) >= 21);
if (isConfigProvider) {
try {
AntdProvider = require('antd/{{requireModule}}/config-provider').default;
} catch (e) {}
}
return (
{ret}
);
{{/antd}}
return ret;
}
}
export default LocaleWrapper;