Componentes
Esta página foi traduzida por PageTurner AI (beta). Não é oficialmente endossada pelo projeto. Encontrou um erro? Reportar problema →
O React Intl oferece um conjunto de componentes React que proporcionam uma abordagem declarativa para configurar um contexto i18n e formatar datas, números e strings para exibição em interfaces web. Esses componentes renderizam elementos React baseando-se na API imperativa do React Intl.
Por que Componentes?
Além de fornecer uma integração idiomática de internacionalização em apps React, os componentes <Formatted*> oferecem vantagens sobre o uso direto da API imperativa:
-
Renderizam elementos React que se integram perfeitamente com outros componentes
-
Suportam formatação de strings/mensagens em rich-text no
<FormattedMessage> -
Implementam recursos avançados como atualização dinâmica no
<FormattedRelativeTime> -
Disponibilizam definições de tipos para TypeScript
IntlProvider
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 apps usando React Intl devem utilizar <IntlProvider> ou <RawIntlProvider>.
Este componente configura o contexto i18n para uma árvore. Geralmente envolve o componente raiz do app, garantindo que toda aplicação esteja no contexto i18n configurado. As seguintes props de configuração podem ser definidas:
interface IntlConfig {
locale: string
formats: CustomFormats
messages: Record<string, string> | Record<string, MessageFormatElement[]>
defaultLocale: string
defaultFormats: CustomFormats
timeZone?: string
textComponent?: React.ComponentType | keyof React.JSX.IntrinsicElements
wrapRichTextChunksInFragment?: boolean
defaultRichTextElements?: Record<string, FormatXMLElementFn<React.ReactNode>>
onError(err: string): void
}
locale, formats e messages
O locale atual do usuário e no qual o aplicativo deve ser renderizado. Enquanto defaultLocale e defaultFormats servem para fallbacks ou durante o desenvolvimento, representando os padrões do aplicativo. Note que não há defaultMessages, pois cada Message Descriptor fornece seu próprio defaultMessage.
defaultLocale e defaultFormats
Locale e formatos padrão para quando uma mensagem não está traduzida (ausente em messages). defaultLocale deve ser o locale onde defaultMessages são declarados, garantindo coerência na sentença. Sem defaultLocale ou configurado incorretamente, pode ocorrer uma sentença em inglês com data/hora em espanhol.
textComponent
Configura o wrapper padrão para componentes <Formatted*> do React Intl. Se não especificado, usa <React.Fragment>. Antes da v3, usava-se span; consulte o guia de migração para detalhes.
onError
Permite fornecer um tratador de erros personalizado. Por padrão, erros são registrados via console.error se NODE_ENV não estiver definido como production.
onWarn
Permite fornecer um tratador personalizado de avisos. Por padrão, avisos são registrados via console.warning quando NODE_ENV não é production.
wrapRichTextChunksInFragment
Ao formatar mensagens rich text, a saída Array<string | React.ReactElement> causa erros de chave. Esta prop envolve a saída em um único React.Fragment para suprimir isso.
defaultRichTextElements
Um mapeamento de tags para funções de formatação de rich text. Fornece uma forma centralizada de formatar tags comuns como <b>, <p>... ou aplicar sistemas de design (ex: <a> ou <button> padronizados). Veja https://github.com/formatjs/formatjs/issues/1752 para contexto.
Essas props combinam-se com as específicas do componente <IntlProvider>:
Propriedades:
props: IntlConfig &
{
children: ReactNode,
}
Elementos filhos devem ser fornecidos ao <IntlProvider>.
Exemplo:
const App = ({importantDate}) => (
<div>
<FormattedDate
value={importantDate}
year="numeric"
month="long"
day="numeric"
weekday="long"
/>
</div>
)
ReactDOM.render(
<IntlProvider locale={navigator.language}>
<App importantDate={new Date(1459913574887)} />
</IntlProvider>,
document.getElementById('container')
)
Supondo navigator.language como "fr":
<div>mardi 5 avril 2016</div>
RawIntlProvider
Este é o objeto subjacente React.Context.Provider utilizado pelo IntlProvider. Pode ser usado com createIntl:
import {createIntl, createIntlCache, RawIntlProvider} from 'react-intl'
// This is optional but highly recommended
// since it prevents memory leak
const cache = createIntlCache()
const intl = createIntl({
locale: 'fr-FR',
messages: {}
}, cache)
// Pass it to IntlProvider
<RawIntlProvider value={intl}>{foo}</RawIntlProvider>
FormattedDate
Este componente utiliza as APIs formatDate e Intl.DateTimeFormat e possui props que correspondem às DateTimeFormatOptions especificadas acima.
Propriedades:
props: Intl.DateTimeFormatOptions &
{
value: any,
format: string,
children: (formattedDate: string) => ReactElement,
}
Por padrão, <FormattedDate> renderiza a data formatada em <React.Fragment>. Para customizar, envolva com outro elemento React (recomendado) ou passe uma função como filho.
Exemplo:
<FormattedDate value={new Date(1459832991883)} />
Exemplo com Opções:
<FormattedDate value={new Date(1459832991883)} year="numeric" month="long" day="2-digit" />
FormattedDateParts
Este recurso requer Intl.DateTimeFormat.prototype.formatToParts, que não está disponível no IE11. Use nosso polyfill se precisar dar suporte ao IE11.
Este componente oferece mais personalização ao FormattedDate ao permitir que a função children tenha acesso às partes subjacentes da data formatada. As partes disponíveis estão listadas aqui.
Propriedades:
props: Intl.DateTimeFormatOptions &
{
value: any,
format: string,
children: (parts: Intl.DateTimeFormatPart[]) => ReactElement,
}
<FormattedDateParts value={new Date(1459832991883)} year="numeric" month="long" day="2-digit" > {parts => ( <> <b>{parts[0].value}</b> {parts[1].value} <small>{parts[2].value}</small> </> )} </FormattedDateParts>
FormattedTime
Este componente usa as APIs formatTime e Intl.DateTimeFormat, com props correspondentes às DateTimeFormatOptions mencionadas anteriormente e os seguintes padrões:
{
hour: 'numeric',
minute: 'numeric',
}
Propriedades:
props: DateTimeFormatOptions &
{
value: any,
format: string,
children: (formattedDate: string) => ReactElement,
}
Por padrão, o <FormattedTime> renderiza o tempo formatado em um React.Fragment. Para personalizar a renderização, envolva-o com outro elemento React (recomendado) ou passe uma função como children.
Exemplo:
<FormattedTime value={new Date(1459832991883)} />
FormattedTimeParts
Este recurso requer Intl.DateTimeFormat.prototype.formatToParts, que não está disponível no IE11. Use nosso polyfill se precisar dar suporte ao IE11.
Este componente oferece mais personalização ao FormattedTime ao permitir que a função children tenha acesso às partes subjacentes da hora formatada. As partes disponíveis estão listadas aqui.
Propriedades:
props: Intl.DateTimeFormatOptions &
{
value: any,
format: string,
children: (parts: Intl.DateTimeFormatPart[]) => ReactElement,
}
<FormattedTimeParts value={new Date(1459832991883)}> {parts => ( <> <b>{parts[0].value}</b> {parts[1].value} <small>{parts[2].value}</small> </> )} </FormattedTimeParts>
FormattedDateTimeRange
Este recurso requer a API em estágio 3 Intl.RelativeTimeFormat.prototype.formatRange, com suporte limitado nos navegadores. Use nosso polyfill se precisar dar suporte a eles.
Este componente usa as APIs formatDateTimeRange e Intl.DateTimeFormat, com props correspondentes às DateTimeFormatOptions mencionadas anteriormente.
Propriedades:
props: DateTimeFormatOptions &
{
from: number | Date,
to: number | Date,
children: (formattedDate: string) => ReactElement,
}
Por padrão, o <FormattedDateTimeRange> renderiza o intervalo de data/hora formatado em um React.Fragment. Para personalizar a renderização, envolva-o com outro elemento React (recomendado) ou passe uma função como children.
Exemplo:
<FormattedDateTimeRange from={new Date('2020-1-1')} to={new Date('2020-1-15')} />
FormattedRelativeTime
Este recurso requer Intl.RelativeTimeFormat, com suporte limitado nos navegadores. Use nosso polyfill se precisar dar suporte a eles.
Este componente usa a API formatRelativeTime, com props correspondentes às seguintes opções de formatação relativa:
type RelativeTimeFormatOptions = {
numeric?: 'always' | 'auto'
style?: 'long' | 'short' | 'narrow'
}
Tipos de Props:
props: RelativeTimeFormatOptions &
{
value: number,
unit: Unit,
format: string,
updateIntervalInSeconds: number,
children: (formattedDate: string) => ReactElement,
}
Por padrão, o <FormattedRelativeTime> renderiza o tempo relativo formatado em um React.Fragment. Para personalizar a renderização, envolva-o com outro elemento React (recomendado) ou passe uma função como children.
Exemplo:
<FormattedRelativeTime value={0} numeric="auto" updateIntervalInSeconds={1} />
Você pode ajustar o intervalo máximo em que o componente será re-renderizado definindo updateIntervalInSeconds. Um valor falsy desativará a atualização automática. A atualização é inteligente e agendará a próxima atualização para o próximo momento interessante.
Um momento interessante é definido como o próximo value não fracionário para aquela unit. Por exemplo:
<FormattedRelativeTime value={-50} updateIntervalInSeconds={1} />
Isso inicialmente renderizará 59 seconds ago, após 1 segundo, renderizará 1 minute ago, e não será re-renderizado até que um minuto completo passe, então renderizará 2 minutes ago. Não tentará renderizar 1.2 minutes ago.
updateIntervalInSeconds não pode ser habilitado para unit maior que hour (portanto não para day, week, quarter, year). Isso ocorre principalmente porque não faz sentido agendar um timeout em days, e o número de ms em um dia é maior que o timeout máximo aceito por setTimeout.
FormattedNumber
Este componente usa as APIs formatNumber e Intl.NumberFormat e possui props que correspondem a Intl.NumberFormatOptions.
Propriedades:
props: NumberFormatOptions &
{
value: number,
format: string,
children: (formattedNumber: string) => ReactElement,
}
Por padrão, <FormattedNumber> renderizará o número formatado em um React.Fragment. Se você precisar personalizar a renderização, pode envolvê-lo com outro elemento React (recomendado) ou passar uma função como filho.
Exemplo:
<FormattedNumber value={1000} />
Exemplo Formatando Valores Monetários
<FormattedNumber value={1000} style="currency" currency="USD" />
Formatação numérica usando unit
Atualmente, isso faz parte do ES2020 NumberFormat.
Fornecemos um polyfill aqui e os tipos react-intl permitem que os usuários passem
uma unidade sancionada. Por exemplo:
<FormattedNumber value={1000} style="unit" unit="kilobyte" unitDisplay="narrow" />
<FormattedNumber value={1000} unit="fahrenheit" unitDisplay="long" style="unit" />
FormattedNumberParts
Isso requer Intl.NumberFormat.prototype.formatToParts que não está disponível no IE11. Use nosso polyfill se planejar suportar IE11.
Este componente oferece mais personalização ao FormattedNumber permitindo que a função filho tenha acesso às partes subjacentes do número formatado. As partes disponíveis estão listadas aqui.
Propriedades:
props: NumberFormatOptions &
{
value: number,
format: string,
children: (parts: Intl.NumberFormatPart[]) => ReactElement,
}
Exemplo:
<FormattedNumberParts value={1000}> {parts => ( <> <b>{parts[0].value}</b> {parts[1].value} <small>{parts[2].value}</small> </> )} </FormattedNumberParts>
FormattedPlural
Este componente usa a API formatPlural e Intl.PluralRules possui props que correspondem a Intl.PluralRulesOptions.
Propriedades:
props: PluralFormatOptions &
{
value: any,
other: ReactElement,
zero: ReactElement,
one: ReactElement,
two: ReactElement,
few: ReactElement,
many: ReactElement,
children: (formattedPlural: ReactElement) => ReactElement,
}
Por padrão, <FormattedPlural> selecionará uma categoria plural (zero, one, two, few, many, ou other) e renderizará o elemento React correspondente em um React.Fragment. Se você precisar personalizar a renderização, pode envolvê-lo com outro elemento React (recomendado) ou passar uma função como filho.
Exemplo:
<FormattedPlural value={10} one="message" other="messages" />
FormattedList
Requer Intl.ListFormat com suporte limitado em navegadores. Use nosso polyfill se precisar de compatibilidade.
Este componente utiliza a API formatList e Intl.ListFormat. Suas propriedades correspondem às Intl.ListFormatOptions.
Propriedades:
props: ListFormatOptions &
{
children: (chunksOrString: string | React.ReactElement[]) => ReactElement,
}
Exemplo:
Quando o locale é en:
<FormattedList type="conjunction" value={['Me', 'myself', 'I']} />
<FormattedList type="conjunction" value={['Me', <b>myself</b>, 'I']} />
FormattedListParts
Requer Intl.ListFormat com suporte limitado em navegadores. Use nosso polyfill se precisar de compatibilidade.
Este componente utiliza a API formatListToParts e Intl.ListFormat. Suas propriedades correspondem às Intl.ListFormatOptions.
Propriedades:
props: ListFormatOptions &
{
children: (chunks: Array<React.ReactElement | string>) => ReactElement,
}
Exemplo:
Quando o locale é en:
<FormattedListParts type="conjunction" value={['Me', 'myself', 'I']}> {parts => ( <> <b>{parts[0].value}</b> {parts[1].value} <small>{parts[2].value}</small> {parts[3].value} <small>{parts[4].value}</small> </> )} </FormattedListParts>
FormattedDisplayName
Requer Intl.DisplayNames com suporte limitado em navegadores. Use nosso polyfill se precisar de compatibilidade.
Este componente utiliza formatDisplayName e Intl.DisplayNames, tem props que correspondem a DisplayNameOptions. Talvez seja necessário um polyfill.
Propriedades:
props: FormatDisplayNameOptions &
{
value: string | number | Record<string, unknown>,
}
Exemplo:
Quando o locale é en:
<FormattedDisplayName type="language" value="zh-Hans-SG" />
<FormattedDisplayName type="currency" value="JPY" />
FormattedMessage
Este componente utiliza a API formatMessage e possui props que correspondem a um Message Descriptor.
Propriedades:
props: MessageDescriptor &
{
values: object,
tagName: string,
children: (chunks: ReactElement) => ReactElement,
}
Sintaxe da Mensagem
A formatação de strings/mensagens é essencial no React Intl, baseando-se em ICU Message Formatting através da Sintaxe ICU. Essa sintaxe permite definir mensagens simples ou complexas, traduzi-las e formatá-las em tempo de execução.
Mensagem Simples:
Hello, {name}
Mensagem Complexa:
Hello, {name}, you have {itemCount, plural,
=0 {no items}
one {# item}
other {# items}
}.
Veja: Guia de Sintaxe de Mensagem.
Descritor de Mensagem
O React Intl utiliza o conceito de Message Descriptor para definir mensagens padrão do aplicativo. O <FormattedMessage> possui propriedades que correspondem a um Message Descriptor, contendo:
-
id: Identificador único e estável para a mensagem -
description: Contexto para tradutores sobre o uso na interface -
defaultMessage: Mensagem padrão (geralmente em inglês)
type MessageDescriptor = {
id?: string
defaultMessage?: string
description?: string
}
Os pacotes babel-plugin-formatjs e @formatjs/ts-transformer podem compilar Message Descriptors em AST para melhor desempenho.
Fallbacks de Formatação de Mensagem
As APIs de formatação implementam fallbacks robustos para garantir retorno de strings não vazias. O algoritmo é:
-
Buscar e formatar a mensagem traduzida no
idfornecido ao<IntlProvider>. -
Fallback para formatação do
defaultMessage. -
Fallback para a mensagem traduzida na fonte do
id. -
Fallback para a fonte da
defaultMessage. -
Fallback para o
idliteral da mensagem.
Uso
Por padrão, o <FormattedMessage> renderizará a string formatada em um <React.Fragment>. Para personalizar a renderização, você pode envolvê-lo com outro elemento React (recomendado), especificar um tagName diferente (por exemplo, 'div') ou passar uma função como elemento filho.
Exemplo:
<FormattedMessage id="app.greeting" description="Greeting to welcome the user to the app" defaultMessage="Hello, {name}!" values={{ name: 'Eric', }} />
Exemplo: função como filho
<FormattedMessage id="title">{txt => <h1>{txt}</h1>}</FormattedMessage>
Mensagens podem ser strings simples sem placeholders, sendo o tipo mais comum. Este caso é altamente otimizado, mas mantém os benefícios do procedimento de fallback.
Formatação de Rich Text
O <FormattedMessage> também suporta formatação de rich text especificando uma tag XML na mensagem e resolvendo essa tag na prop values. Veja um exemplo:
<FormattedMessage id="app.greeting" description="Greeting to welcome the user to the app" defaultMessage="Hello, <b>Eric</b> {icon}" values={{ b: chunks => <b>{chunks}</b>, icon: <svg />, }} />
Ao permitir incorporar tags XML, garantimos que informações contextuais não sejam perdidas ao estilizar parte do texto. Num exemplo mais complexo como:
<FormattedMessage id="foo" defaultMessage="To buy a shoe, <a>visit our website</a> and <cta>buy a shoe</cta>" values={{ a: chunks => ( <a class="external_link" target="_blank" href="https://www.example.com/shoe" > {chunks} </a> ), cta: chunks => <strong class="important">{chunks}</strong>, }} />
Função como filho
Como a formatação de rich text permite incorporar ReactElement, no cenário de função como filho, a função receberá os chunks da mensagem formatada como parâmetro único.
<FormattedMessage id="foo" defaultMessage="To buy a shoe, <a>visit our website</a> and <cta>buy a shoe</cta>" values={{ a: chunks => ( <a class="external_link" target="_blank" href="https://www.example.com/shoe" > {chunks} </a> ), cta: chunks => <strong class="important">{chunks}</strong>, }} > {chunks => <h2>{chunks}</h2>} </FormattedMessage>
Todo o rich text é traduzido em conjunto, produzindo saída de maior qualidade. Isso traz paridade de recursos com outras bibliotecas como fluent da Mozilla (usando conceito de overlays).
Esta extensão também permite potencialmente utilizar outros formatos de rich text, como Markdown.