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
MessagesProvidertraduz 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
DirectionProvidervira 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.
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:
<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:
<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:
- Num Server Component (um layout raiz), passe
localeemessagessó com textos. - Para trocar uma função, ponha o provider num componente de cliente:
"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.
| Chave | English | Português |
|---|---|---|
breadcrumb.label | Breadcrumb | Trilha de navegação |
breadcrumb.more | More pages | Mais páginas |
carousel.label | Carousel | Carrossel |
carousel.previous | Previous slide | Slide anterior |
carousel.next | Next slide | Próximo slide |
carousel.play | Play | Reproduzir |
carousel.pause | Pause | Pausar |
carousel.indicators | Choose slide | Escolher slide |
carousel.goToSlide(2) | Go to slide 2 | Ir para o slide 2 |
codeBlock.copy | Copy | Copiar |
codeBlock.copied | Copied | Copiado |
codeBlock.label | Code | Código |
combobox.clear | Clear | Limpar |
combobox.showOptions | Show options | Mostrar opções |
commandPalette.placeholder | Type a command or search… | Digite um comando ou pesquise… |
commandPalette.empty | No matching commands found. | Nenhum comando encontrado. |
dataTable.caption | Data table | Tabela de dados |
dataTable.empty | No records found. | Nenhum registro encontrado. |
dataTable.selectAll | Select all rows | Selecionar todas as linhas |
dataTable.selectRow(0) | Select row 1 | Selecionar linha 1 |
dataTable.pagination | Table pagination | Paginação da tabela |
drawer.close | Close | Fechar |
fileUpload.choose | Choose files | Escolher arquivos |
image.failed | Failed to load image | Não foi possível carregar a imagem |
image.unavailable | Unavailable image | Imagem indisponível |
inputGroup.showPassword | Show password | Mostrar senha |
inputGroup.hidePassword | Hide password | Ocultar senha |
inputGroup.clear | Clear search | Limpar busca |
numberField.decrease | Decrease | Diminuir |
numberField.increase | Increase | Aumentar |
otpField.cell(0, 6) | Character 1 of 6 | Caractere 1 de 6 |
pagination.label | Pagination | Paginação |
pagination.previous | Previous | Anterior |
pagination.next | Next | Próxima |
pagination.page(3) | Page 3 | Página 3 |
progressCircle.label | Progress | Progresso |
sidebar.collapse | Collapse sidebar | Recolher menu lateral |
sidebar.expand | Expand sidebar | Expandir menu lateral |
skipLink.label | Skip to content | Pular para o conteúdo |
spinner.label | Loading | Carregando |
splitter.handle | Resize panel | Redimensionar painel |
table.scroll | Table | Tabela |
tagsInput.remove("design") | Remove design | Remover design |
toast.close | Close | Fechar |
toggletip.close | Close tip | Fechar dica |
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:
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:
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:
dir="rtl"no elemento, para o layout do navegador.langno mesmo elemento, para o leitor de tela escolher a voz certa.<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.
الإعدادات
import { DirectionProvider } from "@camaleo/react";
const dir = lang === "ar" ? "rtl" : "ltr";
<html lang={lang} dir={dir}>
<body>
<DirectionProvider direction={dir}>{children}</DirectionProvider>
</body>
</html>
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
MessagesProviderna 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
localeou ficam dentro de umI18nProvider dir,langeDirectionProvidermudam juntos- Setas e chevrons do seu conteúdo invertem em RTL