diff --git a/jadx-gui/src/main/java/jadx/gui/utils/NLS.java b/jadx-gui/src/main/java/jadx/gui/utils/NLS.java
index 9d91fd105..7432b204e 100644
--- a/jadx-gui/src/main/java/jadx/gui/utils/NLS.java
+++ b/jadx-gui/src/main/java/jadx/gui/utils/NLS.java
@@ -37,6 +37,7 @@ public class NLS {
LANG_LOCALES.add(new LangLocale("es", "ES"));
LANG_LOCALES.add(new LangLocale("de", "DE"));
LANG_LOCALES.add(new LangLocale("ko", "KR"));
+ LANG_LOCALES.add(new LangLocale("pt", "BR"));
LANG_LOCALES.forEach(NLS::load);
diff --git a/jadx-gui/src/main/resources/i18n/Messages_pt_BR.properties b/jadx-gui/src/main/resources/i18n/Messages_pt_BR.properties
new file mode 100644
index 000000000..a577f34db
--- /dev/null
+++ b/jadx-gui/src/main/resources/i18n/Messages_pt_BR.properties
@@ -0,0 +1,311 @@
+language.name=Português
+
+menu.file=Arquivo
+menu.view=Ver
+menu.recent_projects=Projetos recentes
+menu.no_recent_projects=Nenhum projeto recente
+menu.preferences=Preferências
+menu.sync=Sincronizar com editor
+menu.flatten=Mostrar pacotes achatados
+menu.heapUsageBar=Mostrar uso de memória
+menu.alwaysSelectOpened=Sempre selecionar arquivo/classe aberta
+menu.navigation=Navegação
+menu.text_search=Buscar por texto
+menu.class_search=Buscar por classe
+menu.comment_search=Busca por comentário
+menu.tools=Ferramentas
+menu.deobfuscation=Desofuscar
+menu.log=Visualizador de log
+menu.help=Ajuda
+menu.about=Sobre
+menu.update_label=Nova versão %s disponível!
+
+file.open_action=Abrir arquivos...
+file.add_files_action=Adicionar arquivos
+file.open_title=Abrir arquivo
+file.new_project=Novo projeto
+file.save_project=Salvar projeto
+file.save_project_as=Salvar projeto como...
+file.reload=Recarregar arquivos
+file.live_reload=Recarregar em tempo real
+file.live_reload_desc=Recarregar arquivos automaticamente ao serem alterados
+file.export_mappings_as=Exportar mappings como...
+file.save_all=Salvar tudo
+file.export_gradle=Salvar como um projeto gradle
+file.save_all_msg=Selecionar diretório para salvar arquivos descompilados
+file.exit=Sair
+
+tree.sources_title=Código fonte
+tree.resources_title=Recursos
+tree.loading=Carregando...
+
+progress.load=Carregando
+progress.export_mappings=Exportando mappings
+progress.decompile=Descompilando
+progress.canceling=Cancelando
+
+error_dialog.title=Erro
+
+search.previous=Anterior
+search.next=Próximo
+search.mark_all=Marcar todos
+search.regex=Regex
+search.match_case=Match Case
+search.whole_word=Palavra inteira
+search.find=Encontrar
+
+tabs.copy_class_name=Copiar nome
+tabs.close=Fechar
+tabs.closeOthers=Fechar outros
+tabs.closeAll=Fechar todos
+tabs.code=Código
+tabs.smali=Smali
+
+nav.back=Voltar
+nav.forward=Avançar
+
+message.taskTimeout=Tarefa excedeu limite de tempo de %d ms.
+message.userCancelTask=Tarefa foi cancelada pelo usuário.
+message.memoryLow=Jadx está rodando com pouca memória. Por favor reinicie com um limite de memória heap maior.
+message.taskError=Tarefa falhou com erro (cheque o log para detalhes).
+message.errorTitle=Erro
+message.load_errors=Carregamento falhou.\nNúmero de erros: %d\nClique em ok para abrir o visualizador de log.
+message.no_classes=Nenhuma classe carregada, nada para ser descompilado!
+
+message.saveIncomplete=Operação não foi completa.
%s
%d classes ou recursos não foram salvos!
+message.indexIncomplete=Indexação de algumas classes foram ignoradas.
%s
%d classes não foram indexadas não vão aparecer nos resultados de busca!
+message.indexingClassesSkipped=Jadx está rodando com pouca memória. Por conta disso, %d classes não foram indexadas.
Se você deseja que todas classes sejam indexadas, reinicie com um limite de memória heap maior.
+
+heapUsage.text=Uso de memória do JADX: %.2f GB of %.2f GB
+
+common_dialog.ok=Ok
+common_dialog.cancel=Cancelar
+common_dialog.add=Adicionar
+common_dialog.update=Atualizar
+common_dialog.remove=Remover
+
+file_dialog.supported_files=Arquivos suportados
+file_dialog.load_dir_title=Carregar diretório
+file_dialog.load_dir_confirm=Carregar todos arquivos do diretório?
+
+search_dialog.open=Abrir
+search_dialog.cancel=Cancelar
+search_dialog.open_by_name=Buscar por text:
+search_dialog.search_in=Buscar definições de:
+search_dialog.class=Classe
+search_dialog.method=Método
+search_dialog.field=Propriedade
+search_dialog.code=Código
+search_dialog.options=Opções de busca:
+search_dialog.ignorecase=Não diferencia maiúsculas de minúsculas
+search_dialog.load_more=Carregar mais
+search_dialog.load_all=Carregar todas
+search_dialog.results_incomplete=Encontradas %d+
+search_dialog.results_complete=Encontradas %d (complete)
+search_dialog.col_node=Nó
+search_dialog.col_code=Código
+search_dialog.regex=Regex
+search_dialog.active_tab=Apenas abas ativas
+search_dialog.comments=Comentários
+search_dialog.resource=Recursos
+search_dialog.keep_open=Manter aberto
+search_dialog.tip_searching=Buscando
+
+usage_dialog.title=Busca por utilização
+usage_dialog.label=Usado por:
+
+comment_dialog.title.add=Adicionar comentário ao código
+comment_dialog.title.update=Atualizar comentário do código
+comment_dialog.label=Comentário:
+comment_dialog.usage=Use Shift + Enter para pular uma linha
+
+log_viewer.title=Visualizador de log
+log_viewer.log_level=Nível do log:
+
+about_dialog.title=Sobre o JADX
+
+preferences.title=Preferências
+preferences.deobfuscation=Desofuscar
+preferences.appearance=Aparência
+preferences.decompile=Descompilação
+preferences.plugins=Plugins
+preferences.project=Projeto
+preferences.other=Outro
+preferences.language=Idioma
+preferences.lineNumbersMode=Modo do contador de linhas do editor
+preferences.jumpOnDoubleClick=Ativar salto no duplo clique
+preferences.check_for_updates=Verificar por atualizações ao inicializar
+preferences.useDx=Usar dx/d8 para converter bytecode Java
+preferences.decompilationMode=Modo de descompilação
+preferences.codeCacheMode=Modo de cachê do código
+preferences.showInconsistentCode=Mostrar código inconsistent
+preferences.escapeUnicode=Escapar unicode
+preferences.replaceConsts=Substituir constantes
+preferences.respectBytecodeAccessModifiers=Respeitar modificadores de acesso do bytecode
+preferences.useImports=Utilizar declaração de imports
+preferences.useDebugInfo=Utilizar informação de depuração
+preferences.inlineAnonymous=Classes anônimas de uma linha
+preferences.inlineMethods=Métodos de uma linha
+preferences.extractFinally=Extrair blocos finally
+preferences.fsCaseSensitive=Sistema de arquivo diferencia maiúsculas de minúsculas
+preferences.skipResourcesDecode=Não decodificar recursos
+preferences.useKotlinMethodsForVarNames=Usar métodos do kotlin para renomear variáveis
+preferences.commentsLevel=Nível de comentários do código
+preferences.autoSave=Salvar automaticamente
+preferences.threads=Número de threads no processo
+preferences.excludedPackages=Pacotes ignorados
+preferences.excludedPackages.tooltip=Lista espaço de pacotes que não vão ser descompilados ou indexados (economiza RAM)
+preferences.excludedPackages.button=Editar
+preferences.excludedPackages.editDialog=Lista espaço de pacotes que não vão ser descompilados ou indexados (economiza RAM)
ex: android.support
+preferences.cfg=Gera gráficos de métodos CFG no formato de pontos ('dot')
+preferences.raw_cfg=Gera gráficos CFG no formato RAW
+preferences.font=Fonte do editor
+preferences.smali_font=Fonte do editor de smali
+preferences.laf_theme=Tema
+preferences.theme=Tema do editor
+preferences.start_jobs=Inicializar descompilação automaticamente em segundo-plano
+preferences.select_font=Alterar
+preferences.select_smali_font=Alterar
+preferences.deobfuscation_on=Ativar desofuscação
+preferences.deobfuscation_map_file_mode=Modo do arquivo Map
+preferences.deobfuscation_min_len=Tamanho mínimo do nome
+preferences.deobfuscation_max_len=Tamanho máximo do nome
+preferences.deobfuscation_source_alias=Utilizar nome do arquivo como apelido da classe
+preferences.deobfuscation_kotlin_metadata=Parsear metadados do kotlin para nome de classes e pacotes
+preferences.deobfuscation_res_name_source=Melhora nome da fonte dos recursos
+preferences.save=Salvar
+preferences.cancel=Cancelar
+preferences.reset=Redefinir
+preferences.reset_message=Redefinir configurações para o padrão?
+preferences.reset_title=Redefinir configurações
+preferences.copy=Copy to clipboard
+preferences.copy_message=Todas configurações foram copiadas para área de transferência
+preferences.rename=Renomear identificadores
+preferences.rename_case=Corrigir problemas de capitalização (case sensitivity)
+preferences.rename_valid=Deixá-las válidas
+preferences.rename_printable=Deixá-las imprimíveis (printable)
+preferences.search_res_title=Buscar recursos
+preferences.res_file_ext=Extensões de arquivos (ex: .xml|.html), * significa todas
+preferences.res_skip_file=Pular arquivos excedidos
+
+msg.open_file=Abra um arquivo
+msg.saving_sources=Salvando recursos
+msg.language_changed_title=Idioma alterado
+msg.language_changed=Novo idioma será mostrado na próxima inicialização.
+msg.project_error_title=Erro
+msg.project_error=Projeto não pôde ser carregado
+msg.cmd_select_class_error=Falha ao selecionar classe\n%s\nA classe não existe.
+msg.cant_add_comment=Não é possível adicionar comentários aqui
+
+popup.bytecode_col=Mostrar Dalvik Bytecode
+popup.line_wrap=Quebra de linha
+popup.undo=Desfazer
+popup.redo=Refazer
+popup.cut=Cortar
+popup.copy=Copiar
+popup.paste=Colar
+popup.delete=Apagar
+popup.select_all=Selecionar todos
+popup.frida=Copiar como snippet frida
+popup.xposed=Copiar como snippet xposed
+popup.find_usage=Buscar uso
+popup.go_to_declaration=Ir para declaração
+popup.exclude=Ignorar
+popup.exclude_packages=Pacotes ignorados
+popup.add_comment=Comentar
+popup.search_comment=Buscar comentários
+popup.rename=Renomear
+popup.search=Buscar "%s"
+popup.search_global=Busca global "%s"
+
+exclude_dialog.title=Selecionar pacote
+exclude_dialog.ok=OK
+exclude_dialog.select_all=Selecionar tudo
+exclude_dialog.deselect=Remover seleção
+exclude_dialog.invert=Inverter
+
+confirm.save_as_title=Confirmar operação
+confirm.save_as_message=%s Já existe.\nVocê deseja substituir?
+confirm.not_saved_title=Salvar projeto
+confirm.not_saved_message=Salvar projeto atual antes de continuar?
+
+certificate.cert_type=Tipo
+certificate.serialSigVer=Versão
+certificate.serialNumber=Número de série (serial)
+certificate.cert_subject=Remetente
+certificate.serialValidFrom=Válido de
+certificate.serialValidUntil=Válido até
+certificate.serialPubKeyType=Tipo de chave pública
+certificate.serialPubKeyExponent=Expoente
+certificate.serialPubKeyModulus=Módulo
+certificate.serialPubKeyModulusSize=Tamanho do módulo (bits)
+certificate.serialSigType=Tipo de assinatura
+certificate.serialSigOID=Assinatura OID
+certificate.serialMD5=Assinatura digital MD5
+certificate.serialSHA1=Assinatura digital SHA-1
+certificate.serialSHA256=Assinatura digital SHA-256
+certificate.serialPubKeyY=Y
+
+apkSignature.signer=Assinador
+apkSignature.verificationSuccess=Verificação de assinatura bem-sucedida
+apkSignature.verificationFailed=Verificação de assinatura falhou
+apkSignature.signatureSuccess=Assinatura válida de apk v%d encontrada
+apkSignature.signatureFailed=Assinatura inválida de apk v%d encontrada
+apkSignature.errors=Erros
+apkSignature.warnings=Avisos
+apkSignature.exception=Verificação do APK falhou
+apkSignature.unprotectedEntry=Arquivos que não são protegidos pela assinatura v1. Modificações não autorizadas a essas entradas só podem ser detectadas por uma assinatura de versão 2 ou maior.
+
+issues_panel.label=Problemas:
+issues_panel.errors=%d error
+issues_panel.warnings=%d avisos
+issues_panel.tooltip=Abrir no visualizador de log
+
+debugger.process_selector=Selecionar um processo para depurar
+debugger.step_into=Passar para próxima chamada de função (F7)
+debugger.step_over=Passar sobre próxima chamada de função (F8)
+debugger.step_out=Sair da função atual (Shift + F8)
+debugger.run=Executar (F9)
+debugger.stop=Parar depurador e matar o aplicativo
+debugger.pause=Pausar
+debugger.rerun=Reexecutar
+debugger.cfm_dialog_title=Sair enquanto depura
+debugger.cfm_dialog_msg=Você tem certeza de que deseja terminar o depurador?
+
+debugger.popup_set_value=Definir valor
+debugger.popup_change_to_zero=Alterar para 0
+debugger.popup_change_to_one=Alterar para 1
+debugger.popup_copy_value=Copiar valor
+
+set_value_dialog.label_value=Valor
+set_value_dialog.btn_set=Definir Valor
+set_value_dialog.title=Definir Valor
+set_value_dialog.neg_msg=Falha ao definir valor.
+set_value_dialog.sel_type=Selecionar um tipo para definir valor.
+
+adb_dialog.addr=Endereço do ADB
+adb_dialog.port=Porta do ADB
+adb_dialog.path=Caminho do ADB
+adb_dialog.launch_app=Iniciar Aplicativo
+adb_dialog.start_server=Iniciar servidor ADB
+adb_dialog.refresh=Recarregar
+adb_dialog.tip_devices=%d dispositivos
+adb_dialog.device_node=dispositivo
+adb_dialog.missing_path=Caminho do ADB deve ser especificado para iniciar o servidor.
+adb_dialog.waiting=Aguardando para conectar no servidor ADB...
+adb_dialog.connecting=Conectando ao servidor ADB, endereço: %s:%s...
+adb_dialog.connect_okay=Servidor ADB conectado, endereço: %s:%s
+adb_dialog.connect_fail=Falha ao se conectar ao servidor ADB.
+adb_dialog.disconnected=Servidor ADB desconectado.
+adb_dialog.start_okay=Servidor ADB inicializado na porta: %s.
+adb_dialog.start_fail=Falha ao iniciar servidor ADB na porta: %s!
+adb_dialog.forward_fail=Falha ao encaminhar por um motivo não especificado.
+adb_dialog.being_debugged_msg=Esse processo parece estar sendo depurado, deseja continuar?
+adb_dialog.unknown_android_ver=Falha ao obter versão do Android, deseja usar o Android 8 como padrão?
+adb_dialog.being_debugged_title=Está sendo depurado por outro processo.
+adb_dialog.init_dbg_fail=Falha ao iniciar depurador.
+adb_dialog.msg_read_mani_fail=Falha ao decodificar AndroidManifest.xml
+adb_dialog.no_devices=Não foi possível encontrar nenhum dispositivo para iniciar o aplicativo.
+adb_dialog.restart_while_debugging_title=Reiniciar enquanto depura
+adb_dialog.restart_while_debugging_msg=Você está depurando um aplicativo, você tem certeza que deseja reiniciar a sessão?
+adb_dialog.starting_debugger=Iniciando depurador...