React-intl define messages outside of react

前端 未结 3 632
醉梦人生
醉梦人生 2021-01-17 15:53

I have utils.js file.

export function categoryIdToCategoryName(categoryId) {
let name;
switch (categoryId) {
    case constants.RISK_CATEGORY_LOW:
        na         


        
相关标签:
3条回答
  • 2021-01-17 16:36

    I think in your case you want to have access to the intl object but this file is not a react component, right? If it is the case, you'd have to create a provider inside this file, something similar to what you probably already have in your index.js file.

    In your utils.js file you'd add this:

    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;
    }
    

    You can also check this answer: React-intl for non components

    0 讨论(0)
  • 2021-01-17 16:54

    It can now be done with the CreateIntl API (version 4.6.4 React-intl)

    Here is a code snippet that is working for me :

    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
    
    0 讨论(0)
  • 2021-01-17 16:56

    You can directly use the yahoo intl library for this task: https://github.com/yahoo/intl-messageformat

    Otherwise you can pass the formatMessage function from your react component to the functions it calls.

    0 讨论(0)
提交回复
热议问题