Pular para o conteúdo
// visualizar em
salvo em todas as páginas

Idiomas e RTL

Traduza os textos que os componentes trazem, defina o locale dos componentes de data e use qualquer estilo da direita para a esquerda.

// você vai aprender

  • Como o MessagesProvider traduz os textos embutidos, e como trocar só alguns
  • Todas as chaves de mensagem, em inglês e português
  • Qual locale os componentes de data usam, e como defini-lo
  • Como o DirectionProvider vira a página da direita para a esquerda em qualquer estilo

Textos embutidos

Quase todo texto numa interface feita com o Camaleo é seu: rótulos, títulos, texto dos botões. Alguns componentes também trazem textos próprios, como o nome de um botão de fechar, a mensagem de uma tabela vazia ou o "Página 3" lido pelo leitor de tela. Esses vêm em inglês por padrão.

Ponha um MessagesProvider perto da raiz para trocá-los. Escolha um idioma abaixo: só os textos dos componentes mudam.

minimal · light · #3fa34d
app/layout.tsx
import { MessagesProvider } from "@camaleo/react";

<MessagesProvider locale="pt-BR">{children}</MessagesProvider>

O locale escolhe um pacote embutido: "en" (o padrão) ou "pt-BR". A prop do componente sempre vence o provider, então <Pagination previousLabel="Voltar" /> continua dizendo "Voltar".

Troque só alguns textos

O messages aceita qualquer parte das chaves. Cada grupo que você passa é mesclado sobre o conjunto de baixo, então você só escreve o que muda:

app/layout.tsx
<MessagesProvider
  locale="pt-BR"
  messages={{ drawer: { close: "Fechar painel" }, dataTable: { empty: "Nenhum pedido ainda." } }}
>
  {children}
</MessagesProvider>

Providers podem ser aninhados. Um provider interno sem locale parte dos textos do pai, o que ajuda quando uma área tem o próprio vocabulário:

app/pedidos/layout.tsx
<MessagesProvider messages={{ dataTable: { empty: "Nenhum pedido com esses filtros." } }}>
  {children}
</MessagesProvider>

Para um idioma que o Camaleo não traz, escreva um conjunto completo com o tipo Messages e passe em messages. O tipo garante que nenhuma chave fique faltando.

Servidor ou cliente

Algumas mensagens são funções, como pagination.page(3) → "Página 3". O React não passa funções de um Server Component para um de cliente, então:

app/messages.tsx
"use client";
import { MessagesProvider } from "@camaleo/react";

export function AppMessages({ children }: { children: React.ReactNode }) {
  return (
    <MessagesProvider
      locale="pt-BR"
      messages={{ pagination: { page: (page) => `Ir para a página ${page}` } }}
    >
      {children}
    </MessagesProvider>
  );
}

Leia os textos nos seus componentes com useMessages() (cliente) ou <Message pick="spinner.label" /> (servidor). Veja Server Components e SSR.

Todas as chaves de mensagem

Esta é a interface Messages de packages/react/src/messages.tsx, com os valores dos pacotes en e ptBR. As chaves que são funções mostram o resultado de uma chamada de exemplo.

