1
0
mirror of https://github.com/kremalicious/metamask-extension.git synced 2024-12-23 09:52:26 +01:00
metamask-extension/ui/app/contexts/i18n.js
Mark Stacey 2b6aff535e
Migrate "i18n-provider" to new context API (#8213)
The "i18n-provider" module has been replaced by a new `i18n.js` module
in the `contexts` directory which provides the `t` function via the new
React Context API.

The legacy context API is still used throughout the codebase, so a
legacy context provider has also been added as a shim until we migrate
away from the old API. The migration does require changing every single
place where the `t` function is used, so it is a non-trivial amount of
work. This shim allows us to tackle it one piece at a time without
breaking anything.

This was placed in a new `contexts` directory because it didn't seem
to belong in any existing categories. It certainly isn't a higher-order
component.
2020-03-23 14:07:05 -03:00

62 lines
1.4 KiB
JavaScript

import React, { Component, createContext, useMemo } from 'react'
import PropTypes from 'prop-types'
import { useSelector } from 'react-redux'
import { getMessage } from '../helpers/utils/i18n-helper'
import { getCurrentLocale } from '../ducks/metamask/metamask'
import { getCurrentLocaleMessages, getEnLocaleMessages } from '../ducks/locale/locale'
export const I18nContext = createContext((key) => `[${key}]`)
export const I18nProvider = (props) => {
const currentLocale = useSelector(getCurrentLocale)
const current = useSelector(getCurrentLocaleMessages)
const en = useSelector(getEnLocaleMessages)
const t = useMemo(() => {
return (key, ...args) => (
getMessage(currentLocale, current, key, ...args) ||
getMessage(currentLocale, en, key, ...args)
)
}, [currentLocale, current, en])
return (
<I18nContext.Provider value={t}>
{ props.children }
</I18nContext.Provider>
)
}
I18nProvider.propTypes = {
children: PropTypes.node,
}
I18nProvider.defaultProps = {
children: undefined,
}
export class LegacyI18nProvider extends Component {
static propTypes = {
children: PropTypes.node,
}
static defaultProps = {
children: undefined,
}
static contextType = I18nContext
static childContextTypes = {
t: PropTypes.func,
}
getChildContext () {
return {
t: this.context,
}
}
render () {
return this.props.children
}
}