Skip to content

feat(i18n): completar pt/en nas telas restantes + teste de i18n no CI - #32

Merged
janeiaraujo merged 7 commits into
mainfrom
feat/i18n-telas-restantes
Aug 3, 2026
Merged

feat(i18n): completar pt/en nas telas restantes + teste de i18n no CI#32
janeiaraujo merged 7 commits into
mainfrom
feat/i18n-telas-restantes

Conversation

@janeiaraujo

Copy link
Copy Markdown
Owner

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

  • Datas seguem o idioma. date-fns recebe enUS/ptBR conforme o
    idioma ativo, e os formatos (dd/MM/yyyy vs MM/dd/yyyy, e a data por
    extenso) vêm das traduções. Antes tudo era pt-BR fixo.
  • Rótulos em arrays de módulo viraram chaves. Prioridades, tipos de
    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.
  • Plural de zero. A regra CLDR do português classifica 0 como
    singular, o que produzia "0 resultado encontrado" na busca. A variante
    _zero corrige, verificada para 0, 1 e N nos dois idiomas.
  • Frases com link/markup embutido usam <Trans> com componentes
    nomeados em vez de índices numéricos: com {' '} entre os filhos a
    numeração automática desloca e a tag sai no lugar errado.

Bug corrigido

Em InboundEventSources, sourceTokens.map(t => ...) sombreava a função
de tradução, e um t('inbound.revoke') dentro do callback estouraria
t is not a function ao 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ção
quebrada 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:

  • paridade exata de chaves entre pt e en, inclusive tamanho de listas;
  • toda chave citada no código existe de fato (723 referências hoje);
  • placeholders {{x}} iguais nos dois idiomas;
  • nenhuma tradução vazia;
  • t não usado como parâmetro de callback em arquivo que traduz;
  • telas já traduzidas não regridem para texto fixo em português
    (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 renomear
deixaria todo PR esperando por um check que nunca aparece.

Verificação

  • npm test → 7 testes, 0 falhas
  • npx vite build → ok, rodado após cada arquivo editado
  • <Trans> renderizado via renderToStaticMarkup nos dois idiomas: o
    markup (<strong>, <em>, <code>, <a>) sai intacto em todos os casos
  • login verificado no navegador em pt e en, sem chave crua na tela

O 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
TRADUZIDAS no teste é a catraca que marca o que já não pode regredir.

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.
Copilot AI review requested due to automatic review settings August 3, 2026 19:50
@janeiaraujo
janeiaraujo merged commit 00f70d1 into main Aug 3, 2026
4 checks passed

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 test e 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';
@janeiaraujo
janeiaraujo deleted the feat/i18n-telas-restantes branch August 3, 2026 23:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants