Интернационализация с помощью React.js с использованием Yahoo react-intl

Я пытаюсь поддерживать разные языки в приложении React.js и обнаружил, что react-intl хороший кандидат. Они перешли на V2, но мне трудно понять как все это работает вместе. пример приложения слишком сложен и включает архитектуру клиент / сервер. . Я просто хочу одну страницу без сервера.

Похоже, шаги примерно такие:

  • Определите сообщения с помощью react-intl defineMessage
  • Добавьте языковые стандарты с помощью addLocaleData
  • Встраивайте сведенные данные сообщений в файлы для каждой локали с помощью сценария сборки.

Я выполнил эти шаги, но не понимаю, как отображать сообщения. У меня есть компонент React, завернутый в <IntlProvider>. Проблема react-intl V2 на github очень длинная, и я долго ее пробирался, пытаясь найти ответ. Может ли кто-нибудь предоставить простой рабочий пример?


person Reed G. Law    schedule 12.03.2016    source источник
comment
Вы придумали какой-нибудь пример, поделитесь, пожалуйста, если вы сделали или узнали базовый пример с использованием reac-intl, так как я также столкнулся с той же проблемой, что и вы   -  person iamsaksham    schedule 16.05.2016


Ответы (2)


Это измененный пример из response-intl wiki

Глядя на код ниже, в <IntlProvider> вам нужно будет передать опору messages={{post.title: "Hello World", post.body: "Amazing Content"}}. Это будет объект с ключами, которые вы перевели из сценария сборки.

При переключении языкового стандарта на «en» загружаются сообщения по умолчанию. AddLocaleData добавляет данные для перевода форматов чисел и дат, а не строк.

import React, {PropTypes} from 'react';
import ReactDOM from 'react-dom';

import {addLocaleData} from 'react-intl';
import en from 'react-intl/locale-data/en';
import fr from 'react-intl/locale-data/fr';
import es from 'react-intl/locale-data/es';
import pt from 'react-intl/locale-data/pt'

addLocaleData([...en, ...fr, ...es, ...pt]);

import {
    injectIntl,
    IntlProvider,
    FormattedRelative,
    FormattedMessage
} from 'react-intl';

const PostDate = injectIntl(({date, intl}) => (
    <span title={intl.formatDate(date)}>
        <FormattedRelative value={date}/>
    </span>
));

const App = ({post}) => (
    <div>
        <h1>{post.title}</h1>
        <p><PostDate date={post.date}/></p>
        <div>{post.body}</div>
    </div>
);

ReactDOM.render(
    <IntlProvider locale={'pt'} messages={{post.title: "Olá Mundo", post.body: "conteúdo surpreendente"}}>
        <App
            post={{
                title: <FormattedMessage id='post.title' defaultMessage='Hello, World!'} />,
                date: new Date(1459913574887),
                body: <FormattedMessage id='post.body' defaultMessage='Amazing Content!'} />,
            }}
        />
    </IntlProvider>,
    document.getElementById('container')
);
person slchap5    schedule 24.05.2016
comment
Есть идеи, как добавить импорт 'import en from' response-intl / locale-data / en ';' динамически в зависимости от локали пользователя? - person Santhosh; 21.12.2016
comment
Привет @Santhosh. Не могли бы вы создать новый вопрос? Отдельно от этого. Буду рад ответить. - person slchap5; 21.12.2016
comment
Конечно, вы можете разместить свои предложения здесь stackoverflow.com/questions/41282510/ - person Santhosh; 22.12.2016
comment
Я не понимаю, что это за встроенные языковые переводы. react-intl/locale-data/en - person chovy; 15.10.2017

Думаю, это ответ на вопрос. Однако он основан на использовании сторонней службы переводов и предлагает перезаписать файл переводов. Что лично я сделал, так это сгенерировал файл в соответствии со сценарием и использовал его, чтобы вручную записать мои переводы в другой файл. https://medium.freecodecamp.com/internationalization-in-react-7264738274a0

person Paul Paulincai    schedule 23.06.2017
comment
Хотя эта ссылка может дать ответ на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если связанная страница изменится. - person slfan; 23.06.2017
comment
Статья представляет собой учебное пособие, в котором важна каждая строчка между первой и последней буквой. - person Paul Paulincai; 24.06.2017