feat(i18n): completar pt/en nas telas restantes + teste de i18n no CI - #32
Merged
Conversation
Fecha as telas de leitura e configuracao que ainda estavam so em portugues. Alem do texto: - datas de revisao passam a usar o locale ativo (en-US/pt-BR) em vez de pt-BR fixo; - contagens de dias usam plural do i18next (1 dia / N dias); - rotulos de status viram chaves (labelKey) para reresolverem quando o idioma muda sem recarregar a pagina; - textos com link embutido usam <Trans> para nao quebrar a frase. Adiciona auth.reset.failed que faltava no en.json - pt e en agora tem 399 chaves cada, sem divergencia.
O catalogo de fontes de entrada tinha descricao e lista de recursos
como literais no modulo; agora sao chaves resolvidas por tipo de fonte,
com guarda contra chave ausente - t(..., returnObjects) devolve a
propria chave como string quando falta, e .map numa string derrubaria a
pagina inteira.
O paragrafo de introducao usa <Trans> com componentes nomeados em vez
de indices: com {' '} entre os filhos, a numeracao automatica desloca e
o <code> sairia no lugar errado.
Remove imports mortos de date-fns/ptBR no componente de entrada.
As duas telas de busca ficam completas nos dois idiomas, incluindo o
locale das datas (date-fns) e os rotulos de urgencia/tipo de match, que
eram literais em arrays de modulo e nao reagiam a troca de idioma.
Adiciona frontend/tests/i18n.test.js, rodando no CI antes do build.
Chave de traducao quebrada nao derruba o build - ela aparece como o
caminho da chave na tela do usuario, entao o build verde nao provava
nada. O teste cobre:
- paridade exata de chaves entre pt e en (inclusive tamanho de listas);
- toda chave citada no codigo existe de fato (723 referencias hoje);
- placeholders {{x}} iguais nos dois idiomas;
- nenhuma traducao vazia;
- telas ja traduzidas nao regridem para texto fixo em portugues.
O nome do job de CI fica como esta de proposito: ele e um required
status check da protecao da main.
Periodos, frequencias e dias da semana eram literais em arrays de modulo, avaliados uma unica vez na carga - nao reagiam a troca de idioma. Agora sao chaves resolvidas na renderizacao. Datas dessas telas passam a usar o locale ativo (date-fns e toLocaleString), e as contagens usam plural do i18next.
Corrige um bug real introduzido nesta serie: em InboundEventSources o
callback `sourceTokens.map(t => ...)` sombreava a funcao de traducao, e
o t('inbound.revoke') que eu coloquei dentro dele estouraria
"t is not a function" ao renderizar - so na aba Entrada, e so quando ja
existisse um token. O build passava.
Adiciona teste que proibe `t` como parametro de callback em arquivo com
useTranslation, para essa classe de erro nao voltar. Search.jsx tinha
dois casos latentes (sem t() dentro, mas a um edit de distancia).
Fecha a ultima tela grande. Alem do texto, os formatos de data (dd/MM/yyyy vs MM/dd/yyyy e a data por extenso) passam a vir das traducoes, entao a data acompanha o idioma. Adiciona a variante _zero: a regra CLDR do portugues classifica 0 como singular, o que produzia "0 resultado encontrado" na tela de busca. Verificado nos dois idiomas para 0, 1 e N.
A varredura so olhava atributos JSX, entao frases no corpo da tela passavam batido - e passaram: Notificacoes tinha os filtros, os botoes de acao e a paginacao ainda em portugues fixo, e KBView tinha um segundo "KB nao encontrado" que eu nao havia trocado. Agora ela le tambem o texto entre tags. Os tokens tecnicos (URL, host, e-mail) sao removidos antes da analise: "datadoghq.com" contem "com", que casava com a palavra portuguesa e gerava falso positivo.
Contributor
There was a problem hiding this comment.
Pull request overview
Esta PR amplia a internacionalização (pt/en) em telas principais do frontend e adiciona uma “guarda” automática no CI para evitar regressões de i18n (chaves faltando, placeholders divergentes, texto fixo em PT em telas já traduzidas, etc.).
Changes:
- Adiciona suíte de testes de i18n (paridade de chaves pt/en, chaves referenciadas no código, placeholders, texto PT fixo em telas “travadas”).
- Traduz diversas telas/componentes para usar
t(...)/<Trans />e ajusta formatação de datas conforme idioma. - Inclui
npm teste roda o teste de i18n no workflow de CI antes do build.
Reviewed changes
Copilot reviewed 18 out of 18 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| frontend/tests/i18n.test.js | Novo teste de guarda de i18n (paridade de chaves, referências no código, placeholders, regressões em telas traduzidas). |
| frontend/src/pages/UserActivity.jsx | Substitui textos fixos por chaves i18n e ajusta locale de data, mas precisa corrigir import. |
| frontend/src/pages/SmartSearch.jsx | Migra strings para i18n, usa <Trans /> para plural/markup e ajusta locale do date-fns. |
| frontend/src/pages/Settings.jsx | Migra strings para i18n e usa <Trans /> em textos com link embutido. |
| frontend/src/pages/Search.jsx | Migra strings para i18n, usa <Trans /> para plural/markup e ajusta locale de data. |
| frontend/src/pages/Reviews.jsx | Migra strings para i18n e ajusta locale de data, mas precisa inicializar useTranslation(). |
| frontend/src/pages/Reports.jsx | Migra strings para i18n, passa opções por chave e ajusta locale do date-fns. |
| frontend/src/pages/postmortem/PostMortemEditor.jsx | Migra strings para i18n, ajusta formatos/locale de data e chaves de labels/configs. |
| frontend/src/pages/Notifications.jsx | Migra parte dos textos para i18n, mas ainda deixa resumo hardcoded em PT. |
| frontend/src/pages/kb/KBView.jsx | Migra strings para i18n, mas introduz bug de escopo em getErrorMessage. |
| frontend/src/pages/Integrations.jsx | Migra strings para i18n (toasts, tabs, formulários e labels). |
| frontend/src/pages/gps/GPSFlowEditor.jsx | Migra strings para i18n e remove labels fixas em constantes. |
| frontend/src/pages/Favorites.jsx | Migra parte do texto para i18n, mas ainda deixa texto fixo em PT no empty state. |
| frontend/src/i18n/locales/pt.json | Adiciona grande conjunto de chaves pt para telas traduzidas e novos fluxos. |
| frontend/src/i18n/locales/en.json | Adiciona grande conjunto de chaves en correspondentes às chaves pt. |
| frontend/src/components/integrations/InboundEventSources.jsx | Migra catálogo/labels para chaves i18n e evita sombreamento de t. |
| frontend/package.json | Adiciona script test para rodar node --test nos testes do frontend. |
| .github/workflows/ci.yml | Roda npm test no job de frontend antes do build. |
Suppressed comments (1)
frontend/src/pages/Notifications.jsx:111
- O resumo de contagem ainda está hardcoded em português ("notificação", "não lida") e não muda com o idioma. Como esta tela está na lista de traduzidas, isso precisa ser i18n (com pluralização).
<h2 className="mb-1">{t('notifications.title')}</h2>
<p className="text-muted mb-0">
{pagination.total} notificação{pagination.total !== 1 ? 'ões' : ''}
{unreadCount > 0 && ` • ${unreadCount} não lida${unreadCount !== 1 ? 's' : ''}`}
</p>
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Comment on lines
28
to
+32
| const getErrorMessage = (error) => | ||
| error.response?.data?.error || | ||
| error.response?.data?.message || | ||
| (error.response ? `Erro ${error.response.status}` : error.message) || | ||
| 'Erro desconhecido'; | ||
| t('common.unknownError'); |
Comment on lines
1
to
3
| import { useState, useEffect, useCallback } from 'react'; | ||
| import { Link } from 'react-router-dom'; | ||
| import api from '../services/api'; |
Comment on lines
+174
to
177
| <h5>{t('favorites.empty')}</h5> | ||
| <p className="mb-3"> | ||
| Clique no ícone de estrela em qualquer KB para adicioná-lo aos favoritos. | ||
| </p> |
Comment on lines
1
to
4
| import React, { useState, useEffect } from 'react'; | ||
| import { useTranslation } from 'react-i18next'; | ||
| import { Card, Button, Form, Row, Col, Alert, Spinner, Badge, ListGroup, Tabs, Tab, Modal, Table, ProgressBar } from 'react-bootstrap'; | ||
| import { Link } from 'react-router-dom'; |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fecha as telas grandes que ainda estavam só em português. A plataforma
agora atende pt e en nas telas de leitura, busca, configuração,
integrações, relatórios, atividade e nos dois editores.
Telas traduzidas
KBView, Settings, Reviews, Favoritos, Notificações, Busca Avançada,
Busca Inteligente, Integrações (entrada e saída), Relatórios,
Atividade dos Usuários, editor de fluxo GPS e editor de post-mortem.
Além do texto
date-fnsrecebeenUS/ptBRconforme oidioma ativo, e os formatos (
dd/MM/yyyyvsMM/dd/yyyy, e a data porextenso) vêm das traduções. Antes tudo era
pt-BRfixo.etapa, períodos, dias da semana e status estavam em constantes
avaliadas uma única vez na carga do módulo — não reagiam à troca de
idioma. Agora resolvem na renderização.
singular, o que produzia "0 resultado encontrado" na busca. A variante
_zerocorrige, verificada para 0, 1 e N nos dois idiomas.<Trans>com componentesnomeados em vez de índices numéricos: com
{' '}entre os filhos anumeração automática desloca e a tag sai no lugar errado.
Bug corrigido
Em
InboundEventSources,sourceTokens.map(t => ...)sombreava a funçãode tradução, e um
t('inbound.revoke')dentro do callback estourariat is not a functionao renderizar — só na aba Entrada, e só quando jáexistisse um token cadastrado. O build passava.
Teste de i18n no CI
frontend/tests/i18n.test.js, rodando antes do build. Chave de traduçãoquebrada não derruba o build: ela aparece como o caminho da chave na tela
do usuário, então o verde do CI não provava nada. O teste cobre:
{{x}}iguais nos dois idiomas;tnão usado como parâmetro de callback em arquivo que traduz;(atributos JSX e texto entre tags; tokens técnicos como URL e host são
descartados antes da análise).
O nome do job de CI ficou inalterado de propósito:
Frontend (install + build)é um required status check da proteção da main, e renomeardeixaria todo PR esperando por um check que nunca aparece.
Verificação
npm test→ 7 testes, 0 falhasnpx vite build→ ok, rodado após cada arquivo editado<Trans>renderizado viarenderToStaticMarkupnos dois idiomas: omarkup (
<strong>,<em>,<code>,<a>) sai intacto em todos os casosO que ainda falta
Cerca de 40 arquivos menores seguem em português (KBPermissions,
KBRequests, Import, GPSSessions, PostMortemList, HelpCenter, Gamification,
Analytics, AuditLogs, painel admin). Ficam para um PR seguinte — a lista
TRADUZIDASno teste é a catraca que marca o que já não pode regredir.