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...",