React-intl: зачем определять сообщения, используя либо компонент <FormattedMessage>, либо функцию defineMessagesAPI - PullRequest
0 голосов
/ 05 марта 2019

В настоящее время у меня есть переведенный английский и японский файл .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, не создавая для них отформатированные сообщения.

Заранее спасибо.

1 Ответ

0 голосов
/ 05 марта 2019

Ответ на вопрос 1:

Я бы сказал, да.Вы должны выбрать между использованием декларативного (например: <FormattedMessage />) или императивного API (например: intl.formatMessage()).

Ответ на вопрос 2:

Можно, но тогда зачем тогда использовать react-intl?(Вы могли бы сказать, что вы хотите использовать только методы локализации для даты, чисел, процентов ... это было бы нормально, но ИМХО у вас было бы гораздо больше усилий, чтобы создать собственное решение, отличное от использования библиотеки lib.)

Я всегда предпочитаю использовать декларативный API, и рекомендуется иметь ID и сообщение по умолчанию .Это сообщение по умолчанию, на которое реагирует реагирующий-международный, на самом деле вам поможет.Это запасной вариант, так как в случае, если вы пропустили один перевод, по умолчанию это сообщение.

Я рекомендую использовать императивный API, если вы хотите повторно использовать метки или если вам нужно использовать их вне компонентов реагирования (из моего опыта,это были единственные случаи, когда это можно было сделать).Вы также можете использовать babel-plugin-реагировать-intl , чтобы автоматически извлечь ярлыки из вашего приложения и сделать вашу жизнь намного проще!

...