React-intl:为什么需要使用<formattedmessage>组件或defineMessagesAPI函数来定义消息

时间:2019-03-05 06:53:20

标签: reactjs internationalization react-intl

我目前具有以下格式的英语和日语.json文件翻译版本:

{
"en": [{
    "id": "Cancel",
    "defaultMessage": "Cancel"
}, {
    "id": "CommonTags",
    "defaultMessage": "Common Tags"
}]
"ja": [{
    "id": "Cancel",
    "defaultMessage": "キャンセル"
}, {
    "id": "CommonTags",
    "defaultMessage": "共通タグ"
    }]}

我的问题是,考虑到我已经生成并翻译了所有这些消息,为什么现在需要定义消息?我只是想通过以下方式访问它们,但会收到错误消息:

var messages_ja = require("../../../Resources/Resources.ja2.js.json");

class LocalizedApp extends React.Component {
props: any;
static propTypes: { intl: (object: any, key: string, componentName: string, ...rest: any[]) => Error | null; };
render() {
    return (...
       <h1>{this.props.intl.formatMessage({ id: messages_ja.Cancel })}</h1>);}}

我收到以下错误:

[React Intl]必须提供id来格式化消息。

重复我的问题:

  1. 我真的需要合并用于定义消息的生态系统吗? 如果是这样,为什么?
  2. 是否可以根据以下内容简单地访问字符串     json中的语言环境,而无需为其创建formattedMessages。

谢谢。

1 个答案:

答案 0 :(得分:0)

问题1的答案:

我会说是的。您必须在使用声明式(例如:library)或命令式api(例如:<FormattedMessage />)之间进行选择。

问题2的答案:

可以,但是那为什么要使用intl.formatMessage()?  (您可以说,您只想使用其本地化方法来显示日期,数字,百分比..没关系,但是恕我直言,除了使用lib之外,您还需要更多的精力来构建自己的解决方案。)

我总是喜欢使用声明性API,这是一个好习惯,要有一个 ID 和一个默认消息。 react-intl抱怨的这个默认消息实际上是为了帮助您。如果您错过了一次翻译,这是一个后备方法,它默认为此消息。

如果您想重用标签或需要在react组件之外使用它们,我建议使用命令式api(根据我的经验,这是唯一可以完成的情况)。您还可以使用babel-plugin-react-intl从应用程序中自动提取标签,使生活变得非常轻松!