sepehr 7fb486c9a4 feat: Complete internationalization and code cleanup
## Translation Files
- Add 11 new language files (es, de, pt, ru, zh, ja, ko, ar, hi, nl, pl)
- Add 100+ missing translation keys across all 15 languages
- New sections: notebook, pagination, ai.batchOrganization, ai.autoLabels
- Update nav section with workspace, quickAccess, myLibrary keys

## Component Updates
- Update 15+ components to use translation keys instead of hardcoded text
- Components: notebook dialogs, sidebar, header, note-input, ghost-tags, etc.
- Replace 80+ hardcoded English/French strings with t() calls
- Ensure consistent UI across all supported languages

## Code Quality
- Remove 77+ console.log statements from codebase
- Clean up API routes, components, hooks, and services
- Keep only essential error handling (no debugging logs)

## UI/UX Improvements
- Update Keep logo to yellow post-it style (from-yellow-400 to-amber-500)
- Change selection colors to #FEF3C6 (notebooks) and #EFB162 (nav items)
- Make "+" button permanently visible in notebooks section
- Fix grammar and syntax errors in multiple components

## Bug Fixes
- Fix JSON syntax errors in it.json, nl.json, pl.json, zh.json
- Fix syntax errors in notebook-suggestion-toast.tsx
- Fix syntax errors in use-auto-tagging.ts
- Fix syntax errors in paragraph-refactor.service.ts
- Fix duplicate "fusion" section in nl.json

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>

Ou une version plus courte si vous préférez :

feat(i18n): Add 15 languages, remove logs, update UI components

