feat: adicionar traduções i18n faltantes e atualizar copilot-instructions

- 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
This commit is contained in:
marco 2025-12-19 16:33:39 +01:00
parent c787077a39
commit 4ad7060323
6 changed files with 53 additions and 6 deletions

View File

@ -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 ## 📝 Quando Atualizar Documentação
### VERSION ### VERSION

View File

@ -303,6 +303,7 @@
"recalculate": "Recalculate", "recalculate": "Recalculate",
"recalculateBalances": "Recalculate all account balances", "recalculateBalances": "Recalculate all account balances",
"recalculateSuccess": "{{count}} account(s) updated successfully", "recalculateSuccess": "{{count}} account(s) updated successfully",
"loadAssetError": "Error loading asset details",
"balancesUpToDate": "All balances are already up to date", "balancesUpToDate": "All balances are already up to date",
"recalculateError": "Error recalculating balances", "recalculateError": "Error recalculating balances",
"adjustBalance": "Adjust Balance", "adjustBalance": "Adjust Balance",
@ -427,7 +428,11 @@
"updateError": "Error updating cost center", "updateError": "Error updating cost center",
"deleteError": "Error deleting cost center", "deleteError": "Error deleting cost center",
"noCostCenters": "No cost centers registered", "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": { "liabilities": {
"title": "Liability Accounts", "title": "Liability Accounts",
@ -504,6 +509,8 @@
"priceAnalysis": "Technical Analysis of PRICE System", "priceAnalysis": "Technical Analysis of PRICE System",
"priceAnalysisTitle": "Technical Analysis - PRICE System (French Amortization)", "priceAnalysisTitle": "Technical Analysis - PRICE System (French Amortization)",
"priceOverview": "Overview", "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.", "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?", "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:", "whatIsPriceText": "It is an amortization system where installments are constant. While the installment value remains the same, the internal composition changes over time:",

View File

@ -306,6 +306,7 @@
"recalculate": "Recalcular", "recalculate": "Recalcular",
"recalculateBalances": "Recalcular saldos de todas las cuentas", "recalculateBalances": "Recalcular saldos de todas las cuentas",
"recalculateSuccess": "{{count}} cuenta(s) actualizada(s) correctamente", "recalculateSuccess": "{{count}} cuenta(s) actualizada(s) correctamente",
"loadAssetError": "Error al cargar detalles del activo",
"balancesUpToDate": "Todos los saldos ya están actualizados", "balancesUpToDate": "Todos los saldos ya están actualizados",
"recalculateError": "Error al recalcular saldos", "recalculateError": "Error al recalcular saldos",
"adjustBalance": "Ajustar Saldo", "adjustBalance": "Ajustar Saldo",
@ -430,7 +431,11 @@
"updateError": "Error al actualizar centro de costo", "updateError": "Error al actualizar centro de costo",
"deleteError": "Error al eliminar centro de costo", "deleteError": "Error al eliminar centro de costo",
"noCostCenters": "No hay centros de costo registrados", "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": { "liabilities": {
"title": "Cuentas Pasivo", "title": "Cuentas Pasivo",
@ -512,6 +517,8 @@
"priceAnalysis": "Análisis Técnico del Sistema PRICE", "priceAnalysis": "Análisis Técnico del Sistema PRICE",
"priceAnalysisTitle": "Análisis Técnico - Sistema PRICE (Sistema Francés)", "priceAnalysisTitle": "Análisis Técnico - Sistema PRICE (Sistema Francés)",
"priceOverview": "Visión General", "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.", "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?", "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:", "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:",

View File

@ -308,6 +308,7 @@
"recalculate": "Recalcular", "recalculate": "Recalcular",
"recalculateBalances": "Recalcular saldos de todas as contas", "recalculateBalances": "Recalcular saldos de todas as contas",
"recalculateSuccess": "{{count}} conta(s) atualizada(s) com sucesso", "recalculateSuccess": "{{count}} conta(s) atualizada(s) com sucesso",
"loadAssetError": "Erro ao carregar detalhes do ativo",
"balancesUpToDate": "Todos os saldos já estão atualizados", "balancesUpToDate": "Todos os saldos já estão atualizados",
"recalculateError": "Erro ao recalcular saldos", "recalculateError": "Erro ao recalcular saldos",
"adjustBalance": "Ajustar Saldo", "adjustBalance": "Ajustar Saldo",
@ -432,7 +433,11 @@
"updateError": "Erro ao atualizar centro de custo", "updateError": "Erro ao atualizar centro de custo",
"deleteError": "Erro ao excluir centro de custo", "deleteError": "Erro ao excluir centro de custo",
"noCostCenters": "Nenhum centro de custo cadastrado", "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": { "liabilities": {
"title": "Contas Passivo", "title": "Contas Passivo",
@ -514,6 +519,8 @@
"priceAnalysis": "Análise Técnica do Sistema PRICE", "priceAnalysis": "Análise Técnica do Sistema PRICE",
"priceAnalysisTitle": "Análise Técnica - Sistema PRICE (Tabela Francesa)", "priceAnalysisTitle": "Análise Técnica - Sistema PRICE (Tabela Francesa)",
"priceOverview": "Visão Geral", "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.", "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?", "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:", "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:",

View File

@ -276,7 +276,7 @@ const Accounts = () => {
setShowAssetDetail(true); setShowAssetDetail(true);
} }
} catch (error) { } catch (error) {
toast.error('Erro ao carregar detalhes do ativo'); toast.error(t('accounts.loadAssetError') || 'Erro ao carregar detalhes do ativo');
} }
}; };

View File

@ -84,9 +84,9 @@ const LiabilityAccounts = () => {
a.click(); a.click();
window.URL.revokeObjectURL(url); window.URL.revokeObjectURL(url);
document.body.removeChild(a); document.body.removeChild(a);
toast.success('Plantilla descargada'); toast.success(t('liabilities.templateDownloaded'));
} catch (error) { } catch (error) {
toast.error('Error al descargar plantilla'); toast.error(t('liabilities.downloadTemplateError'));
} }
}; };