Visão Geral
Esta página foi traduzida por PageTurner AI (beta). Não é oficialmente endossada pelo projeto. Encontrou um erro? Reportar problema →
Bem-vindo à documentação do React Intl! Este é o lugar para encontrar a documentação do React Intl. Sinta-se à vontade para abrir um pull request e contribuir com a documentação para melhorá-la.
Requisitos de Runtime
Suportamos IE11 e as 2 versões mais recentes do Edge, Chrome, Firefox e Safari.
O React Intl depende destas APIs Intl:
-
Intl.NumberFormat: Disponível a partir do IE11+
-
Intl.DateTimeFormat: Disponível a partir do IE11+
-
Intl.PluralRules: Pode ser implementado via polyfill usando este pacote.
-
Intl.RelativeTimeFormat: Pode ser implementado via polyfill usando este pacote.
-
(Opcional) Intl.DisplayNames: Necessário se você usar
formatDisplayNameouFormattedDisplayName. Pode ser implementado via polyfill usando este pacote.
Se você precisa dar suporte a navegadores mais antigos, recomendamos o seguinte:
-
Se estiver dando suporte a navegadores sem
Intl, inclua este polyfill na sua build. -
Implemente polyfill para
Intl.NumberFormatcom@formatjs/intl-numberformat. -
Implemente polyfill para
Intl.DateTimeFormatcom@formatjs/intl-datetimeformat -
Se estiver dando suporte a navegadores sem
Intl.PluralRules(ex: IE11 e Safari 12-), inclua este polyfill na sua build. -
Se estiver dando suporte a navegadores sem Intl.RelativeTimeFormat (ex: IE11, Edge e Safari 12-), inclua este polyfill na sua build junto com dados CLDR individuais para cada localidade suportada.
-
Se precisar de
Intl.DisplayNames, inclua este polyfill na sua build junto com dados CLDR individuais para cada localidade suportada.
Node.js
full-icu
A partir do Node.js 13.0.0, o full-icu é suportado por padrão.
Se estiver usando React Intl em versões anteriores do Node.js, seu binário node deve:
- Ser compilado com
full-icuseguindo estas instruções
OU
- Utilizar o pacote npm
full-icu
Se sua versão do node não tiver alguma das APIs Intl acima, você precisará implementá-las via polyfill adequadamente.
React Native
Se estiver usando react-intl no React Native, certifique-se que seu runtime tenha suporte nativo a Intl (similar à variante internacional do JSC). Consulte estas issues para mais detalhes:
React Native no iOS
Se não puder usar a variante Intl do JSC (ex: no iOS), siga as instruções em Requisitos de Runtime para implementar polyfill dessas APIs adequadamente.
O Pacote react-intl
Instale o pacote npm react-intl via npm:
- npm
- yarn
npm i -S react-intl
yarn add react-intl
O pacote npm react-intl distribui os seguintes módulos (links do unpkg):
-
CommonJS: dependências não empacotadas,
"main"nopackage.json, avisos em desenvolvimento. -
ES6: dependências não empacotadas,
"module"nopackage.json, avisos em desenvolvimento.
Empacotadores de Módulos
Otimizamos o React Intl para funcionar bem com empacotadores como: Browserify, Webpack ou Rollup, que podem ser usados para empacotar o React Intl para navegadores:
-
O campo
"browser"nopackage.jsoné especificado para incluir apenas dados de localidade básicos em inglês durante o empacotamento. Assim, ao usar o módulo"main"no Node, todos os dados de localidade são carregados, mas ignorados quando empacotados para navegador. -
Uma versão ES6 do React Intl é fornecida como
"jsnext:main"e"module"nopackage.jsone pode ser usada com Rollup. -
Os avisos de desenvolvimento são envolvidos com
process.env.NODE_ENV !== 'production', permitindo especificarNODE_ENVdurante o empacotamento e minificação para remover esses blocos de código.
O Módulo React Intl
Seja usando a versão ES6, CommonJS ou UMD do React Intl, todas fornecem as mesmas exportações nomeadas:
Ao usar a versão UMD do React Intl sem um sistema de módulos, ela esperará que react exista na variável global: React, e colocará as exportações nomeadas acima na variável global: ReactIntl.
Criando um Contexto de I18n
Agora com o React Intl e seus dados de localidade carregados, um contexto de i18n pode ser criado para seu aplicativo React.
O React Intl utiliza o padrão provider para delimitar um contexto i18n a uma árvore de componentes. Isso permite que configurações como locale atual e mensagens traduzidas sejam fornecidas na raiz da árvore e disponibilizadas aos componentes <Formatted*>. É o mesmo conceito usado por frameworks Flux como Redux para prover acesso a stores.
Todos os aplicativos que usam React Intl devem usar o componente <IntlProvider>.
O uso mais comum é envolver seu componente raiz do React com <IntlProvider> e configurá-lo com a localidade atual do usuário e as strings/mensagens traduzidas correspondentes:
ReactDOM.render(
<IntlProvider locale={usersLocale} messages={translationsForUsersLocale}>
<App />
</IntlProvider>,
document.getElementById('container')
)
Consulte: A documentação <IntlProvider> para mais detalhes.
Formatando Dados
O React Intl tem duas maneiras de formatar dados: através de componentes React e sua API. Os componentes fornecem uma maneira idiomática do React de integrar a internacionalização em um aplicativo React, e os componentes <Formatted*> têm benefícios sobre o uso direto da API imperativa. A API deve ser usada quando seu componente React precisa formatar dados para um valor de string onde um elemento React não é adequado; por exemplo, um atributo title ou aria, ou para efeito colateral em componentDidMount.
A API imperativa do React Intl é acessada via injectIntl, uma fábrica de Componente de Alta Ordem (HOC). Ela envolverá o componente React passado com outro componente React que fornece a API de formatação imperativa ao componente encapsulado por meio de suas props. (Isso é semelhante ao padrão de conexão com stores encontrado em muitas implementações Flux.)
Aqui está um exemplo usando <IntlProvider>, componentes <Formatted*> e a API imperativa para configurar um contexto de i18n e formatar dados:
import React from 'react';
import ReactDOM from 'react-dom';
import {IntlProvider, FormattedRelative, useIntl} from 'react-intl';
const MS_IN_DAY = 1e3 * 3600 * 24
const PostDate = ({date}) => {
const intl = useIntl()
return (
<span title={intl.formatDate(date)}>
<FormattedRelativeTime value={(Date.now() - date)/MS_IN_DAY} unit="day"/>
</span>
)
});
const App = ({post}) => (
<div>
<h1>{post.title}</h1>
<p>
<PostDate date={post.date} />
</p>
<div>{post.body}</div>
</div>
);
ReactDOM.render(
<IntlProvider locale={navigator.language}>
<App
post={{
title: 'Hello, World!',
date: new Date(1459913574887),
body: 'Amazing content.',
}}
/>
</IntlProvider>,
document.getElementById('container')
);
Supondo que navigator.language seja "en-us":
<div>
<h1>Hello, World!</h1>
<p><span title="4/5/2016">yesterday</span></p>
<div>Amazing content.</div>
</div>
Consulte: A documentação API e Componentes para mais detalhes.
Build ESM
O react-intl e suas bibliotecas subjacentes (@formatjs/icu-messageformat-parser, intl-messageformat, @formatjs/intl-relativetimeformat) exportam artefatos ESM. Isso significa que você deve configurar sua cadeia de ferramentas de build para transpilar essas bibliotecas.
Jest
Adicione transformIgnorePatterns para sempre incluir essas bibliotecas, por exemplo:
{
transformIgnorePatterns: [
'/node_modules/(?!intl-messageformat|@formatjs/icu-messageformat-parser).+\\.js$',
],
}
webpack
Se você está usando babel-loader ou ts-loader, pode fazer uma das seguintes opções:
- Adicionar essas bibliotecas em
include:
{
include: [
path.join(__dirname, 'node_modules/react-intl'),
path.join(__dirname, 'node_modules/intl-messageformat'),
path.join(__dirname, 'node_modules/@formatjs/icu-messageformat-parser'),
]
}
OU
- Adicionar essas bibliotecas em
exclude:
exclude: /node_modules\/(?!react-intl|intl-messageformat|@formatjs\/icu-messageformat-parser)/,
Conceitos Fundamentais
-
Formatadores (Data, Número, Mensagem, Relativo)
-
Provedor e Injetor
-
API e Componentes
-
Descritor de Mensagem
-
Sintaxe de Mensagem
-
Definindo mensagens padrão para extração
-
Formatos personalizados e nomeados
Aplicativos de Exemplo
Há vários aplicativos executáveis de exemplo neste repositório Git. Eles são uma ótima maneira de ver os conceitos fundamentais do React Intl em ação em aplicações simplificadas.
Referência da API
O React Intl fornece e é construído sobre algumas camadas de API. Ao usar o React Intl, você interagirá com os built-ins Intl, a API do React Intl e seus componentes React:
Uso com TypeScript
O react-intl é escrito em TypeScript, portanto, possui suporte de primeira classe a TS.
Para usar o react-intl em TypeScript, certifique-se de que a configuração lib das compilerOptions inclua ["esnext.intl", "es2017.intl", "es2018.intl"].
Tipagem de IDs de mensagem e localidade
Por padrão, o tipo da prop id do <FormattedMessage> e do formatMessage é string. No entanto, você pode definir um tipo mais restritivo para obter autocompletar e verificação de erros. Para fazer isso, substitua o seguinte namespace global pelo tipo de união de todos os seus IDs de mensagem. Você pode fazer isso incluindo o seguinte em algum lugar do seu código:
declare global {
namespace FormatjsIntl {
interface Message {
ids: keyof typeof messages
}
}
}
Onde messages é o objeto que você normalmente passaria para <IntlProvider>, e teria a seguinte aparência:
const messages = {
greeting: 'Hello',
planet: 'World',
// ...
}
Você também pode substituir o seguinte global para usar um tipo personalizado para localidade
declare global {
namespace FormatjsIntl {
interface IntlConfig {
locale: 'en' | 'fr'
}
}
}
Tipagem de formatos personalizados
Por padrão, o tipo da prop format de <FormattedDate>, <FormattedDateParts>, <FormattedTime> e <FormattedTimeParts> é string. O mesmo se aplica à configuração format de formatDate, formatDateParts, formatTime e formatTimeParts. Porém, você pode definir um tipo mais restritivo para obter autocompletar e verificação de erros. Para isso, substitua o seguinte namespace global pelo tipo união de todos os nomes dos seus formatos personalizados. Você pode fazer isso incluindo o seguinte em algum lugar do seu código:
declare global {
namespace FormatjsIntl {
interface Formats {
date: keyof (typeof customFormats)['date']
time: keyof (typeof customFormats)['time']
}
}
}
Onde customFormats é o objeto que você normalmente passaria para <IntlProvider>, e teria uma aparência semelhante a:
const customFormats = {
date: {
short: {
month: 'numeric',
day: 'numeric',
year: '2-digit',
},
},
time: {
short: {
hour: 'numeric',
minute: 'numeric',
},
},
}
Uso Avançado
Nosso Guia de Uso Avançado tem orientações adicionais para configuração de produção em ambientes onde o desempenho é importante.
Ferramentas Suportadas
Extração de mensagens
Construímos o @formatjs/cli que ajuda a extrair mensagens de uma lista de arquivos. Ele usa o babel-plugin-formatjs internamente e deve ser capaz de extrair mensagens se você estiver declarando usando um dos mecanismos abaixo:
import {defineMessages} from 'react-intl'
defineMessages({
foo: {
id: 'foo',
defaultMessage: 'foo',
description: 'bar',
},
})
import {FormattedMessage} from 'react-intl'
;<FormattedMessage id="foo" defaultMessage="foo" description="bar" />
function Comp(props) {
const {intl} = props
return intl.formatMessage({
// The whole `intl.formatMessage` is required so we can extract
id: 'foo',
defaultMessage: 'foo',
description: 'bar',
})
}
Plugin ESLint
Também construímos o eslint-plugin-formatjs que ajuda a impor regras específicas em suas mensagens se seu fornecedor de tradução tiver restrições.