React-intl 在 react 之外定义消息

Posted

技术标签:

【中文标题】React-intl 在 react 之外定义消息【英文标题】:React-intl define messages outside of react 【发布时间】:2017-07-13 20:32:09 【问题描述】:

我有 utils.js 文件。

export function categoryIdToCategoryName(categoryId) 
let name;
switch (categoryId) 
    case constants.RISK_CATEGORY_LOW:
        name = 'low';
        break;
    case constants.RISK_CATEGORY_MEDIUM:
        name = 'medium';
        break;
    case constants.RISK_CATEGORY_HIGH:
        name = 'high';
        break;
    case constants.RISK_CATEGORY_CRITICAL:
        name = 'critical';
        break;
    default:
        console.warn('see: /utils/risk.js', 'categoryIdToCategoryName:', categoryId);
        name = 'unknown';
   
    return name;

我想使用https://github.com/yahoo/react-intl 翻译这些文本 - [低、中、高、关键]。所以我定义了消息

const translations = defineMessages(
riskLow: 
    id: 'utils.risk.low',
    defaultMessage: 'low',
,
riskMedium: 
    id: 'utils.risk.medium',
    defaultMessage: 'medium',
,
riskHigh: 
    id: 'utils.risk.high',
    defaultMessage: 'high',
,
riskCritical: 
    id: 'utils.risk.critical',
    defaultMessage: 'critical',

);

现在最后一步是什么?

如何将消息传递回函数?应该有formatMessage 函数,但它只在反应上下文中。

【问题讨论】:

【参考方案1】:

你可以直接使用 yahoo intl library 来完成这个任务:https://github.com/yahoo/intl-messageformat

否则,您可以将 formatMessage 函数从您的 react 组件传递给它调用的函数。

【讨论】:

【参考方案2】:

我认为在您的情况下,您希望访问 intl 对象,但该文件不是反应组件,对吗? 如果是这种情况,您必须在此文件中创建一个提供程序,类似于您在 index.js 文件中可能已有的内容。

在您的 utils.js 文件中添加以下内容:

import  IntlProvider, addLocaleData  from 'react-intl';
import localeDataEN from 'react-intl/locale-data/en';
import  translations  from '../point-to-your-translation-file';

addLocaleData(localeDataEN);
const locale = 'en'
const messages = //read it from your translated json file
const intlProvider = new IntlProvider( locale, messages );
const  intl  = intlProvider.getChildContext(); // this is how you get access to the formatMessage function to use i18n for your messages

function categoryIdToCategoryName(categoryId) 
let name;
switch (categoryId) 
    case constants.RISK_CATEGORY_LOW:
        name = intl.formatMessage(formMessages.riskLow);
        break;
    case constants.RISK_CATEGORY_MEDIUM:
        name = intl.formatMessage(formMessages.riskMedium);
        break;
    case constants.RISK_CATEGORY_HIGH:
        name = intl.formatMessage(formMessages.riskHigh);
        break;
    case constants.RISK_CATEGORY_CRITICAL:
        name = intl.formatMessage(formMessages.riskCritical);
        break;
    default:
        console.warn('see: /utils/risk.js', 'categoryIdToCategoryName:', categoryId);
        name = 'unknown';
   
    return name;

你也可以查看这个答案:React-intl for non components

【讨论】:

translations 从未使用过 它有点老了,但如果我没记错的话,这个想法是在消息中使用它(你看到评论的地方)。 @banan3'14 但这种感冒已经过时了,使用最新版本有不同的方法:)【参考方案3】:

现在可以使用CreateIntl API(版本 4.6.4 React-intl)来完成

这是一个对我有用的代码 sn-p:

import  createIntl, createIntlCache  from 'react-intl';
import English from '../../translations/en-US.json'; //your messages translated with id

const cache = createIntlCache();
const intl = createIntl( locale: 'en-US', messages: English, , cache);//locale and message can come from Redux or regular import
const number = intl.formatNumber(2000); //just use imperative way like you would with useIntl() hook or InjectIntl HOC

【讨论】:

以上是关于React-intl 在 react 之外定义消息的主要内容,如果未能解决你的问题,请参考以下文章

React-Intl:消息未在 Safari 中格式化

你如何将参数传递给react-intl中的defineMessages?

在 Redux 中间件中使用 React-intl 翻译的消息

React-Intl 如何从变量切换语言环境和消息

如何处理 React-Intl 消息的多次使用?

如何使用 react-intl 使用标签(链接)格式化消息?