mirror of
https://github.com/terribleplan/next.js.git
synced 2024-01-19 02:48:18 +00:00
629d0a261b
This has never been working, we based our intl + locale lookups out of this example and found out when translations wasn't working on page transitions due to the fact that messages gets set to undefined because its trying to destruct in the incorrect level
45 lines
1.5 KiB
JavaScript
45 lines
1.5 KiB
JavaScript
import React, {Component} from 'react'
|
|
import {IntlProvider, addLocaleData, injectIntl} from 'react-intl'
|
|
|
|
// Register React Intl's locale data for the user's locale in the browser. This
|
|
// locale data was added to the page by `pages/_document.js`. This only happens
|
|
// once, on initial page load in the browser.
|
|
if (typeof window !== 'undefined' && window.ReactIntlLocaleData) {
|
|
Object.keys(window.ReactIntlLocaleData).forEach((lang) => {
|
|
addLocaleData(window.ReactIntlLocaleData[lang])
|
|
})
|
|
}
|
|
|
|
export default (Page) => {
|
|
const IntlPage = injectIntl(Page)
|
|
|
|
return class PageWithIntl extends Component {
|
|
static async getInitialProps (context) {
|
|
let props
|
|
if (typeof Page.getInitialProps === 'function') {
|
|
props = await Page.getInitialProps(context)
|
|
}
|
|
|
|
// Get the `locale` and `messages` from the request object on the server.
|
|
// In the browser, use the same values that the server serialized.
|
|
const {req} = context
|
|
const {locale, messages} = req || window.__NEXT_DATA__.props.initialProps
|
|
|
|
// Always update the current time on page load/transition because the
|
|
// <IntlProvider> will be a new instance even with pushState routing.
|
|
const now = Date.now()
|
|
|
|
return {...props, locale, messages, now}
|
|
}
|
|
|
|
render () {
|
|
const {locale, messages, now, ...props} = this.props
|
|
return (
|
|
<IntlProvider locale={locale} messages={messages} initialNow={now}>
|
|
<IntlPage {...props} />
|
|
</IntlProvider>
|
|
)
|
|
}
|
|
}
|
|
}
|