- Create 11 new translation files (es, de, pt, ru, zh, ja, ko, ar, hi, nl, pl)
- Add 100+ translation keys: notebook, pagination, AI features
- Update 15+ components to use translations (80+ strings)
- Remove 77+ console.log statements from codebase
- Fix JSON syntax errors in 4 translation files
- Fix component syntax errors (toast, hooks, services)
- Update logo to yellow post-it style
- Change selection colors (#FEF3C6, #EFB162)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-11 22:26:13 +01:00

512 lines
21 KiB
JSON

{
"auth": {
"signIn": "Entrar",
"signUp": "Cadastrar-se",
"email": "E-mail",
"password": "Senha",
"name": "Nome",
"emailPlaceholder": "Digite seu endereço de e-mail",
"passwordPlaceholder": "Digite sua senha",
"namePlaceholder": "Digite seu nome",
"passwordMinChars": "Digite a senha (mínimo 6 caracteres)",
"resetPassword": "Redefinir senha",
"resetPasswordInstructions": "Digite seu e-mail para redefinir sua senha",
"forgotPassword": "Esqueceu sua senha?",
"noAccount": "Não tem uma conta?",
"hasAccount": "Já tem uma conta?",
"signInToAccount": "Entre na sua conta",
"createAccount": "Crie sua conta",
"rememberMe": "Lembrar-me",
"orContinueWith": "Ou continuar com",
"checkYourEmail": "Verifique seu e-mail",
"resetEmailSent": "Enviamos um link de redefinição de senha para seu endereço de e-mail se ele existir em nosso sistema.",
"returnToLogin": "Voltar ao login",
"forgotPasswordTitle": "Esqueci minha senha",
"forgotPasswordDescription": "Digite seu endereço de e-mail e enviaremos um link para redefinir sua senha.",
"sending": "Enviando...",
"sendResetLink": "Enviar link de redefinição",
"backToLogin": "Voltar ao login"
},
"notes": {
"title": "Notas",
"newNote": "Nova nota",
"untitled": "Sem título",
"placeholder": "Faça uma nota...",
"markdownPlaceholder": "Faça uma nota... (Markdown suportado)",
"titlePlaceholder": "Título",
"listItem": "Item da lista",
"addListItem": "+ Item da lista",
"newChecklist": "Nova lista de verificação",
"add": "Adicionar",
"adding": "Adicionando...",
"close": "Fechar",
"confirmDelete": "Tem certeza de que deseja excluir esta nota?",
"confirmLeaveShare": "Tem certeza de que deseja sair desta nota compartilhada?",
"sharedBy": "Compartilhado por",
"leaveShare": "Sair",
"delete": "Excluir",
"archive": "Arquivar",
"unarchive": "Desarquivar",
"pin": "Fixar",
"unpin": "Desafixar",
"color": "Cor",
"changeColor": "Alterar cor",
"setReminder": "Definir lembrete",
"setReminderButton": "Definir Lembrete",
"date": "Data",
"time": "Hora",
"reminderDateTimeRequired": "Por favor, insira data e hora",
"invalidDateTime": "Data ou hora inválida",
"reminderMustBeFuture": "O lembrete deve estar no futuro",
"reminderSet": "Lembrete definido para {datetime}",
"reminderPastError": "O lembrete deve estar no futuro",
"reminderRemoved": "Lembrete removido",
"addImage": "Adicionar imagem",
"addLink": "Adicionar link",
"linkAdded": "Link adicionado",
"linkMetadataFailed": "Não foi possível obter metadados do link",
"linkAddFailed": "Falha ao adicionar link",
"invalidFileType": "Tipo de arquivo inválido: {fileName}. Apenas JPEG, PNG, GIF e WebP são permitidos.",
"fileTooLarge": "Arquivo muito grande: {fileName}. O tamanho máximo é {maxSize}.",
"uploadFailed": "Falha ao fazer upload de {filename}",
"contentOrMediaRequired": "Por favor, insira algum conteúdo ou adicione um link/imagem",
"itemOrMediaRequired": "Por favor, adicione pelo menos um item ou mídia",
"noteCreated": "Nota criada com sucesso",
"noteCreateFailed": "Falha ao criar nota",
"aiAssistant": "Assistente IA",
"changeSize": "Alterar tamanho",
"backgroundOptions": "Opções de fundo",
"moreOptions": "Mais opções",
"remindMe": "Lembrar-me",
"markdownMode": "Markdown",
"addCollaborators": "Adicionar colaboradores",
"duplicate": "Duplicar",
"share": "Compartilhar",
"showCollaborators": "Mostrar colaboradores",
"pinned": "Fixadas",
"others": "Outros",
"noNotes": "Sem notas",
"noNotesFound": "Nenhuma nota encontrada",
"createFirstNote": "Crie sua primeira nota",
"size": "Tamanho",
"small": "Pequeno",
"medium": "Médio",
"large": "Grande",
"shareWithCollaborators": "Compartilhar com colaboradores",
"view": "Ver nota",
"edit": "Editar nota",
"readOnly": "Somente leitura",
"preview": "Visualizar",
"noContent": "Sem conteúdo",
"takeNote": "Faça uma nota...",
"takeNoteMarkdown": "Faça uma nota... (Markdown suportado)",
"addItem": "Adicionar item",
"sharedReadOnly": "Esta nota é compartilhada com você no modo somente leitura",
"makeCopy": "Fazer uma cópia",
"saving": "Salvando...",
"copySuccess": "Nota copiada com sucesso!",
"copyFailed": "Falha ao copiar nota",
"copy": "Copiar",
"markdownOn": "Markdown LIGADO",
"markdownOff": "Markdown DESLIGADO",
"undo": "Desfazer (Ctrl+Z)",
"redo": "Refazer (Ctrl+Y)"
},
"pagination": {
"previous": "←",
"pageInfo": "Página {currentPage} / {totalPages}",
"next": "→"
},
"labels": {
"title": "Etiquetas",
"filter": "Filtrar por etiqueta",
"manage": "Gerenciar etiquetas",
"manageTooltip": "Gerenciar etiquetas",
"changeColor": "Alterar cor",
"changeColorTooltip": "Alterar cor",
"delete": "Excluir",
"deleteTooltip": "Excluir etiqueta",
"confirmDelete": "Tem certeza de que deseja excluir esta etiqueta?",
"newLabelPlaceholder": "Criar nova etiqueta",
"namePlaceholder": "Digite o nome da etiqueta",
"addLabel": "Adicionar etiqueta",
"createLabel": "Criar etiqueta",
"labelName": "Nome da etiqueta",
"labelColor": "Cor da etiqueta",
"manageLabels": "Gerenciar etiquetas",
"manageLabelsDescription": "Adicione ou remova etiquetas para esta nota. Clique em uma etiqueta para alterar sua cor.",
"selectedLabels": "Etiquetas selecionadas",
"allLabels": "Todas as etiquetas",
"clearAll": "Limpar tudo",
"filterByLabel": "Filtrar por etiqueta",
"tagAdded": "Tag \"{tag}\" adicionada",
"showLess": "Mostrar menos",
"showMore": "Mostrar mais",
"editLabels": "Editar etiquetas",
"editLabelsDescription": "Crie, edite cores ou exclua etiquetas.",
"noLabelsFound": "Nenhuma etiqueta encontrada.",
"loading": "Carregando...",
"notebookRequired": "⚠️ Etiquetas só estão disponíveis em cadernos. Mova esta nota para um caderno primeiro."
},
"search": {
"placeholder": "Pesquisar",
"searchPlaceholder": "Pesquise suas notas...",
"semanticInProgress": "Pesquisa semântica em andamento...",
"semanticTooltip": "Pesquisa semântica com IA",
"searching": "Pesquisando...",
"noResults": "Nenhum resultado encontrado",
"resultsFound": "{count} notas encontradas",
"exactMatch": "Correspondência exata",
"related": "Relacionado"
},
"collaboration": {
"emailPlaceholder": "Digite o endereço de e-mail",
"addCollaborator": "Adicionar colaborador",
"removeCollaborator": "Remover colaborador",
"owner": "Proprietário",
"canEdit": "Pode editar",
"canView": "Pode visualizar",
"shareNote": "Compartilhar nota",
"shareWithCollaborators": "Compartilhar com colaboradores",
"addCollaboratorDescription": "Adicione pessoas para colaborar nesta nota através do endereço de e-mail.",
"viewerDescription": "Você tem acesso a esta nota. Apenas o proprietário pode gerenciar colaboradores.",
"emailAddress": "Endereço de e-mail",
"enterEmailAddress": "Digite o endereço de e-mail",
"invite": "Convidar",
"peopleWithAccess": "Pessoas com acesso",
"noCollaborators": "Ainda não há colaboradores. Adicione alguém acima!",
"noCollaboratorsViewer": "Ainda não há colaboradores.",
"pendingInvite": "Convite pendente",
"pending": "Pendente",
"remove": "Remover",
"unnamedUser": "Usuário sem nome",
"done": "Concluído",
"willBeAdded": "{email} será adicionado como colaborador quando a nota for criada",
"alreadyInList": "Este e-mail já está na lista",
"nowHasAccess": "{name} agora tem acesso a esta nota",
"accessRevoked": "O acesso foi revogado",
"errorLoading": "Erro ao carregar colaboradores",
"failedToAdd": "Falha ao adicionar colaborador",
"failedToRemove": "Falha ao remover colaborador"
},
"ai": {
"analyzing": "IA analisando...",
"clickToAddTag": "Clique para adicionar esta tag",
"ignoreSuggestion": "Ignorar esta sugestão",
"generatingTitles": "Gerando títulos...",
"generateTitlesTooltip": "Gerar títulos com IA",
"poweredByAI": "Powered by IA",
"languageDetected": "Idioma detectado",
"processing": "Processando...",
"tagAdded": "Tag \"{tag}\" adicionada",
"titleGenerating": "Gerando...",
"titleGenerateWithAI": "Gerar títulos com IA",
"titleGenerationMinWords": "O conteúdo deve ter pelo menos 10 palavras para gerar títulos (atual: {count} palavras)",
"titleGenerationError": "Erro ao gerar títulos",
"titlesGenerated": "💡 {count} títulos gerados!",
"titleGenerationFailed": "Falha ao gerar títulos",
"titleApplied": "Título aplicado!",
"reformulationNoText": "Por favor, selecione o texto ou adicione conteúdo",
"reformulationSelectionTooShort": "Seleção muito curta, usando conteúdo completo",
"reformulationMinWords": "O texto deve ter pelo menos 10 palavras (atual: {count} palavras)",
"reformulationMaxWords": "O texto deve ter no máximo 500 palavras",
"reformulationError": "Erro durante a reformulação",
"reformulationFailed": "Falha ao reformular texto",
"reformulationApplied": "Texto reformulado aplicado!",
"transformMarkdown": "Transformar em Markdown",
"transforming": "Transformando...",
"transformSuccess": "Texto transformado em Markdown com sucesso!",
"transformError": "Erro durante a transformação",
"assistant": "Assistente IA",
"generating": "Gerando...",
"generateTitles": "Gerar títulos",
"reformulateText": "Reformular texto",
"reformulating": "Reformulando...",
"clarify": "Esclarecer",
"shorten": "Encurtar",
"improveStyle": "Melhorar estilo",
"reformulationComparison": "Comparação de reformulação",
"original": "Original",
"reformulated": "Reformulado"
},
"batchOrganization": {
"error": "Falha ao criar o plano de organização",
"noNotesSelected": "Nenhuma nota selecionada",
"title": "Organizar com IA",
"description": "A IA analisará suas notas e sugerirá organizá-las em cadernos.",
"analyzing": "Analisando suas notas...",
"notesToOrganize": "{count} notas para organizar",
"selected": "{count} selecionado",
"noNotebooks": "Nenhum caderno disponível. Crie primeiro cadernos para organizar suas notas.",
"noSuggestions": "A IA não encontrou uma boa maneira de organizar estas notas.",
"confidence": "confiança",
"unorganized": "{count} notas não puderam ser categorizadas e permanecerão em Notas Gerais.",
"applying": "Aplicando...",
"apply": "Aplicar ({count})"
},
"autoLabels": {
"error": "Falha ao obter sugestões de etiquetas",
"noLabelsSelected": "Nenhuma etiqueta selecionada",
"created": "{count} etiquetas criadas com sucesso",
"analyzing": "Analisando suas notas...",
"title": "Novas sugestões de etiquetas",
"description": "Detectei temas recorrentes em \"{notebookName}\" ({totalNotes} notas). Criar etiquetas para eles?",
"note": "nota",
"notes": "notas",
"typeContent": "Digite o conteúdo para obter sugestões de etiquetas...",
"createNewLabel": "Criar esta nova etiqueta e adicioná-la",
"new": "(novo)"
},
"titleSuggestions": {
"available": "Sugestões de título",
"title": "Sugestões de IA",
"generating": "Gerando...",
"selectTitle": "Selecione um título",
"dismiss": "Descartar"
},
"semanticSearch": {
"exactMatch": "Correspondência exata",
"related": "Relacionado",
"searching": "Pesquisando..."
},
"paragraphRefactor": {
"title": "Melhoria de texto",
"shorten": "Encurtar",
"expand": "Expandir",
"improve": "Melhorar",
"formal": "Formal",
"casual": "Informal"
},
"memoryEcho": {
"title": "Notei algo...",
"description": "Conexões proativas entre suas notas",
"dailyInsight": "Percepção diária das suas notas",
"insightReady": "Sua percepção está pronta!",
"viewConnection": "Ver conexão",
"helpful": "Útil",
"notHelpful": "Não útil",
"dismiss": "Descartar por enquanto",
"thanksFeedback": "Obrigado pelo seu feedback!",
"thanksFeedbackImproving": "Obrigado! Usaremos isso para melhorar.",
"connections": "Conexões",
"connection": "conexão",
"connectionsBadge": "{count} conexão{plural}",
"fused": "Fundido",
"overlay": {
"title": "Notas conectadas",
"searchPlaceholder": "Pesquisar conexões...",
"sortBy": "Ordenar por:",
"sortSimilarity": "Similaridade",
"sortRecent": "Recente",
"sortOldest": "Mais antigo",
"viewAll": "Ver todas lado a lado",
"loading": "Carregando...",
"noConnections": "Nenhuma conexão encontrada"
},
"comparison": {
"title": "💡 Comparação de notas",
"similarityInfo": "Estas notas estão conectadas por {similarity}% de similaridade",
"highSimilarityInsight": "Estas notas tratam do mesmo assunto com alto grau de similaridade. Podem ser mescladas ou consolidadas.",
"untitled": "Sem título",
"clickToView": "Clique para ver a nota",
"helpfulQuestion": "Esta comparação é útil?",
"helpful": "Útil",
"notHelpful": "Não útil"
},
"editorSection": {
"title": "⚡ Notas conectadas ({count})",
"loading": "Carregando...",
"view": "Ver",
"compare": "Comparar",
"merge": "Mesclar",
"compareAll": "Comparar todas",
"mergeAll": "Mesclar todas"
},
"fusion": {
"title": "🔗 Fusão inteligente",
"mergeNotes": "Mesclar {count} nota(s)",
"notesToMerge": "📝 Notas para mesclar",
"optionalPrompt": "💬 Prompt de fusão (opcional)",
"promptPlaceholder": "Instruções opcionais para IA (ex: 'Manter o estilo formal da nota 1')...",
"generateFusion": "Gerar a fusão",
"generating": "Gerando...",
"previewTitle": "📝 Visualização da nota mesclada",
"edit": "Editar",
"modify": "Modificar",
"finishEditing": "Concluir edição",
"optionsTitle": "Opções de fusão",
"archiveOriginals": "Arquivar notas originais",
"keepAllTags": "Manter todas as tags",
"useLatestTitle": "Usar a nota mais recente como título",
"createBacklinks": "Criar backlink para notas originais",
"cancel": "Cancelar",
"confirmFusion": "Confirmar fusão",
"success": "Notas mescladas com sucesso!",
"error": "Falha ao mesclar notas",
"generateError": "Falha ao gerar fusão",
"noContentReturned": "Nenhum conteúdo de fusão retornado da API",
"unknownDate": "Data desconhecida"
}
},
"nav": {
"home": "Início",
"notes": "Notas",
"notebooks": "Cadernos",
"generalNotes": "Notas gerais",
"archive": "Arquivo",
"settings": "Configurações",
"profile": "Perfil",
"aiSettings": "Configurações de IA",
"logout": "Sair",
"login": "Entrar",
"adminDashboard": "Painel de administração",
"diagnostics": "Diagnósticos",
"trash": "Lixeira",
"support": "Apoie o Memento ☕",
"reminders": "Lembretes",
"userManagement": "Gerenciamento de usuários",
"accountSettings": "Configurações da conta",
"manageAISettings": "Gerenciar configurações de IA",
"configureAI": "Configure seus recursos com IA, provedor e preferências",
"supportDevelopment": "Apoie o desenvolvimento do Memento ☕",
"supportDescription": "Memento é 100% gratuito e de código aberto. Seu apoio ajuda a mantê-lo assim.",
"buyMeACoffee": "Me pague um café",
"donationDescription": "Faça uma doação única ou torne-se um apoiador mensal.",
"donateOnKofi": "Doar no Ko-fi",
"donationNote": "Sem taxas de plataforma • Pagamentos instantâneos • Seguro",
"sponsorOnGithub": "Apoiar no GitHub",
"sponsorDescription": "Torne-se um apoiador mensal e receba reconhecimento.",
"workspace": "Espaço de trabalho",
"quickAccess": "Acesso rápido",
"myLibrary": "Minha biblioteca",
"favorites": "Favoritos",
"recent": "Recentes",
"proPlan": "Pro Plan"
},
"settings": {
"title": "Configurações",
"description": "Gerencie suas configurações e preferências",
"account": "Conta",
"appearance": "Aparência",
"theme": "Tema",
"themeLight": "Claro",
"themeDark": "Escuro",
"themeSystem": "Sistema",
"notifications": "Notificações",
"language": "Idioma",
"selectLanguage": "Selecionar idioma",
"privacy": "Privacidade",
"security": "Segurança",
"about": "Sobre",
"version": "Versão",
"settingsSaved": "Configurações salvas",
"settingsError": "Erro ao salvar configurações"
},
"profile": {
"title": "Perfil",
"description": "Atualize suas informações pessoais",
"displayName": "Nome de exibição",
"email": "E-mail",
"changePassword": "Alterar senha",
"changePasswordDescription": "Atualize sua senha. Você precisará da sua senha atual.",
"currentPassword": "Senha atual",
"newPassword": "Nova senha",
"confirmPassword": "Confirmar senha",
"updatePassword": "Atualizar senha",
"passwordChangeSuccess": "Senha alterada com sucesso",
"passwordChangeFailed": "Falha ao alterar senha",
"passwordUpdated": "Senha atualizada",
"passwordError": "Erro ao atualizar senha",
"languagePreferences": "Preferências de idioma",
"languagePreferencesDescription": "Escolha seu idioma preferido para recursos de IA e interface.",
"preferredLanguage": "Idioma preferido",
"selectLanguage": "Selecione um idioma",
"languageDescription": "Este idioma será usado para recursos com IA, análise de conteúdo e texto da interface.",
"autoDetect": "Detecção automática",
"updateSuccess": "Perfil atualizado",
"updateFailed": "Falha ao atualizar perfil",
"languageUpdateSuccess": "Idioma atualizado com sucesso",
"languageUpdateFailed": "Falha ao atualizar idioma",
"profileUpdated": "Perfil atualizado",
"profileError": "Erro ao atualizar perfil",
"accountSettings": "Configurações da conta",
"manageAISettings": "Gerenciar configurações de IA",
"displaySettings": "Configurações de exibição",
"displaySettingsDescription": "Personalize a aparência e o tamanho da fonte.",
"fontSize": "Tamanho da fonte",
"selectFontSize": "Selecionar tamanho da fonte",
"fontSizeSmall": "Pequeno",
"fontSizeMedium": "Médio",
"fontSizeLarge": "Grande",
"fontSizeExtraLarge": "Extra grande",
"fontSizeDescription": "Ajuste o tamanho da fonte para melhor legibilidade. Isso se aplica a todos os textos da interface.",
"fontSizeUpdateSuccess": "Tamanho da fonte atualizado com sucesso",
"fontSizeUpdateFailed": "Falha ao atualizar tamanho da fonte"
},
"aiSettings": {
"title": "Configurações de IA",
"description": "Configure seus recursos e preferências com IA",
"features": "Recursos de IA",
"provider": "Provedor de IA",
"providerAuto": "Automático (Recomendado)",
"providerOllama": "Ollama (Local)",
"providerOpenAI": "OpenAI (Nuvem)",
"frequency": "Frequência",
"frequencyDaily": "Diariamente",
"frequencyWeekly": "Semanalmente",
"saving": "Salvando...",
"saved": "Configuração atualizada",
"error": "Falha ao atualizar configuração"
},
"general": {
"loading": "Carregando...",
"save": "Salvar",
"cancel": "Cancelar",
"add": "Adicionar",
"edit": "Editar",
"confirm": "Confirmar",
"close": "Fechar",
"back": "Voltar",
"next": "Próximo",
"previous": "Anterior",
"submit": "Enviar",
"reset": "Redefinir",
"apply": "Aplicar",
"clear": "Limpar",
"select": "Selecionar",
"tryAgain": "Por favor, tente novamente",
"error": "Ocorreu um erro",
"operationSuccess": "Operação bem-sucedida",
"operationFailed": "Operação falhou"
},
"colors": {
"default": "Padrão",
"red": "Vermelho",
"blue": "Azul",
"green": "Verde",
"yellow": "Amarelo",
"purple": "Roxo",
"pink": "Rosa",
"orange": "Laranja",
"gray": "Cinza"
},
"reminder": {
"title": "Lembrete",
"setReminder": "Definir lembrete",
"removeReminder": "Remover lembrete",
"reminderDate": "Data do lembrete",
"reminderTime": "Hora do lembrete",
"save": "Definir lembrete",
"cancel": "Cancelar"
},
"notebookSuggestion": {
"title": "Mover para {icon} {name}?",
"description": "Esta nota parece pertencer a este caderno",
"move": "Mover",
"dismiss": "Descartar",
"dismissIn": "Descartar (fecha em {timeLeft}s)",
"moveToNotebook": "Mover para caderno",
"generalNotes": "Notas gerais"
}
}