diff --git a/web/public/static/langs/pt.json b/web/public/static/langs/pt.json
index 0967ef42..44293249 100644
--- a/web/public/static/langs/pt.json
+++ b/web/public/static/langs/pt.json
@@ -1 +1,191 @@
-{}
+{
+ "action_bar_clear_notifications": "Limpar todas as notificações",
+ "action_bar_send_test_notification": "Enviar notificação de teste",
+ "action_bar_unsubscribe": "Desinscrever",
+ "action_bar_toggle_mute": "Ativa/Desativa notificações",
+ "action_bar_toggle_action_menu": "Abrir/fechar menu de ação",
+ "message_bar_type_message": "Escreva uma mensagem aqui",
+ "message_bar_error_publishing": "Erro ao publicar notificação",
+ "message_bar_publish": "Publicar mensagem",
+ "nav_topics_title": "Tópicos inscritos",
+ "nav_button_all_notifications": "Todas notificações",
+ "nav_button_settings": "Configurações",
+ "nav_button_documentation": "Documentação",
+ "nav_button_publish_message": "Publicar notificação",
+ "nav_button_subscribe": "Inscrever no tópico",
+ "nav_button_muted": "Notificações desativadas",
+ "nav_button_connecting": "Conectando",
+ "alert_grant_title": "Notificações estão desativadas",
+ "alert_grant_description": "Conceder ao navegador permissão para mostrar notificações.",
+ "alert_not_supported_title": "Notificações não são suportadas",
+ "notifications_list": "Lista de notificações",
+ "alert_not_supported_description": "Notificações não são suportadas pelo seu navagador.",
+ "notifications_list_item": "Notificação",
+ "notifications_mark_read": "Marcar como lido",
+ "notifications_delete": "Apagar",
+ "notifications_copied_to_clipboard": "Copiado para a área de transferência",
+ "notifications_tags": "Etiquetas",
+ "notifications_priority_x": "Prioridade {{priority}}",
+ "notifications_new_indicator": "Nova notificação",
+ "notifications_attachment_image": "Imagem anexada",
+ "notifications_attachment_copy_url_title": "Copiar URL do anexo para a área de transferência",
+ "notifications_attachment_copy_url_button": "Copiar URL",
+ "notifications_attachment_open_title": "Ir para {{url}}",
+ "notifications_attachment_link_expired": "a ligação à transferência expirou",
+ "notifications_attachment_open_button": "Abrir anexo",
+ "notifications_attachment_link_expires": "a ligação expira em {{date}}",
+ "notifications_attachment_file_image": "Ficheiro de imagem",
+ "notifications_attachment_file_video": "Ficheiro de vídeo",
+ "notifications_attachment_file_audio": "Ficheiro de áudio",
+ "notifications_attachment_file_app": "Ficheiro apk android",
+ "notifications_attachment_file_document": "Outros documentos",
+ "notifications_click_copy_url_title": "Copiar URL da ligação para a área de transferência",
+ "notifications_click_copy_url_button": "Copiar ligação",
+ "notifications_click_open_button": "Abrir ligação",
+ "notifications_actions_open_url_title": "Ir para {{url}}",
+ "notifications_actions_not_supported": "Ação não suportada na app web",
+ "notifications_actions_http_request_title": "Enviar HTTP {{method}} para {{url}}",
+ "notifications_none_for_topic_title": "Ainda não recebeu nenhuma notificação para esse tópico.",
+ "notifications_none_for_topic_description": "Para enviar notificações para esse tópico, basta usar os métodos PUT ou POST na URL do tópico.",
+ "notifications_none_for_any_title": "Ainda não recebeu nenhuma notificação.",
+ "notifications_none_for_any_description": "Para enviar notificações a um tópico, basta usar os métodos PUT ou POST para o URL do tópico. Aqui um exemplo usando um dos seus tópicos.",
+ "notifications_no_subscriptions_title": "Parece que ainda não tem nenhuma inscrição.",
+ "notifications_no_subscriptions_description": "Clique na ligação \"{{linktext}}\" para criar ou inscrever num tópico. Depois disso, poderá enviar mensagens via PUT ou POST e receberá notificações aqui.",
+ "notifications_example": "Exemplo",
+ "notifications_more_details": "Para mais informações, confira site ou documentação.",
+ "notifications_loading": "Carregando notificações…",
+ "publish_dialog_title_topic": "Publicar em {{topic}}",
+ "publish_dialog_title_no_topic": "Publicar notificação",
+ "publish_dialog_progress_uploading": "Enviando …",
+ "publish_dialog_progress_uploading_detail": "Fazendo upload de {{loaded}}/{{total}} ({{percent}}%)…",
+ "publish_dialog_message_published": "Notificação publicada",
+ "publish_dialog_attachment_limits_file_and_quota_reached": "excede {{fileSizeLimit}} limite de ficheiro e cota, {{remainingBytes}} restante",
+ "publish_dialog_attachment_limits_quota_reached": "excede a cota, {{remainingBytes}} restantes",
+ "publish_dialog_priority_min": "Prioridade mínima",
+ "publish_dialog_priority_low": "Baixa prioridade",
+ "publish_dialog_priority_default": "Prioridade padrão",
+ "publish_dialog_priority_high": "Alta prioridade",
+ "publish_dialog_base_url_label": "URL de serviço",
+ "publish_dialog_base_url_placeholder": "URL de serviço, por exemplo https://example.com",
+ "publish_dialog_topic_label": "Nome do tópico",
+ "publish_dialog_topic_placeholder": "Nome do tópico, por exemplo, phil_alerts",
+ "publish_dialog_topic_reset": "Resetar tópico",
+ "publish_dialog_title_placeholder": "Título da notificação, por exemplo Alerta de espaço em disco",
+ "publish_dialog_message_label": "Mensagem",
+ "publish_dialog_message_placeholder": "Digite uma mensagem aqui",
+ "publish_dialog_tags_label": "Etiquetas",
+ "publish_dialog_tags_placeholder": "Lista de etiquetas, separadas por vírgula, por exemplo: srv1-backup",
+ "publish_dialog_priority_label": "Prioridade",
+ "publish_dialog_click_label": "Clique em URL",
+ "publish_dialog_click_placeholder": "URL que é aberto quando a notificação é clicada",
+ "publish_dialog_click_reset": "Remover URL clicável",
+ "publish_dialog_email_label": "Email",
+ "publish_dialog_filename_placeholder": "Nome do ficheiro anexado",
+ "publish_dialog_email_placeholder": "Email para encaminhar a notificação, por exemplo phil@example.com",
+ "publish_dialog_email_reset": "Remover encaminhar email",
+ "publish_dialog_attach_label": "URL de anexo",
+ "publish_dialog_attach_placeholder": "Anexar ficheiro por URL, por exemplo, https://f-droid.org/F-Droid.apk",
+ "publish_dialog_attach_reset": "Remover URL do anexo",
+ "publish_dialog_filename_label": "Nome do ficheiro",
+ "publish_dialog_delay_label": "Atraso",
+ "publish_dialog_delay_placeholder": "Atraso na entrega, por exemplo {{{unixTimestamp}}, {{relativeTime}}, ou \"{{naturalLanguage}}\" (apenas em inglês)",
+ "publish_dialog_other_features": "Outros recursos:",
+ "publish_dialog_chip_click_label": "Clique em URL",
+ "publish_dialog_chip_topic_label": "Alterar tópico",
+ "publish_dialog_details_examples_description": "Para obter exemplos e uma descrição detalhada de todos os recursos de envio, consulte a documentação.",
+ "publish_dialog_button_cancel_sending": "Cancelar o envio",
+ "publish_dialog_attached_file_filename_placeholder": "Nome do ficheiro anexado",
+ "publish_dialog_attached_file_remove": "Remover ficheiro anexado",
+ "emoji_picker_search_clear": "Limpar",
+ "subscribe_dialog_subscribe_description": "Os tópicos podem não ser protegidos por palavra-passe, então escolha um nome que não seja fácil de adivinhar. Uma vez inscrito, pode PUT/POST notificações.",
+ "subscribe_dialog_subscribe_use_another_label": "Usar outro servidor",
+ "subscribe_dialog_error_user_not_authorized": "Utilizador {{username}} não autorizado",
+ "prefs_notifications_min_priority_description_max": "Mostrar notificações se prioridade for 5 (máxima)",
+ "prefs_notifications_delete_after_one_week": "Após uma semana",
+ "prefs_notifications_delete_after_one_month": "Após um mês",
+ "prefs_notifications_delete_after_never_description": "Notificações nunca serão auto excluídas",
+ "prefs_notifications_delete_after_one_week_description": "Notificações são automaticamente excluídas após uma semana",
+ "prefs_notifications_delete_after_one_month_description": "Notificações são automaticamente excluídas após um mês",
+ "prefs_users_dialog_username_label": "Utilizador, por exemplo phil",
+ "prefs_users_dialog_password_label": "Palavra-passe",
+ "prefs_users_dialog_button_cancel": "Cancelar",
+ "prefs_users_dialog_button_add": "Adicionar",
+ "error_boundary_description": "Isto obviamente não deveria ter acontecido. Lamentamos muito por isto.
Se tiver um minuto, por favor relate isto no GitHub, ou informe-nos através de Discord ou Matrix.",
+ "error_boundary_stack_trace": "Rastreamento de pilha",
+ "error_boundary_gathering_info": "Coletar mais informações …",
+ "error_boundary_unsupported_indexeddb_title": "Navegação anônima não suportada",
+ "error_boundary_unsupported_indexeddb_description": "O ntfy web app precisa do IndexedDB para funcionar e o seu navegador não suporta IndexedDB no modo de navegação privada.
Embora isso seja lamentável, também não faz muito sentido usar o ntfy web app no modo de navegação privada de qualquer maneira, porque tudo é armazenado no armazenamento do navegador. Pode ler mais sobre isso nesta edição do GitHub, ou falar conosco em Discord ou Matrix.",
+ "action_bar_show_menu": "Mostrar menu",
+ "action_bar_logo_alt": "nfty logo",
+ "action_bar_settings": "Configurações",
+ "message_bar_show_dialog": "Mostrar caixa de publicação",
+ "alert_grant_button": "Conceder agora",
+ "publish_dialog_attachment_limits_file_reached": "excede o limite de ficheiro {{fileSizeLimit}}",
+ "publish_dialog_emoji_picker_show": "Escolher emoji",
+ "publish_dialog_priority_max": "Prioridade máxima",
+ "publish_dialog_title_label": "Título",
+ "publish_dialog_delay_reset": "Remover entrega adiada da notificação",
+ "publish_dialog_chip_email_label": "Encaminhar para email",
+ "publish_dialog_chip_attach_url_label": "Anexar ficheiro por URL",
+ "publish_dialog_chip_attach_file_label": "Anexar ficheiro local",
+ "publish_dialog_chip_delay_label": "Atraso na entrega",
+ "publish_dialog_button_cancel": "Cancelar",
+ "publish_dialog_button_send": "Enviar",
+ "publish_dialog_checkbox_publish_another": "Publicar outro",
+ "publish_dialog_attached_file_title": "Ficheiro anexado:",
+ "publish_dialog_drop_file_here": "Solte o ficheiro aqui",
+ "emoji_picker_search_placeholder": "Pesquisar emoji",
+ "subscribe_dialog_subscribe_title": "Inscrever no tópico",
+ "subscribe_dialog_subscribe_topic_placeholder": "Nome do tópico, por exemplo phil_alerts",
+ "subscribe_dialog_subscribe_base_url_label": "URL de subscrição",
+ "subscribe_dialog_subscribe_button_cancel": "Cancelar",
+ "subscribe_dialog_subscribe_button_subscribe": "Inscrever",
+ "subscribe_dialog_login_title": "Login necessário",
+ "subscribe_dialog_login_description": "Esse tópico é protegido por palavra-passe. Por favor digite o nome de utilizador e palavra-passe para inscrever.",
+ "subscribe_dialog_login_username_label": "Nome, por exemplo phil",
+ "subscribe_dialog_login_password_label": "Palavra-passe",
+ "subscribe_dialog_login_button_back": "Voltar",
+ "subscribe_dialog_login_button_login": "Login",
+ "subscribe_dialog_error_user_anonymous": "anônimo",
+ "prefs_notifications_title": "Notificações",
+ "prefs_notifications_sound_title": "Som de notificações",
+ "prefs_notifications_sound_description_none": "Notificações não reproduzem nenhum som quando chegam",
+ "prefs_notifications_sound_description_some": "Notificações reproduzem som {{sound}} quando chegam",
+ "prefs_notifications_sound_no_sound": "Sem som",
+ "prefs_notifications_sound_play": "Reproduzir som selecionado",
+ "prefs_notifications_min_priority_title": "Mínima prioridade",
+ "prefs_notifications_min_priority_description_any": "Mostrando todas as notificações, independente da prioridade",
+ "prefs_notifications_min_priority_description_x_or_higher": "Mostrar notificações se prioridade for {{number}} ({{name}}) ou acima",
+ "prefs_notifications_min_priority_any": "Qualquer prioridade",
+ "prefs_notifications_min_priority_low_and_higher": "Baixa prioridade e acima",
+ "prefs_notifications_min_priority_default_and_higher": "Prioridade padrão e acima",
+ "prefs_notifications_min_priority_high_and_higher": "Alta prioridade e acima",
+ "prefs_notifications_min_priority_max_only": "Apenas prioridade máxima",
+ "prefs_notifications_delete_after_title": "Apagar notificações",
+ "prefs_notifications_delete_after_never": "Nunca",
+ "prefs_notifications_delete_after_three_hours": "Após três horas",
+ "prefs_notifications_delete_after_one_day": "Após um dia",
+ "prefs_notifications_delete_after_three_hours_description": "Notificações são automaticamente excluídas após três horas",
+ "prefs_notifications_delete_after_one_day_description": "Notificações são automaticamente excluídas após um dia",
+ "prefs_users_title": "Gerir utilizadores",
+ "prefs_users_description": "Adicionar/remover utilizadores nos seus tópicos protegidos. Note que o utilizador e palavra-passe são salvos no armazenamento local do navegador.",
+ "prefs_users_table": "Tabela de utilizadores",
+ "prefs_users_add_button": "Adicionar utilizador",
+ "prefs_users_edit_button": "Editar utilizador",
+ "prefs_users_delete_button": "Apagar utilizador",
+ "prefs_users_table_user_header": "Utilizador",
+ "prefs_users_table_base_url_header": "URL de serviço",
+ "prefs_users_dialog_title_add": "Adicionar utilizador",
+ "prefs_users_dialog_title_edit": "Editar utilizador",
+ "prefs_users_dialog_base_url_label": "URL de serviço, exemplo https://ntfy.sh",
+ "prefs_users_dialog_button_save": "Gravar",
+ "prefs_appearance_title": "Aparência",
+ "prefs_appearance_language_title": "LInguagem",
+ "priority_min": "minima",
+ "priority_low": "baixa",
+ "priority_default": "padrão",
+ "priority_high": "alta",
+ "priority_max": "máxima",
+ "error_boundary_title": "Ah não, ntfy parou de funcionar",
+ "error_boundary_button_copy_stack_trace": "Copiar rastreamento de pilha"
+}