diff --git a/languages/pt.json b/languages/pt.json new file mode 100644 index 0000000..6167a0d --- /dev/null +++ b/languages/pt.json @@ -0,0 +1,328 @@ +{ + "language": { + "display_name": "Português (Portuguese)", + "select_language": "Selecionar idioma:", + "current_language": "Idioma atual: {language}", + "restart_required": "As alterações de idioma terão efeito após reiniciar a aplicação.", + "english": "Inglês", + "spanish": "Espanhol", + "portuguese": "Português", + "help_text": "Selecione seu idioma preferido para a interface.", + "restart_notice": "A alteração de idioma terá efeito após reiniciar a aplicação." + }, + "app": { + "title": "YTSage", + "version": "v{version}", + "ready": "Pronto" + }, + "formats": { + "show_formats": "Mostrar Formatos:", + "video_format": "Formato de Vídeo:", + "audio_format": "Formato de Áudio:", + "no_formats": "Nenhum formato disponível", + "loading": "Carregando formatos...", + "select": "Selecionar", + "quality": "Qualidade", + "extension": "Extensão", + "resolution": "Resolução", + "file_size": "Tamanho do Arquivo", + "codec": "Codec", + "audio": "Áudio", + "notes": "Notas", + "will_merge_audio": "Irá mesclar áudio", + "has_audio": "✓ Tem Áudio", + "audio_only": "Apenas Áudio", + "large_size": "Tamanho grande", + "medium_size": "Tamanho médio", + "standard_size": "Tamanho padrão", + "compatible": "Compatível", + "efficient": "Eficiente", + "high_quality": "Alta qualidade", + "best_4k": "Melhor (4K)", + "best_2k": "Melhor (2K)", + "high_1080p": "Alta (1080p)", + "high_720p": "Alta (720p)", + "medium_480p": "Média (480p)", + "low_quality": "Baixa Qualidade", + "best_audio": "Melhor Áudio", + "high_audio": "Áudio Alto", + "medium_audio": "Áudio Médio", + "low_audio": "Áudio Baixo", + "audio_only_resolution": "Apenas áudio" + }, + "buttons": { + "download": "Baixar", + "pause": "Pausar", + "resume": "Retomar", + "cancel": "Cancelar", + "browse": "Procurar", + "clear": "Limpar", + "ok": "OK", + "apply": "Aplicar", + "close": "Fechar", + "run_command": "Executar Comando", + "custom_command_help": "Ajuda", + "about": "Sobre", + "analyze": "Analisar", + "paste_url": "Colar URL", + "select_videos": "Selecionar Vídeos...", + "video": "Vídeo", + "audio_only": "Apenas Áudio", + "custom_options": "Opções Personalizadas", + "trim_video": "Cortar Vídeo", + "download_settings": "Configurações de Download", + "update": "Atualizar yt-dlp", + "select_defaults": "Selecionar Padrões", + "select_all": "Selecionar Tudo", + "deselect_all": "Desmarcar Tudo" + }, + "dialogs": { + "custom_options": "Opções Personalizadas", + "settings": "Configurações", + "select_folder": "Selecionar Pasta de Download", + "sponsorblock_categories": "Categorias SponsorBlock", + "sponsorblock_description": "Selecione quais tipos de segmentos de vídeo serão removidos automaticamente durante o download.\nO SponsorBlock usa dados enviados pela comunidade para identificar esses segmentos.", + "select_subtitles": "Selecionar Legendas", + "filter_languages_placeholder": "Filtrar idiomas (ex., en, pt)...", + "no_subtitles_available": "Nenhuma legenda disponível", + "matching": "correspondendo" + }, + "tabs": { + "cookies": "Entrar com Cookies", + "custom_command": "Comando Personalizado", + "proxy": "Proxy", + "language": "Idioma" + }, + "cookies": { + "help_text": "Escolha como fornecer cookies para fazer login.\nIsso permite baixar vídeos privados e áudio de qualidade premium.", + "cookie_source": "Fonte de Cookies", + "use_cookie_file": "Usar arquivo de cookies", + "extract_from_browser": "Extrair do navegador", + "cookie_file": "Arquivo de Cookies", + "cookie_file_placeholder": "Caminho para o arquivo cookies.txt...", + "browser_selection": "Seleção de Navegador", + "browser_help": "Selecione o navegador do qual extrair cookies:", + "browser_label": "Navegador:", + "profile_label": "Perfil:", + "profile_placeholder": "padrão", + "browser_extract_message": "Os cookies do navegador serão extraídos quando aplicados", + "file_selected_message": "Arquivo de cookies selecionado - Clique em OK para aplicar", + "select_file_title": "Selecionar Arquivo de Cookies", + "file_filter": "Arquivos de cookies (*.txt *.lwp)" + }, + "custom_command": { + "help_text": "Digite seu comando yt-dlp personalizado abaixo. A URL atual será anexada automaticamente.

Para a lista completa de opções e exemplos de uso, clique aqui para ver a documentação oficial do yt-dlp.

Nota: O caminho de download e modelo de nome de arquivo serão tratados automaticamente.", + "input_label": "Argumentos yt-dlp:", + "input_placeholder": "Digite os argumentos yt-dlp aqui...\n\nex. --extract-audio --audio-format mp3", + "output_label": "Saída do Comando:", + "output_placeholder": "A saída do comando aparecerá aqui...", + "command_placeholder": "Digite comando yt-dlp personalizado...", + "command_help": "Marcadores disponíveis:\n{url} - URL do Vídeo\n{output} - Diretório de saída\n\nExemplo: --write-info-json --write-thumbnail", + "full_command": "🔧 Comando completo: {command}", + "command_success": "✅ Comando personalizado executado com sucesso!", + "command_failed": "❌ Comando falhou com código de saída {code}", + "command_error": "❌ Erro ao executar comando personalizado: {error}" + }, + "proxy": { + "help_text": "Configure as definições de proxy para download. Deixe vazio para usar conexão direta.", + "main_proxy": "Proxy Principal", + "main_proxy_help": "Servidor proxy principal para todos os downloads. Suporta protocolos HTTP/HTTPS e SOCKS5.", + "proxy_url_label": "URL do Proxy:", + "proxy_url_placeholder": "http://proxy:porta ou socks5://proxy:porta", + "proxy_examples": "Exemplos:\n• HTTP: http://proxy.exemplo.com:8080\n• SOCKS5: socks5://proxy.exemplo.com:1080", + "geo_proxy": "Proxy de Contorno Geográfico", + "geo_proxy_help": "Proxy secundário especificamente para contornar restrições geográficas.", + "geo_proxy_url_label": "URL do Proxy de Contorno Geográfico:", + "geo_proxy_url_placeholder": "http://geo-proxy:porta", + "clear_main_proxy": "Limpar Proxy Principal", + "clear_geo_proxy": "Limpar Proxy Geográfico", + "proxy_url": "URL do Proxy", + "proxy_placeholder": "http://proxy:porta ou socks5://proxy:porta", + "geo_bypass": "Proxy de contorno geográfico (para restrições geográficas)", + "geo_bypass_placeholder": "http://proxy:porta para contornar bloqueios geográficos", + "invalid_main_url": "Formato de URL do proxy principal inválido", + "invalid_geo_url": "Formato de URL do proxy geográfico inválido", + "main_configured": "Proxy principal configurado", + "geo_configured": "Proxy geográfico configurado" + }, + + "download": { + "preparing": "Preparando download...", + "please_enter_url": "Por favor, digite uma URL primeiro.", + "please_set_path": "Por favor, defina um caminho de download primeiro.", + "please_enter_url_and_path": "Por favor, digite uma URL e defina o caminho de download.", + "please_select_format": "Por favor, selecione um formato primeiro." + }, + "update": { + "title": "Atualizar yt-dlp", + "checking": "Verificando atualizações...", + "update_available": "Atualização disponível!\nVersão atual: {current}\nÚltima versão: {latest}", + "up_to_date": "yt-dlp está atualizado (versão {version})", + "could_not_determine": "Não foi possível determinar as versões.", + "error_comparing": "Erro ao comparar versões: {error}", + "update_available_failed": "Atualização disponível! (Comparação falhou)\nAtual: {current}\nÚltima: {latest}", + "updating": "Atualizando...", + "initializing": "🚀 Inicializando processo de atualização...", + "checking_current": "🔍 Verificando instalação atual...", + "found_at": "📍 yt-dlp encontrado em: {path}", + "error_getting_path": "❌ Erro ao obter caminho do yt-dlp: {error}", + "updating_binary": "📦 Atualizando binário yt-dlp gerenciado pela aplicação...", + "updating_pip": "🐍 Atualizando yt-dlp do sistema via pip...", + "update_failed": "❌ Falha ao atualizar yt-dlp. Tente novamente ou verifique sua conexão com a internet.", + "binary_updated": "✅ Binário atualizado com sucesso!", + "update_failed_stderr": "❌ Atualização do yt-dlp falhou: {error}", + "update_timeout": "❌ Atualização do yt-dlp expirou.", + "unexpected_error": "❌ Erro inesperado durante atualização: {error}", + "checking_pip": "🔍 Verificando instalação pip atual...", + "current_version": "📋 Versão atual: {version}", + "not_found_pip": "⚠️ yt-dlp não encontrado via pip, tentando instalação...", + "checking_latest": "🌐 Verificando última versão...", + "failed_check_updates": "❌ Falha ao verificar atualizações", + "latest_version": "🆕 Última versão: {version}", + "updating_from_to": "⬆️ Atualizando de {current} para {latest}...", + "running_pip_install": "📦 Executando pip install --upgrade...", + "pip_completed": "✅ Atualização pip concluída com sucesso!", + "pip_failed": "❌ Atualização pip falhou: {error}" + }, + "about": { + "title": "Sobre YTSage", + "version": "Versão {version}", + "description": "Downloader moderno do YouTube com interface limpa em PySide6.", + "author": "Por: {author}", + "github": "GitHub: {repo}", + "system_info": "Informações do Sistema", + "loading": "🔄 Carregando informações do sistema...", + "refresh": "🔄", + "refreshing": "🔄 Atualizando...", + "refresh_failed": "Atualização Falhou", + "refresh_failed_message": "Não foi possível atualizar as informações de versão.", + "detected": "✓ Detectado", + "missing": "✗ Ausente", + "not_available": "Não Disponível" + }, + "time_range": { + "title": "Cortar Vídeo", + "time_range_group": "Intervalo de Tempo", + "start_time": "Tempo de Início (HH:MM:SS)", + "end_time": "Tempo de Fim (HH:MM:SS)", + "start_placeholder": "00:00:00", + "end_placeholder": "00:00:00", + "start_time_placeholder": "Tempo de início (HH:MM:SS)", + "end_time_placeholder": "Tempo de fim (HH:MM:SS)", + "force_keyframes": "Forçar quadros-chave nos pontos de corte", + "help_text": "Defina os tempos de início e fim para cortar o vídeo.\nDeixe vazio para baixar o vídeo completo.", + "invalid_format": "Formato de tempo inválido. Use o formato HH:MM:SS.", + "start_after_end": "O tempo de início não pode ser após o tempo de fim." + }, + "settings": { + "title": "Configurações de Download", + "download_path": "Caminho de Download", + "browse": "Procurar...", + "speed_limit": "Limite de Velocidade", + "speed_limit_placeholder": "Nenhum", + "auto_update_ytdlp": "Auto-Atualizar yt-dlp", + "enable_auto_updates": "Habilitar atualizações automáticas do yt-dlp", + "update_frequency": "Frequência de atualização:", + "check_startup": "Verificar a cada inicialização (mínimo 1 hora entre verificações)", + "check_daily": "Verificar diariamente", + "check_weekly": "Verificar semanalmente", + "check_updates_now": "Verificar Atualizações Agora", + "update_check_title": "Verificação de Atualização", + "could_not_determine_version": "Não foi possível determinar a versão atual do yt-dlp.", + "update_available_dialog": "Atualização disponível!\n\nAtual: {current}\nÚltima: {latest}\n\nUse o botão 'Atualizar yt-dlp' na janela principal para atualizar.", + "up_to_date_dialog": "yt-dlp está atualizado!\n\nVersão atual: {version}", + "error_checking_updates": "Erro ao verificar atualizações: {error}", + "settings_saved_title": "Configurações Salvas", + "settings_saved_message": "Configurações de auto-atualização foram salvas com sucesso!", + "error_title": "Erro", + "failed_save_settings": "Falha ao salvar configurações de auto-atualização.", + "error_saving_settings": "Erro ao salvar configurações de auto-atualização: {error}", + "auto_update_title": "Configurações de Auto-Atualização", + "auto_update_header": "🔄 Configurações de Auto-Atualização", + "auto_update_description": "Configure atualizações automáticas para o yt-dlp para garantir que você sempre tenha os recursos mais recentes e correções de bugs.", + "current_status": "Status Atual", + "current_version_label": "Versão atual do yt-dlp: Verificando...", + "last_check_label": "Última verificação de atualização: Nunca", + "next_check_label": "Próxima verificação: Baseada nas configurações", + "manual_check_button": "🔍 Verificar Atualizações Agora", + "update_frequency_group": "Frequência de Atualização", + "save_settings": "Salvar Configurações", + "settings_saved_successfully": "✅ Configurações salvas com sucesso!", + "error_saving": "❌ Erro ao salvar configurações: {error}" + }, + "main_ui": { + "url_placeholder": "Digite a URL do vídeo ou playlist do YouTube", + "merge_subtitles": "Mesclar Legendas", + "save_thumbnail": "Salvar Miniatura", + "save_description": "Salvar Descrição", + "embed_chapters": "Incorporar Capítulos", + "subtitles_selected": "{count} selecionadas", + "all_selected": "Todas selecionadas", + "select_videos_all": "Selecionar Vídeos... (Todas selecionadas)", + "please_enter_url": "Por favor, digite uma URL primeiro", + "cookie_file_selected_title": "Arquivo de Cookies Selecionado", + "cookie_file_selected_message": "Arquivo de cookies selecionado: {path}", + "browser_cookies_selected_title": "Cookies do Navegador Selecionados", + "browser_cookies_selected_message": "Os cookies do navegador serão extraídos de: {browser}", + "error_no_format_info": "Erro: Nenhuma informação de formato disponível.", + "error_extract_info": "Erro: Não foi possível extrair informações básicas do vídeo. Verifique seu link.", + "analyzing_preparing": "Analisando (0%)... Preparando solicitação", + "analyzing_extracting_basic": "Analisando (15%)... Extraindo informações básicas", + "analyzing_extracting_detailed": "Analisando (30%)... Extraindo informações detalhadas", + "analyzing_processing_video": "Analisando (45%)... Processando dados do vídeo", + "analyzing_processing_formats": "Analisando (60%)... Processando formatos", + "analyzing_loading_thumbnail": "Analisando (75%)... Carregando miniatura", + "analyzing_processing_subtitles": "Analisando (85%)... Processando legendas", + "analyzing_updating_table": "Analisando (95%)... Atualizando tabela de formatos", + "analysis_complete": "Análise completa!", + "analyzing_extracting_ytdlp": "Analisando (30%)... Extraindo informações com executável yt-dlp", + "analyzing_processing_data": "Analisando (60%)... Processando dados", + "analyzing_processing_formats_ytdlp": "Analisando (75%)... Processando formatos", + "analyzing_loading_thumbnail_ytdlp": "Analisando (85%)... Carregando miniatura", + "analyzing_processing_subtitles_ytdlp": "Analisando (90%)... Processando legendas", + "select_subtitles": "Selecionar Legendas...", + "sponsorblock_categories": "Categorias SponsorBlock..." + }, + "sponsorblock": { + "sponsor": "Patrocinador", + "sponsor_desc": "Promoção paga, referências pagas e anúncios diretos", + "selfpromo": "Promoção Não Paga/Própria", + "selfpromo_desc": "Promoção não paga do próprio conteúdo dos criadores", + "interaction": "Lembrete de Interação", + "interaction_desc": "Pedindo aos espectadores para curtir, se inscrever ou seguir nas redes sociais", + "intro": "Introdução", + "intro_desc": "Introdução do vídeo que pode ser pulada", + "outro": "Encerramento/Cards Finais", + "outro_desc": "Créditos ou quando o vídeo termina", + "preview": "Prévia/Recapitulação", + "preview_desc": "Recapitulação rápida de vídeos anteriores ou prévia do que está por vir", + "music_offtopic": "Seção Não Musical", + "music_offtopic_desc": "Apenas para vídeos musicais. Marca seções não musicais", + "filler": "Tangente de Preenchimento", + "filler_desc": "Cenas tangenciais adicionadas apenas para preenchimento ou humor" + }, + "video_info": { + "channel": "Canal", + "views": "Visualizações", + "likes": "Curtidas", + "upload_date": "Data de upload", + "duration": "Duração", + "unknown_channel": "Canal desconhecido", + "unknown_date": "Data desconhecida", + "unknown_title": "Título desconhecido" + }, + "command": { + "running": "Executando...", + "run_command": "Executar Comando" + }, + "selection": { + "none_selected": "0 selecionadas", + "one_selected": "1 categoria selecionada", + "count_selected": "{count} selecionadas" + }, + "status": { + "ready": "Pronto", + "file_exists": "⚠️ Arquivo já existe", + "cancelling": "Cancelando download..." + } +} \ No newline at end of file diff --git a/src/utils/ytsage_localization.py b/src/utils/ytsage_localization.py index b9d0756..188241d 100644 --- a/src/utils/ytsage_localization.py +++ b/src/utils/ytsage_localization.py @@ -81,7 +81,8 @@ class LocalizationManager: "current_language": "Current language: {language}", "restart_required": "Language changes will take effect after restarting the application.", "english": "English", - "spanish": "Español (Spanish)" + "spanish": "Español (Spanish)", + "portuguese": "Português (Portuguese)" }, "download": { "preparing": "🚀 Preparing your download...",