我正在尝试在应用react-intl内使用包。该应用程序在服务器上呈现,因此我编写了一些代码来确定要使用和使用的语言IntlProvider。
react-intl
IntlProvider
翻译以messages.js文件形式提供,它们如下所示:
messages.js
export default { en: { message: '...some message', nested: { anotherMessage: '...another message', } } de: { // ... } }
我所做的是这样的:
// import messages from './messages.js' // Check the locale for the user (based on cookies or other things) const locale = ... // Get the required messages const messagesForLocale= = messages[locale]; // Supply the messages to the IntlProvider <IntlProvider locale={locale} messages={messagesForLocale}> // ... </IntlProvider>
然后,当我使用FormattedMessage组件时,无法使用以下anotherMessage代码访问嵌套消息():
FormattedMessage
anotherMessage
<FormattedMessage id="nested.anotherMessage" ... />
但是message可以访问。
message
我在哪里弄错了,或者在整个概念中我遗漏了什么?
由于React Intl v2不再支持嵌套的消息对象,因此需要对消息进行展平。
export const flattenMessages = ((nestedMessages, prefix = '') => { if (nestedMessages === null) { return {} } return Object.keys(nestedMessages).reduce((messages, key) => { const value = nestedMessages[key] const prefixedKey = prefix ? `${prefix}.${key}` : key if (typeof value === 'string') { Object.assign(messages, { [prefixedKey]: value }) } else { Object.assign(messages, flattenMessages(value, prefixedKey)) } return messages }, {}) }) // Use flattenMessages <IntlProvider locale={locale} messages={flattenMessages(messagesForLocale)}>
参考: