@6thquake/react-material
Version:
React components that implement Google's Material Design.
133 lines (108 loc) • 2.94 kB
JavaScript
import _extends from "@babel/runtime/helpers/extends";
/**
* @ignore - do not document.
*/
import React from 'react';
import PropTypes from 'prop-types';
import en, { en_us, zh_cn, zh_tw } from './languages';
import DateTimePickersProvider from '../Picker/DateTimePickersProvider';
import MomentUtils from '../Picker/utils/moment-utils';
import moment from 'moment';
import 'moment/locale/en-ca';
import 'moment/locale/zh-cn';
import deepmerge from 'deepmerge';
const languages = {
'zh-tw': zh_tw,
'zh-cn': zh_cn,
zh: zh_cn,
'en-ca': en_us,
'en-us': en_us,
en
};
const getLanguage = (lang, value) => {
const _languages = value || languages;
if (lang) {
lang = lang.toLowerCase();
if (_languages[lang]) {
return lang;
}
lang = lang.split('-')[0];
if (_languages[lang]) {
return lang;
}
}
return 'en';
};
const getLocaleResource = (lang, value) => {
const lang1 = getLanguage(lang);
if (!value) {
return languages[lang1];
}
const lang2 = getLanguage(lang, value);
return _extends({}, deepmerge(languages[lang1], value[lang2]));
};
const getDefaultLocale = () => {
const wg = global || window;
const lang = wg && wg.navigator && wg.navigator.language;
return getLanguage(lang);
};
const getDefaultLocaleResource = () => {
const lang = getDefaultLocale();
return getLocaleResource(lang);
};
const defaultLocale = getDefaultLocaleResource();
const LocaleContext = React.createContext(defaultLocale);
const LocaleConsumer = LocaleContext.Consumer;
class LocaleProvider extends React.Component {
constructor(props) {
super(props);
this.changeLocale = locale => () => {
this.setState({
locale
});
};
this.getLocale = () => this.state.locale;
this.state = {
locale: props.locale || defaultLocale.locale
};
}
render() {
const {
children
} = this.props;
const {
locale
} = this.state;
if (locale) {
moment.locale(locale);
LocaleProvider.locale = this.state.locale;
}
const value = _extends({}, {
changeLocale: this.changeLocale.bind(this)
}, getLocaleResource(locale, this.props.value));
return React.createElement(LocaleContext.Provider, {
locale: locale,
value: value
}, React.createElement(DateTimePickersProvider, {
utils: MomentUtils,
locale: locale,
moment: moment
}, children));
}
}
LocaleProvider.locale = 'en';
process.env.NODE_ENV !== "production" ? LocaleProvider.propTypes = {
/**
* The International resources
*/
children: PropTypes.node,
/**
* Type of locale, such as en, zh, en_us...
*/
locale: PropTypes.string,
/**
* You can wrap a node.
*/
value: PropTypes.object
} : void 0;
export { LocaleContext, LocaleProvider, LocaleConsumer, getLanguage, getLocaleResource, getDefaultLocaleResource, getLanguage as getLocale, getDefaultLocale };