From 4ad70603232aa7d19950620e9a90a162ecec2f5d Mon Sep 17 00:00:00 2001 From: marco Date: Fri, 19 Dec 2025 16:33:39 +0100 Subject: [PATCH] =?UTF-8?q?feat:=20adicionar=20tradu=C3=A7=C3=B5es=20i18n?= =?UTF-8?q?=20faltantes=20e=20atualizar=20copilot-instructions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Adicionar traduções para modal de keywords do centro de custo Geral - Corrigir toasts sem i18n em Accounts e LiabilityAccounts - Adicionar regra no copilot-instructions sobre verificação obrigatória de i18n - Garantir que todos os textos visíveis usem t() com traduções em pt-BR, es e en --- .github/copilot-instructions.md | 26 ++++++++++++++++++++++++ frontend/src/i18n/locales/en.json | 9 +++++++- frontend/src/i18n/locales/es.json | 9 +++++++- frontend/src/i18n/locales/pt-BR.json | 9 +++++++- frontend/src/pages/Accounts.jsx | 2 +- frontend/src/pages/LiabilityAccounts.jsx | 4 ++-- 6 files changed, 53 insertions(+), 6 deletions(-) diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index fbbeb9b..4127d65 100755 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -198,6 +198,32 @@ toast.success('Sucesso!'); --- +## ✅ Regras de Qualidade de Código + +### Frontend - Internacionalização (i18n) + +**OBRIGATÓRIO:** Sempre que criar ou editar arquivos do frontend, verificar i18n. + +#### Verificações necessárias: +1. **Todos os textos visíveis** devem usar `t('chave.tradução')` +2. **Toast/Alertas** devem ter traduções em: + - `/frontend/src/i18n/locales/pt-BR.json` + - `/frontend/src/i18n/locales/es.json` + - `/frontend/src/i18n/locales/en.json` +3. **Mensagens de erro** devem ter fallback: `t('key') || 'Texto padrão'` +4. **Placeholders e títulos** de formulários devem ser traduzidos + +#### Exemplo correto: +```jsx +// ❌ ERRADO +toast.success('Salvo com sucesso'); + +// ✅ CORRETO +toast.success(t('common.saveSuccess')); +``` + +--- + ## 📝 Quando Atualizar Documentação ### VERSION diff --git a/frontend/src/i18n/locales/en.json b/frontend/src/i18n/locales/en.json index fd2890b..1b2cffa 100755 --- a/frontend/src/i18n/locales/en.json +++ b/frontend/src/i18n/locales/en.json @@ -303,6 +303,7 @@ "recalculate": "Recalculate", "recalculateBalances": "Recalculate all account balances", "recalculateSuccess": "{{count}} account(s) updated successfully", + "loadAssetError": "Error loading asset details", "balancesUpToDate": "All balances are already up to date", "recalculateError": "Error recalculating balances", "adjustBalance": "Adjust Balance", @@ -427,7 +428,11 @@ "updateError": "Error updating cost center", "deleteError": "Error deleting cost center", "noCostCenters": "No cost centers registered", - "systemCostCenter": "System cost center (cannot be edited or deleted)" + "systemCostCenter": "System cost center (cannot be edited or deleted)", + "editKeywords": "Edit Keywords", + "keywordsHelp": "Keywords are used to automatically assign transactions to this cost center.", + "keywordsUpdated": "Keywords updated successfully", + "keywordsError": "Error updating keywords" }, "liabilities": { "title": "Liability Accounts", @@ -504,6 +509,8 @@ "priceAnalysis": "Technical Analysis of PRICE System", "priceAnalysisTitle": "Technical Analysis - PRICE System (French Amortization)", "priceOverview": "Overview", + "templateDownloaded": "Template downloaded successfully", + "downloadTemplateError": "Error downloading template", "priceOverviewText": "The PRICE System (French Amortization System) is the most widely used method for personal loans and financing. It is characterized by fixed installments throughout the contract period.", "whatIsPrice": "What is the PRICE System?", "whatIsPriceText": "It is an amortization system where installments are constant. While the installment value remains the same, the internal composition changes over time:", diff --git a/frontend/src/i18n/locales/es.json b/frontend/src/i18n/locales/es.json index 4947717..da01c1b 100755 --- a/frontend/src/i18n/locales/es.json +++ b/frontend/src/i18n/locales/es.json @@ -306,6 +306,7 @@ "recalculate": "Recalcular", "recalculateBalances": "Recalcular saldos de todas las cuentas", "recalculateSuccess": "{{count}} cuenta(s) actualizada(s) correctamente", + "loadAssetError": "Error al cargar detalles del activo", "balancesUpToDate": "Todos los saldos ya están actualizados", "recalculateError": "Error al recalcular saldos", "adjustBalance": "Ajustar Saldo", @@ -430,7 +431,11 @@ "updateError": "Error al actualizar centro de costo", "deleteError": "Error al eliminar centro de costo", "noCostCenters": "No hay centros de costo registrados", - "systemCostCenter": "Centro de costo del sistema (no se puede editar ni eliminar)" + "systemCostCenter": "Centro de costo del sistema (no se puede editar ni eliminar)", + "editKeywords": "Editar Palabras clave", + "keywordsHelp": "Las palabras clave se utilizan para asignar automáticamente transacciones a este centro de costo.", + "keywordsUpdated": "Palabras clave actualizadas con éxito", + "keywordsError": "Error al actualizar palabras clave" }, "liabilities": { "title": "Cuentas Pasivo", @@ -512,6 +517,8 @@ "priceAnalysis": "Análisis Técnico del Sistema PRICE", "priceAnalysisTitle": "Análisis Técnico - Sistema PRICE (Sistema Francés)", "priceOverview": "Visión General", + "templateDownloaded": "Plantilla descargada con éxito", + "downloadTemplateError": "Error al descargar plantilla", "priceOverviewText": "El Sistema PRICE (Sistema Francés de Amortización) es el método más utilizado en préstamos personales y financiamientos. Se caracteriza por cuotas fijas durante todo el período del contrato.", "whatIsPrice": "¿Qué es el Sistema PRICE?", "whatIsPriceText": "Es un sistema de amortización donde las cuotas son constantes. Mientras el valor de la cuota permanece igual, la composición interna cambia a lo largo del tiempo:", diff --git a/frontend/src/i18n/locales/pt-BR.json b/frontend/src/i18n/locales/pt-BR.json index 5b91f3b..3fa100c 100755 --- a/frontend/src/i18n/locales/pt-BR.json +++ b/frontend/src/i18n/locales/pt-BR.json @@ -308,6 +308,7 @@ "recalculate": "Recalcular", "recalculateBalances": "Recalcular saldos de todas as contas", "recalculateSuccess": "{{count}} conta(s) atualizada(s) com sucesso", + "loadAssetError": "Erro ao carregar detalhes do ativo", "balancesUpToDate": "Todos os saldos já estão atualizados", "recalculateError": "Erro ao recalcular saldos", "adjustBalance": "Ajustar Saldo", @@ -432,7 +433,11 @@ "updateError": "Erro ao atualizar centro de custo", "deleteError": "Erro ao excluir centro de custo", "noCostCenters": "Nenhum centro de custo cadastrado", - "systemCostCenter": "Centro de custo do sistema (não pode ser editado ou excluído)" + "systemCostCenter": "Centro de custo do sistema (não pode ser editado ou excluído)", + "editKeywords": "Editar Palavras-chave", + "keywordsHelp": "Palavras-chave são usadas para atribuir automaticamente transações a este centro de custo.", + "keywordsUpdated": "Palavras-chave atualizadas com sucesso", + "keywordsError": "Erro ao atualizar palavras-chave" }, "liabilities": { "title": "Contas Passivo", @@ -514,6 +519,8 @@ "priceAnalysis": "Análise Técnica do Sistema PRICE", "priceAnalysisTitle": "Análise Técnica - Sistema PRICE (Tabela Francesa)", "priceOverview": "Visão Geral", + "templateDownloaded": "Modelo baixado com sucesso", + "downloadTemplateError": "Erro ao baixar modelo", "priceOverviewText": "O Sistema PRICE (Sistema Francês de Amortização) é o método mais utilizado em empréstimos pessoais e financiamentos. Caracteriza-se por parcelas fixas durante todo o período do contrato.", "whatIsPrice": "O que é o Sistema PRICE?", "whatIsPriceText": "É um sistema de amortização onde as parcelas são constantes. Enquanto o valor da parcela permanece igual, a composição interna muda ao longo do tempo:", diff --git a/frontend/src/pages/Accounts.jsx b/frontend/src/pages/Accounts.jsx index 29a6b36..9d334a3 100755 --- a/frontend/src/pages/Accounts.jsx +++ b/frontend/src/pages/Accounts.jsx @@ -276,7 +276,7 @@ const Accounts = () => { setShowAssetDetail(true); } } catch (error) { - toast.error('Erro ao carregar detalhes do ativo'); + toast.error(t('accounts.loadAssetError') || 'Erro ao carregar detalhes do ativo'); } }; diff --git a/frontend/src/pages/LiabilityAccounts.jsx b/frontend/src/pages/LiabilityAccounts.jsx index 1f956ca..1e7c08d 100755 --- a/frontend/src/pages/LiabilityAccounts.jsx +++ b/frontend/src/pages/LiabilityAccounts.jsx @@ -84,9 +84,9 @@ const LiabilityAccounts = () => { a.click(); window.URL.revokeObjectURL(url); document.body.removeChild(a); - toast.success('Plantilla descargada'); + toast.success(t('liabilities.templateDownloaded')); } catch (error) { - toast.error('Error al descargar plantilla'); + toast.error(t('liabilities.downloadTemplateError')); } };