ChaveEnglishPortuguês
breadcrumb.labelBreadcrumbTrilha de navegação
breadcrumb.moreMore pagesMais páginas
carousel.labelCarouselCarrossel
carousel.previousPrevious slideSlide anterior
carousel.nextNext slidePróximo slide
carousel.playPlayReproduzir
carousel.pausePausePausar
carousel.indicatorsChoose slideEscolher slide
carousel.goToSlide(2)Go to slide 2Ir para o slide 2
codeBlock.copyCopyCopiar
codeBlock.copiedCopiedCopiado
codeBlock.labelCodeCódigo
combobox.clearClearLimpar
combobox.showOptionsShow optionsMostrar opções
commandPalette.placeholderType a command or search…Digite um comando ou pesquise…
commandPalette.emptyNo matching commands found.Nenhum comando encontrado.
dataTable.captionData tableTabela de dados
dataTable.emptyNo records found.Nenhum registro encontrado.
dataTable.selectAllSelect all rowsSelecionar todas as linhas
dataTable.selectRow(0)Select row 1Selecionar linha 1
dataTable.paginationTable paginationPaginação da tabela
drawer.closeCloseFechar
fileUpload.chooseChoose filesEscolher arquivos
image.failedFailed to load imageNão foi possível carregar a imagem
image.unavailableUnavailable imageImagem indisponível
inputGroup.showPasswordShow passwordMostrar senha
inputGroup.hidePasswordHide passwordOcultar senha
inputGroup.clearClear searchLimpar busca
numberField.decreaseDecreaseDiminuir
numberField.increaseIncreaseAumentar
otpField.cell(0, 6)Character 1 of 6Caractere 1 de 6
pagination.labelPaginationPaginação
pagination.previousPreviousAnterior
pagination.nextNextPróxima
pagination.page(3)Page 3Página 3
progressCircle.labelProgressProgresso
sidebar.collapseCollapse sidebarRecolher menu lateral
sidebar.expandExpand sidebarExpandir menu lateral
skipLink.labelSkip to contentPular para o conteúdo
spinner.labelLoadingCarregando
splitter.handleResize panelRedimensionar painel
table.scrollTableTabela
tagsInput.remove("design")Remove designRemover design
toast.closeCloseFechar
toggletip.closeClose tipFechar dica
CUIDADO

Um texto vem da primitiva, não do Camaleo: o Progress indeterminado é anunciado pelo Base UI como "indeterminate progress", em inglês, seja qual for o provider.

Datas e horários

O MessagesProvider não mexe em datas. Os componentes de data (Calendar, RangeCalendar, DatePicker, DateRangePicker, DateField, TimeField) recebem a prop locale, que define a ordem dos segmentos, os nomes dos meses e dos dias, o primeiro dia da semana e o relógio. A mesma data em três locales:

minimal · light · #3fa34d
11122026
12112026
12112026

Sem locale, eles usam o I18nProvider mais próximo (que o Camaleo reexporta) e depois o idioma do navegador. Defina no servidor, para o servidor e o navegador formatarem igual:

app/layout.tsx
import { I18nProvider, MessagesProvider } from "@camaleo/react";

<MessagesProvider locale="pt-BR">
  <I18nProvider locale="pt-BR">{children}</I18nProvider>
</MessagesProvider>

Da direita para a esquerda

Os estilos e o CSS dos componentes usam propriedades lógicas (margin-inline-start, inset-inline-end, border-start-start-radius…), então o mesmo CSS funciona nas duas direções. Para virar uma página ou uma seção para RTL, faça três coisas juntas:

  1. dir="rtl" no elemento, para o layout do navegador.
  2. lang no mesmo elemento, para o leitor de tela escolher a voz certa.
  3. <DirectionProvider direction="rtl"> em volta, para os componentes inverterem o teclado (setas em abas, sliders e menus) e os popups.

Troque a direção abaixo e depois escolha outros estilos na barra "visualizar em": abas, slider, switch e botões espelham em todos os estilos.

minimal · light · #3fa34d

الإعدادات

app/[lang]/layout.tsx
import { DirectionProvider } from "@camaleo/react";

const dir = lang === "ar" ? "rtl" : "ltr";

<html lang={lang} dir={dir}>
  <body>
    <DirectionProvider direction={dir}>{children}</DirectionProvider>
  </body>
</html>
CUIDADO

Algumas regras de estrutura do app ainda usam lados físicos e não espelham: a borda do Sidebar, a barra do item ativo e as contagens dele, os atalhos no Menubar e no CommandPalette, a linha do Stepper vertical e a posição do SkipLink. Confira essas partes no olho se o seu app for RTL.

Popups abertos dentro de uma seção RTL continuam RTL: o invólucro do portal copia a direção. Ícones seus que significam "avançar" ou "voltar" (setas, chevrons) precisam ser invertidos em RTL; ícones que mostram uma coisa (um sino, uma lixeira) não.

Antes de publicar

  • Um MessagesProvider na raiz, com o idioma da página
  • Mensagens que são funções são trocadas num componente de cliente
  • Os componentes de data recebem locale ou ficam dentro de um I18nProvider
  • dir, lang e DirectionProvider mudam juntos
  • Setas e chevrons do seu conteúdo invertem em RTL
Esta página foi útil? · Editar esta página no GitHub