Add Portuguese localization support

Introduces a new Portuguese translation file (pt.json) and updates the localization manager to recognize Portuguese as a supported language.
This commit is contained in:
Your Name
2025-09-30 21:25:30 +03:00
parent 69507abf32
commit bb8bf033bf
2 changed files with 330 additions and 1 deletions
+328
View File
@@ -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.<br><br>Para a lista completa de opções e exemplos de uso, <a href=\"{docs_url}\">clique aqui para ver a documentação oficial do yt-dlp</a>.<br><br>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..."
}
}
+2 -1
View File
@@ -81,7 +81,8 @@ class LocalizationManager:
"current_language": "Current language: {language}", "current_language": "Current language: {language}",
"restart_required": "Language changes will take effect after restarting the application.", "restart_required": "Language changes will take effect after restarting the application.",
"english": "English", "english": "English",
"spanish": "Español (Spanish)" "spanish": "Español (Spanish)",
"portuguese": "Português (Portuguese)"
}, },
"download": { "download": {
"preparing": "🚀 Preparing your download...", "preparing": "🚀 Preparing your download...",