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

Posted

技术标签:

【中文标题】如何使用 react-intl 使用标签(链接)格式化消息?【英文标题】:How can I formatMessage with a tags (links) using react-intl? 【发布时间】:2017-04-29 00:25:11 【问题描述】:

我需要添加指向我需要翻译的文本的链接。如何格式化有链接的消息?

现在这就是我想要做的:

const messages = defineMessages(
  copy: 
    id: 'checkout.OrderReview.copy',
    description: 'Label for add card button',
    defaultMessage: 'By clicking the "Place Order" button, you confirm that you have read, understood, and accept our termsAndConditionsLink, returnPolicyLink, and privacyPolicyLink.',
  ,
  termsAndConditions: 
    id: 'checkout.OrderReview.termsAndConditions',
    description: 'Label for terms and conditions link',
    defaultMessage: 'Terms and Conditions',
  ,
  returnPolicy: 
    id: 'checkout.OrderReview.returnPolicy',
    description: 'Label for return policy link',
    defaultMessage: 'Return Policy',
  ,
  privacyPolicy: 
    id: 'checkout.OrderReview.privacyPolicy',
    description: 'Label for privacy policy link',
    defaultMessage: 'Privacy Policy',
  ,
);

然后,在渲染函数中:

  const copy = formatMessage(messages.copy, 
    termsAndConditionsLink: <a href="#" className="u-underline text-color-grey">`$formatMessage(messages.termsAndConditions)`</a>,
    returnPolicyLink: <a href="#" className="u-underline text-color-grey">`$formatMessage(messages.returnPolicy)`</a>,
    privacyPolicyLink: <a href="#" className="u-underline text-color-grey">`$formatMessage(messages.privacyPolicy)`</a>,
  );

return <div>  copy  </div>

这不起作用。我得到: 点击“下单”按钮,即表示您确认已阅读、理解并接受我们的[object Object]、[object Object]、[object Object]。

完成这项任务的正确方法是什么?

【问题讨论】:

目前看来这是不支持的。 github.com/yahoo/react-intl/issues/137 【参考方案1】:

Can you use the FormattedhtmlMessage component?

const messages = defineMessages(
  copy: 
    id: 'checkout.OrderReview.copy',
    description: 'Label for add card button',
    defaultMessage: 'By clicking the "Place Order" button, you confirm that you have read, understood, and accept our termsAndConditionsLink, returnPolicyLink, and privacyPolicyLink.',
  ,
  termsAndConditions: 
    id: 'checkout.OrderReview.termsAndConditions',
    defaultMessage: '<a href="/url">Terms and Conditions</a>',
  ,
);

const Component = () => <FormattedHTMLMessage ...
  ...messages.copy,
  values: 
    termsAndConditionsLink: <FormattedHTMLMessage ...messages. termsAndConditions />
  
 />

【讨论】:

【参考方案2】:

首先,这取决于您的 react-intl 版本。 我已经使用react-intl v2.x(准确地说是2.8)使它工作。我是这样做的:

const messages = defineMessages(
  copy: 
    id: 'copy',
    defaultMessage: 'Accept our TermsAndConditionsLink',
  ,
  termsAndConditions: 
    id: 'termsAndConditions',
    defaultMessage: 'Terms and conditions',
  ,
  termsAndConditionsUrl: 
    id: 'termsAndConditionsUrl',
    defaultMessage: '/url',
  ,
);

<FormattedMessage
  ...messages.copy
  values=
    TermsAndConditionsLink: (
      <a href=intl.formatMessage(messages.termsAndConditionsUrl)>
        intl.formatMessage(messages.termsAndConditions)
      </a>
    ),
  
/>

对于较新的react-intl 版本,您可以在文档中找到答案:

v3.x: https://formatjs.io/docs/react-intl/upgrade-guide-3x#enhanced-formattedmessage--formatmessage-rich-text-formatting

v4.x: https://formatjs.io/docs/react-intl/api/#formatmessage

【讨论】:

作为参考,这是他们将所有内容移出 github 后的最新文档:formatjs.io/docs/react-intl/api#formatmessage【参考方案3】:
<FormattedMessage 
        id="footer.table_no" 
        defaultMessage="Hello link" 
        values= link: <a href="www.google.com">World</a> 
    />

【讨论】:

以上是关于如何使用 react-intl 使用标签(链接)格式化消息?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 react-intl 2 与 redux 一起使用?

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

使用 Yahoo 的 react-intl 使用 React.js 进行国际化

tableview 单元格我们如何快速调整单元格的大小以及图像和标签

React-intl,使用 api 和 Typescript

使用 react-intl,但返回值被转义