diff --git a/CHANGES.rst b/CHANGES.rst index 984fc795c..7bf01e784 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,3 +1,35 @@ +Changes in 0.15.1 (2021-06-21) +================================================= + +✨ Features + * + +🙌 Improvements + * MXRoomSummary: Adapt removal of `lastMessageEvent` property (vector-im/element-ios/issues/4360). + * MXKAttachment: Adapt removal of `mimetype` fields (vector-im/element-ios/issues/4303). + +🐛 Bugfix + * MXKCallViewController: Fix status text of a remotely held call. + * MXKCallViewController: Fix avatar image for outgoing on hold calls. + * MXKRoomViewController: Fix virtual timeline issues. + * MXKEventFormatter: Style blockquotes as blocks, fixing fallback display (#836). + * MXKEventFormatter: Fix display of emote replies (vector-im/element-ios/issues/4081). + +⚠️ API Changes + * Exposed methods for sending audio files and voice messages (vector-im/element-ios/issues/4090). + +🗣 Translations + * + +🧱 Build + * + +Others + * + +Improvements: + * Upgrade MatrixSDK version ([v0.19.1](https://github.com/matrix-org/matrix-ios-sdk/releases/tag/v0.19.1)). + Changes in 0.15.0 (2021-06-02) ================================================= diff --git a/MatrixKit.podspec b/MatrixKit.podspec index e29552cd7..5a7873516 100644 --- a/MatrixKit.podspec +++ b/MatrixKit.podspec @@ -1,7 +1,7 @@ Pod::Spec.new do |s| s.name = "MatrixKit" - s.version = "0.15.0" + s.version = "0.15.1" s.summary = "The Matrix reusable UI library for iOS based on MatrixSDK." s.description = <<-DESC @@ -23,7 +23,7 @@ Pod::Spec.new do |s| s.swift_version = '5.0' - s.dependency 'MatrixSDK', "= 0.19.0" + s.dependency 'MatrixSDK', "= 0.19.1" s.dependency 'HPGrowingTextView', '~> 1.1' s.dependency 'libPhoneNumber-iOS', '~> 0.9.13' s.dependency 'DTCoreText', '~> 1.6.25' diff --git a/MatrixKit/Assets/MatrixKitAssets.bundle/ar.lproj/MatrixKit.strings b/MatrixKit/Assets/MatrixKitAssets.bundle/ar.lproj/MatrixKit.strings index 7c0951ee9..4bd400117 100644 --- a/MatrixKit/Assets/MatrixKitAssets.bundle/ar.lproj/MatrixKit.strings +++ b/MatrixKit/Assets/MatrixKitAssets.bundle/ar.lproj/MatrixKit.strings @@ -544,3 +544,4 @@ "call_video_with_user" = "مُكالَمَةٌ مَرئيَّةٌ مَع %@"; "call_voice_with_user" = "مُكالَمَةٌ صَوتيَّةٌ مَع %@"; "call_ringing" = "الرَّنِينُ جَارٍ…"; +"e2e_passphrase_too_short" = "عِبارَة المُرُور قَصِيرَةٌ جِدًا (يَجِبُ ألَّا يَقِلَّ طُولهَا عَن %d أحرف)"; diff --git a/MatrixKit/Assets/MatrixKitAssets.bundle/bg.lproj/MatrixKit.strings b/MatrixKit/Assets/MatrixKitAssets.bundle/bg.lproj/MatrixKit.strings index 9995226ac..063770700 100644 --- a/MatrixKit/Assets/MatrixKitAssets.bundle/bg.lproj/MatrixKit.strings +++ b/MatrixKit/Assets/MatrixKitAssets.bundle/bg.lproj/MatrixKit.strings @@ -341,7 +341,7 @@ "settings_config_identity_server" = "Сървър за самоличност: %@"; // call string "call_waiting" = "Изчакване..."; -"call_connecting" = "Свързване..."; +"call_connecting" = "Свързване…"; "call_ended" = "Разговорът приключи"; "call_ring" = "Позвъняване..."; "incoming_video_call" = "Входящо видео повикване"; @@ -446,3 +446,21 @@ "notice_room_join_rule_invite" = "%@ направи стаята достъпна само за поканени."; "notice_room_created_for_dm" = "%@ се присъедини."; "notice_room_name_removed_for_dm" = "%@ премахна името"; +"call_transfer_to_user" = "Прехвърли към %@"; +"call_consulting_with_user" = "Консултация с %@"; +"call_video_with_user" = "Видео разговор с %@"; +"call_voice_with_user" = "Гласов разговор с %@"; +"call_more_actions_dialpad" = "Панел за набиране"; +"call_more_actions_transfer" = "Прехвърляне"; +"call_more_actions_audio_use_headset" = "Използвай звук от слушалките"; +"call_more_actions_audio_use_device" = "Използвай звук от устройството"; +"call_more_actions_change_audio_device" = "Смени аудио устройството"; +"call_more_actions_unhold" = "Възобнови"; +"call_more_actions_hold" = "Задръж"; +"call_holded" = "Задържахте разговора"; +"call_remote_holded" = "%@ задържа разговора"; +"call_ringing" = "Звънене…"; +"notice_declined_video_call_by_you" = "Отказахте разговора"; +"notice_declined_video_call" = "%@ отказа разговора"; +"e2e_passphrase_too_short" = "Паролата е прекалено кратка (трябва да е дълга поне %d символа)"; +"resume_call" = "Възобнови"; diff --git a/MatrixKit/Assets/MatrixKitAssets.bundle/de.lproj/MatrixKit.strings b/MatrixKit/Assets/MatrixKitAssets.bundle/de.lproj/MatrixKit.strings index a51d86e6d..bcb58252c 100644 --- a/MatrixKit/Assets/MatrixKitAssets.bundle/de.lproj/MatrixKit.strings +++ b/MatrixKit/Assets/MatrixKitAssets.bundle/de.lproj/MatrixKit.strings @@ -488,3 +488,4 @@ "call_video_with_user" = "Videoanruf mit %@"; "call_voice_with_user" = "Sprachanruf mit %@"; "call_ringing" = "Läuten…"; +"e2e_passphrase_too_short" = "Passphrase zu kurz (Minimum sind %d Zeichen)"; diff --git a/MatrixKit/Assets/MatrixKitAssets.bundle/eo.lproj/MatrixKit.strings b/MatrixKit/Assets/MatrixKitAssets.bundle/eo.lproj/MatrixKit.strings index 3954d7918..42aaf930e 100644 --- a/MatrixKit/Assets/MatrixKitAssets.bundle/eo.lproj/MatrixKit.strings +++ b/MatrixKit/Assets/MatrixKitAssets.bundle/eo.lproj/MatrixKit.strings @@ -220,8 +220,8 @@ "notice_declined_video_call_by_you" = "Vi rifuzis la vokon"; "notice_ended_video_call_by_you" = "Vi finis la vokon"; "notice_answered_video_call_by_you" = "Vi respondis la vokon"; -"notice_placed_video_call_by_you" = "Vi metis vidvokon"; -"notice_placed_voice_call_by_you" = "Vi metis voĉvokon"; +"notice_placed_video_call_by_you" = "Vi ekigis vidvokon"; +"notice_placed_voice_call_by_you" = "Vi ekigis voĉvokon"; "notice_room_name_changed_by_you_for_dm" = "Vi ŝanĝis la nomon al %@."; "notice_room_name_changed_by_you" = "Vi ŝanĝis nomon de la ĉambro al %@."; "notice_topic_changed_by_you" = "Vi ŝanĝis la temon al «%@»."; @@ -251,8 +251,8 @@ "notice_declined_video_call" = "%@ rifuzis la vokon"; "notice_ended_video_call" = "%@ finis la vokon"; "notice_answered_video_call" = "%@ respondis la vokon"; -"notice_placed_video_call" = "%@ metis vidvokon"; -"notice_placed_voice_call" = "%@ metis voĉvokon"; +"notice_placed_video_call" = "%@ ekigis vidvokon"; +"notice_placed_voice_call" = "%@ ekigis voĉvokon"; "notice_room_name_changed_for_dm" = "%@ ŝanĝis la nomon al %@."; "notice_room_name_changed" = "%@ ŝanĝis nomon de la ĉambro al %@."; "notice_topic_changed" = "%@ ŝanĝis la temon al «%@»."; diff --git a/MatrixKit/Assets/MatrixKitAssets.bundle/et.lproj/MatrixKit.strings b/MatrixKit/Assets/MatrixKitAssets.bundle/et.lproj/MatrixKit.strings index 940c9f402..fd1e417d6 100644 --- a/MatrixKit/Assets/MatrixKitAssets.bundle/et.lproj/MatrixKit.strings +++ b/MatrixKit/Assets/MatrixKitAssets.bundle/et.lproj/MatrixKit.strings @@ -461,3 +461,4 @@ "call_video_with_user" = "Videokõne kasutajaga %@"; "call_voice_with_user" = "Häälkõne kasutajaga %@"; "call_ringing" = "Helistan…"; +"e2e_passphrase_too_short" = "Salafraas on liiga lühike (pikkus peaks olema vähemalt %d tähemärki)"; diff --git a/MatrixKit/Assets/MatrixKitAssets.bundle/fr.lproj/MatrixKit.strings b/MatrixKit/Assets/MatrixKitAssets.bundle/fr.lproj/MatrixKit.strings index 63f78013a..d9258532e 100644 --- a/MatrixKit/Assets/MatrixKitAssets.bundle/fr.lproj/MatrixKit.strings +++ b/MatrixKit/Assets/MatrixKitAssets.bundle/fr.lproj/MatrixKit.strings @@ -462,3 +462,4 @@ "call_video_with_user" = "Appel vidéo avec %@"; "call_voice_with_user" = "Appel audio avec %@"; "call_ringing" = "Sonnerie…"; +"e2e_passphrase_too_short" = "La phrase secrète est trop courte, elle doit compter au moins %d caractères"; diff --git a/MatrixKit/Assets/MatrixKitAssets.bundle/hu.lproj/MatrixKit.strings b/MatrixKit/Assets/MatrixKitAssets.bundle/hu.lproj/MatrixKit.strings index 29ec836c5..ed74fe81c 100644 --- a/MatrixKit/Assets/MatrixKitAssets.bundle/hu.lproj/MatrixKit.strings +++ b/MatrixKit/Assets/MatrixKitAssets.bundle/hu.lproj/MatrixKit.strings @@ -462,3 +462,4 @@ "call_video_with_user" = "Videóhívás vele: %@"; "call_voice_with_user" = "Hanghívás vele: %@"; "call_ringing" = "Hívás…"; +"e2e_passphrase_too_short" = "A jelmondat túl rövid (legalább %d karakter hosszúnak kell lennie)"; diff --git a/MatrixKit/Assets/MatrixKitAssets.bundle/it.lproj/MatrixKit.strings b/MatrixKit/Assets/MatrixKitAssets.bundle/it.lproj/MatrixKit.strings index 41b06b59b..1c94215bd 100644 --- a/MatrixKit/Assets/MatrixKitAssets.bundle/it.lproj/MatrixKit.strings +++ b/MatrixKit/Assets/MatrixKitAssets.bundle/it.lproj/MatrixKit.strings @@ -462,3 +462,4 @@ "call_video_with_user" = "Videochiamata con %@"; "call_voice_with_user" = "Telefonata con %@"; "call_ringing" = "Sta squillando…"; +"e2e_passphrase_too_short" = "Password troppo corta (deve avere almeno %d caratteri)"; diff --git a/MatrixKit/Assets/MatrixKitAssets.bundle/nl.lproj/MatrixKit.strings b/MatrixKit/Assets/MatrixKitAssets.bundle/nl.lproj/MatrixKit.strings index 64260cb74..5b22c1609 100644 --- a/MatrixKit/Assets/MatrixKitAssets.bundle/nl.lproj/MatrixKit.strings +++ b/MatrixKit/Assets/MatrixKitAssets.bundle/nl.lproj/MatrixKit.strings @@ -523,3 +523,4 @@ "call_video_with_user" = "Video-oproep met %@"; "call_voice_with_user" = "Spraakoproep met %@"; "call_ringing" = "Bellen…"; +"e2e_passphrase_too_short" = "Wachtwoord is te kort (hij moet minimaal %d tekens lang zijn)"; diff --git a/MatrixKit/Assets/MatrixKitAssets.bundle/pl.lproj/MatrixKit.strings b/MatrixKit/Assets/MatrixKitAssets.bundle/pl.lproj/MatrixKit.strings index 4b8d7ba05..27959cab8 100644 --- a/MatrixKit/Assets/MatrixKitAssets.bundle/pl.lproj/MatrixKit.strings +++ b/MatrixKit/Assets/MatrixKitAssets.bundle/pl.lproj/MatrixKit.strings @@ -488,3 +488,4 @@ "room_event_encryption_info_device_verification" = "Weryfikacja\n"; "room_event_encryption_info_event_none" = "brak"; "room_event_encryption_info_event_unencrypted" = "niezaszyfrowane"; +"e2e_passphrase_too_short" = "Hasło jest zbyt krótkie (Hasło musi składać się z co najmniej %d znaków)"; diff --git a/MatrixKit/Assets/MatrixKitAssets.bundle/pt_BR.lproj/MatrixKit.strings b/MatrixKit/Assets/MatrixKitAssets.bundle/pt_BR.lproj/MatrixKit.strings index 31e50b8a4..524cf7e88 100644 --- a/MatrixKit/Assets/MatrixKitAssets.bundle/pt_BR.lproj/MatrixKit.strings +++ b/MatrixKit/Assets/MatrixKitAssets.bundle/pt_BR.lproj/MatrixKit.strings @@ -1,120 +1,120 @@ "matrix" = "Matrix"; // Login Screen "login_create_account" = "Criar conta:"; -"login_server_url_placeholder" = "URL (por exemplo, https://matrix.org)"; -"login_home_server_title" = "URL de Servidor Local:"; -"login_home_server_info" = "Seu servidor local armazena todas as suas conversas e dados da conta"; +"login_server_url_placeholder" = "URL (e.g. https://matrix.org)"; +"login_home_server_title" = "URL de Servidorcasa:"; +"login_home_server_info" = "Seu servidorcasa armazena todas as suas conversas e dados de conta"; "login_identity_server_title" = "URL de Servidor de Identidade:"; -"login_identity_server_info" = "Matrix fornece servidores de identidade para rastrear quais emails, etc. pertencem a quais IDs Matrix. Somente https://matrix.org existe atualmente."; -"login_user_id_placeholder" = "ID Matrix (por exemplo, @bob:matrix.org ou bob)"; +"login_identity_server_info" = "Matrix provê servidores de identidade para rastrear quais emails, etc. pertencem a quais IDs Matrix. Somente https://matrix.org existe atualmente."; +"login_user_id_placeholder" = "ID Matrix (e.g. @bob:matrix.org ou bob)"; "login_password_placeholder" = "Senha"; "login_optional_field" = "opcional"; -"login_display_name_placeholder" = "Nome de Exibição (por exemplo, Roberto Silva)"; -"login_email_info" = "Fornecer um endereço de e-mail permite que outros usuários possam encontrar você com mais facilidade, e dá a você uma forma de redefinir sua senha no futuro."; -"login_email_placeholder" = "Endereço de e-mail"; -"login_prompt_email_token" = "Por favor, informe o token de validação enviado por e-mail:"; -"login_error_title" = "Erro de login"; -"login_error_no_login_flow" = "Falha ao receber informações de autenticação deste Servidor Local"; -"view" = "Ver"; -"login_error_do_not_support_login_flows" = "Atualmente, não suportamos nenhum dos processos de login definidos por este Servidor Local"; +"login_display_name_placeholder" = "Nome de exibição (e.g. Bob Obson)"; +"login_email_info" = "Especificar um endereço de email permite que outras(os) usuárias(os) encontrem você mais facilmente, e vai dar a você uma forma de resettar sua senha no futuro."; +"login_email_placeholder" = "Endereço de email"; +"login_prompt_email_token" = "Por favor entre seu token de validação de email:"; +"login_error_title" = "Login Falhou"; +"login_error_no_login_flow" = "Nós falhamos para recuperar informação de autenticação deste Servidor de Casa"; +"view" = "Visualizar"; +"login_error_do_not_support_login_flows" = "Atualmente nós não suportamos qualquer ou todos os fluxos de login definidos por este Servidor de Casa"; "back" = "Voltar"; "continue" = "Continuar"; "leave" = "Sair"; "invite" = "Convidar"; -"retry" = "Tentar novamente"; +"retry" = "Retentar"; "cancel" = "Cancelar"; "save" = "Salvar"; -"login_error_registration_is_not_supported" = "Cadastro não é suportado atualmente"; -"login_error_forbidden" = "Nome de usuário e senha inválidos"; -"login_error_unknown_token" = "O Token de acesso especificado nao por reconhecido"; -"login_error_bad_json" = "JSON mal formatado"; -"login_error_not_json" = "Não contem um JSON válido"; -"login_error_limit_exceeded" = "Muitas solicitações foram enviadas"; -"login_error_user_in_use" = "Este nome de usuário já está em uso"; -"login_desktop_device" = "Computador"; +"login_error_registration_is_not_supported" = "Registro não é suportado atualmente"; +"login_error_forbidden" = "Nome de usuária(o)/senha inválidos"; +"login_error_unknown_token" = "O token de acesso especificado não foi reconhecido"; +"login_error_bad_json" = "JSON malformado"; +"login_error_not_json" = "Não continha JSON válido"; +"login_error_limit_exceeded" = "Requisições demais têm sido enviadas"; +"login_error_user_in_use" = "Este nome de usuária(o) já é usado"; +"login_desktop_device" = "Desktop"; // Action "no" = "Não"; "yes" = "Sim"; "abort" = "Abortar"; "close" = "Fechar"; "discard" = "Descartar"; -"dismiss" = "Descartar"; -"sign_up" = "Logar"; -"submit" = "Enviar"; -"submit_code" = "Enviar código"; -"set_default_power_level" = "Resetar nível de permissão"; -"set_moderator" = "Definir Moderador"; -"set_admin" = "Definir Administrador"; -"start_chat" = "Iniciar conversa"; -"start_voice_call" = "Iniciar chamada de voz"; -"start_video_call" = "Iniciar chamada de vídeo"; +"dismiss" = "Dispensar"; +"sign_up" = "Fazer signup"; +"submit" = "Submeter"; +"submit_code" = "Submeter código"; +"set_default_power_level" = "Resettar Nível de Poder"; +"set_moderator" = "Definir Moderador(a)"; +"set_admin" = "Definir Admin"; +"start_chat" = "Começar Chat"; +"start_voice_call" = "Começar Chamada de Voz"; +"start_video_call" = "Começar Chamada de Vídeo"; "mention" = "Mencionar"; -"select_account" = "Selecione uma conta"; -"attach_media" = "Anexar mídia da galeria"; -"capture_media" = "Adicionar Foto/Vídeo"; -"invite_user" = "Convidar usuário Matrix"; -"reset_to_default" = "Restaurar padrão"; +"select_account" = "Selecionar uma conta"; +"attach_media" = "Anexar Mídia desde Biblioteca"; +"capture_media" = "Tirar Foto/Vídeo"; +"invite_user" = "Convidar Usuária(o) matrix"; +"reset_to_default" = "Resettar para default"; "resend_message" = "Reenviar a mensagem"; -"select_all" = "Selecionar tudo"; -"cancel_upload" = "Cancelar o envio"; +"select_all" = "Selecionar Todas"; +"cancel_upload" = "Cancelar Upload"; "cancel_download" = "Cancelar Download"; "show_details" = "Mostrar Detalhes"; -"answer_call" = "Aceitar chamada"; -"reject_call" = "Recusar chamada"; -"end_call" = "Encerrar chamada"; -"ignore" = "Bloquear"; -"unignore" = "Desbloquear"; -"login_error_forgot_password_is_not_supported" = "Esqueci a senha não é suportado atualmente"; -"login_error_login_email_not_yet" = "O link de e-mail que ainda não foi clicado"; -"login_use_fallback" = "Use a página de fallback"; +"answer_call" = "Atender Chamada"; +"reject_call" = "Rejeitar Chamada"; +"end_call" = "Terminar Chamada"; +"ignore" = "Ignorar"; +"unignore" = "Designorar"; +"login_error_forgot_password_is_not_supported" = "Esqueceu senha não é suportada atualmente"; +"login_error_login_email_not_yet" = "O link de email que ainda não tem sido clicado"; +"login_use_fallback" = "Usar página de fallback"; "login_leave_fallback" = "Cancelar"; "login_invalid_param" = "Parâmetro inválido"; -"register_error_title" = "Falha no Registro"; +"register_error_title" = "Registro Falhou"; "login_tablet_device" = "Tablet"; -"login_error_resource_limit_exceeded_title" = "Limite de recursos excedido"; -"login_error_resource_limit_exceeded_message_default" = "Este servidor local ultrapassou um dos seus limites de recursos."; -"login_error_resource_limit_exceeded_message_monthly_active_user" = "Este servidor local atingiu seu limite mensal de usuários ativos."; -"login_error_resource_limit_exceeded_message_contact" = "\n\nEntre em contato com o administrador do serviço para continuar usando este serviço."; -"login_error_resource_limit_exceeded_contact_button" = "Entrar em contato com o Administrador"; +"login_error_resource_limit_exceeded_title" = "Limite de Recursos Excedido"; +"login_error_resource_limit_exceeded_message_default" = "Este servidorcasa tem excedido um de seus limites de recursos."; +"login_error_resource_limit_exceeded_message_monthly_active_user" = "Este servidorcasa tem atingido seu limite de Usuárias(os) Mensalmente Ativos."; +"login_error_resource_limit_exceeded_message_contact" = "\n\nPor favor contacte seu/sua administrador(a) de serviço para continuar usando este serviço."; +"login_error_resource_limit_exceeded_contact_button" = "Contactar Administrador(a)"; // Events formatter -"notice_avatar_changed_too" = "(a foto de perfil também foi alterada)"; +"notice_avatar_changed_too" = "(avatar foi mudado também)"; "notice_room_name_removed" = "%@ removeu o nome da sala"; -"notice_room_topic_removed" = "%@ removeu a descrição"; +"notice_room_topic_removed" = "%@ removeu o tópico"; "notice_event_redacted_by" = " por %@"; -"notice_event_redacted_reason" = " [motivo: %@]"; -"login_mobile_device" = "Móvel"; -"notice_event_redacted" = ""; -"notice_profile_change_redacted" = "%@ atualizou o perfil %@"; +"notice_event_redacted_reason" = " [razão: %@]"; +"login_mobile_device" = "Celular"; +"notice_event_redacted" = ""; +"notice_profile_change_redacted" = "%@ atualizou perfil dela(e) %@"; "notice_room_created" = "%@ criou e configurou a sala."; -"notice_room_join_rule" = "A regra para participar é: %@"; -"notice_room_power_level_intro" = "Os níveis de permissão dos participantes da sala são:"; -"notice_room_power_level_acting_requirement" = "Os níveis mínimos de permissão que um usuário deve ter antes de agir são:"; -"notice_room_power_level_event_requirement" = "Os níveis mínimos de permissão relacionados aos eventos são:"; +"notice_room_join_rule" = "A regra de se juntar é: %@"; +"notice_room_power_level_intro" = "Os níveis de poder de membros da sala são:"; +"notice_room_power_level_acting_requirement" = "Os níveis de poder mínimos que um/a usuária(o) deve ter antes de agir são:"; +"notice_room_power_level_event_requirement" = "Os níveis mínimos de poder relacionados a eventos são:"; "notice_room_aliases" = "Os aliases da sala são: %@"; -"notice_room_related_groups" = "As comunidades associados a esta sala são: %@"; -"notice_encrypted_message" = "Mensagem Criptografada"; -"set_power_level" = "Definir Nível de Permissão"; -"power_level" = "Nível de Permissão"; +"notice_room_related_groups" = "Os grupos associados a esta sala são: %@"; +"notice_encrypted_message" = "Mensagem encriptada"; +"set_power_level" = "Definir Nível de Poder"; +"power_level" = "Nível de Poder"; "notice_encryption_enabled" = "%@ ativou a criptografia de ponta a ponta (algorithm %@)"; "notice_image_attachment" = "anexo de imagem"; "notice_audio_attachment" = "anexo de áudio"; "notice_video_attachment" = "anexo de vídeo"; -"notice_location_attachment" = "anexo de localização"; +"notice_location_attachment" = "anexo de local"; "notice_file_attachment" = "anexo de arquivo"; "notice_invalid_attachment" = "anexo inválido"; -"notice_unsupported_attachment" = "Anexo não suportado: %@"; -"notice_feedback" = "Evento de comentário enviado (id: %@): %@"; +"notice_unsupported_attachment" = "Anexo insuportado: %@"; +"notice_feedback" = "Evento de feedback (id: %@): %@"; "notice_redaction" = "%@ redigiu um evento (id: %@)"; -"notice_error_unsupported_event" = "Evento não suportado"; -"notice_error_unexpected_event" = "Evento não esperado"; +"notice_error_unsupported_event" = "Evento insuportado"; +"notice_error_unexpected_event" = "Evento não-esperado"; "notice_error_unknown_event_type" = "Tipo de evento desconhecido"; -"notice_room_history_visible_to_anyone" = "%@ tornou o futuro histórico da sala visível para qualquer pessoa."; -"notice_room_history_visible_to_members" = "%@ tornou o futuro histórico da sala visível para todos os participantes da sala."; -"notice_room_history_visible_to_members_from_invited_point" = "%@ tornou o futuro histórico da sala visível para todos os participantes, desde o ponto em que foram convidados."; -"notice_room_history_visible_to_members_from_joined_point" = "%@ definiu que mensagens enviadas nesta sala estarão disponíveis para todos os integrantes, a partir do momento em que eles entrarem."; -"notice_crypto_unable_to_decrypt" = "** Não é possível descriptografar: %@ **"; -"notice_crypto_error_unknown_inbound_session_id" = "A sessão do remetente não nos enviou as chaves para esta mensagem."; -"notice_sticker" = "figurinha"; +"notice_room_history_visible_to_anyone" = "%@ fez histórico da sala futuro visível para qualquer pessoa."; +"notice_room_history_visible_to_members" = "%@ fez histórico da sala futuro visível para todos os membros da sala."; +"notice_room_history_visible_to_members_from_invited_point" = "%@ fez histórico da sala futuro visível para todos os membros da sala, do ponto que foram convidados."; +"notice_room_history_visible_to_members_from_joined_point" = "%@ fez histórico da sala futuro visível para todos os membros da sala, do ponto que se juntaram."; +"notice_crypto_unable_to_decrypt" = "** Incapaz de decriptar: %@ **"; +"notice_crypto_error_unknown_inbound_session_id" = "A sessão do/da enviador(a) não nos tem enviado as chaves para esta mensagem."; +"notice_sticker" = "sticker"; "notice_in_reply_to" = "Em resposta a"; // room display name "room_displayname_empty_room" = "Sala vazia"; @@ -122,179 +122,179 @@ "room_displayname_more_than_two_members" = "%@ e %@ outros"; // Settings "settings" = "Configurações"; -"settings_enable_inapp_notifications" = "Ativar notificações no aplicativo"; -"settings_enable_push_notifications" = "Ativar notificações pop-up"; -"settings_enter_validation_token_for" = "Digite o token de validação para %@:"; +"settings_enable_inapp_notifications" = "Ativar notificações Em-App"; +"settings_enable_push_notifications" = "Ativar notificações push"; +"settings_enter_validation_token_for" = "Entrar token de validação para %@:"; "notification_settings_room_rule_title" = "Sala: '%@'"; // Devices -"device_details_title" = "Informação da sessão↵\n"; -"device_details_name" = "Nome público↵\n"; -"device_details_identifier" = "ID↵\n"; -"device_details_last_seen" = "Visto por último às↵\n"; +"device_details_title" = "Informação de sessão\n"; +"device_details_name" = "Nome Público\n"; +"device_details_identifier" = "ID\n"; +"device_details_last_seen" = "Visto por último\n"; "device_details_last_seen_format" = "%@ @ %@\n"; -"device_details_rename_prompt_message" = "O nome público de uma sessão é visível para as pessoas com quem você se comunica"; +"device_details_rename_prompt_message" = "O nome público de uma sessão é visível para pessoas com quem você se comunica"; "device_details_delete_prompt_title" = "Autenticação"; -"device_details_delete_prompt_message" = "Esta operação requer autenticação adicional.\nPara continuar, digite sua senha."; +"device_details_delete_prompt_message" = "Esta operação requer autenticação adicional.\nPara continuar, por favor entre sua senha."; // Encryption information -"room_event_encryption_info_title" = "Informações da criptografia de ponta a ponta\n\n"; -"room_event_encryption_info_event" = "Informação do evento\n"; -"room_event_encryption_info_event_user_id" = "ID do usuário\n"; +"room_event_encryption_info_title" = "Informação de encriptação ponta-a-ponta\n\n"; +"room_event_encryption_info_event" = "Informação de evento\n"; +"room_event_encryption_info_event_user_id" = "ID de usuária(o)\n"; "room_event_encryption_info_event_algorithm" = "Algoritmo\n"; -"room_event_encryption_info_event_session_id" = "ID da sessão\n"; -"room_event_encryption_info_event_unencrypted" = "não criptografado"; +"room_event_encryption_info_event_session_id" = "ID de sessão\n"; +"room_event_encryption_info_event_unencrypted" = "não-encriptado"; "room_event_encryption_info_event_none" = "nenhuma"; -"room_event_encryption_info_device" = "\nInformação da sessão do remetente\n"; -"room_event_encryption_info_device_unknown" = "sessão desconhecida↵\n"; -"room_event_encryption_info_device_name" = "Nome público↵\n"; -"room_event_encryption_info_device_id" = "ID↵\n"; -"room_event_encryption_info_device_verification" = "Confirmação\n"; -"room_event_encryption_info_event_decryption_error" = "Erro de descriptografia\n"; -"room_event_encryption_info_device_verified" = "Confirmado"; -"room_event_encryption_info_device_not_verified" = "Não confirmado"; +"room_event_encryption_info_device" = "\nInformação de sessão de enviador(a)\n"; +"room_event_encryption_info_device_unknown" = "sessão desconhecida\n"; +"room_event_encryption_info_device_name" = "Nome Público\n"; +"room_event_encryption_info_device_id" = "ID\n"; +"room_event_encryption_info_device_verification" = "Verificação\n"; +"room_event_encryption_info_event_decryption_error" = "Erro de decriptação\n"; +"room_event_encryption_info_device_verified" = "Verificado"; +"room_event_encryption_info_device_not_verified" = "NÃO verificado"; "room_event_encryption_info_device_blocked" = "Na lista negra"; -"room_event_encryption_info_verify" = "Confirmar..."; -"room_event_encryption_info_unverify" = "Retirar confirmação"; -"room_event_encryption_info_block" = "Lista negra"; -"room_event_encryption_info_unblock" = "Retirar da lista negra"; -"room_event_encryption_verify_title" = "Confirmar sessão\n\n"; -"room_event_encryption_verify_message" = "Para confirmar essa sessão, comunique-se com seu contato por outros meios (por exemplo: pessoalmente ou com uma chamada de voz) e pergunte se a chave que é vista nas Configurações do Usuário para esta sessão corresponde à seguinte chave:↵\n↵\n→Nome da sessão: %@↵\n→ID da sessão: %@↵\n→Chave da sessão: %@↵\n↵\nSe corresponder, pressione o botão de confirmar abaixo. Caso contrário, outra pessoa está interceptando esta sessão e você provavelmente deseja pressionar o botão para bloquear.↵\n↵\nNo futuro, esse processo de confirmação será mais sofisticado."; -"room_event_encryption_verify_ok" = "Confirmar"; +"room_event_encryption_info_verify" = "Verificar..."; +"room_event_encryption_info_unverify" = "Desverificar"; +"room_event_encryption_info_block" = "Adicionar à lista negra"; +"room_event_encryption_info_unblock" = "Remover da lista negra"; +"room_event_encryption_verify_title" = "Verificar sessão\n\n"; +"room_event_encryption_verify_message" = "Para verificar que esta sessão pode ser confiada, por favor contacte a/o dona(o) dela usando alguma outro meio (e.g. em pessoa ou uma chamada de telefone) e pergunte-lhe se a chave que ela/ele vê em suas Configurações de Usuária(o) para esta sessão bate com a chave abaixo:\n\n\tNome de sessão: %@\n\tID de sessão: %@\n\tChave de sessão: %@\n\nSe ela bate, pressione o botão verificar abaixo. Se não bate, então alguma outra pessoa está interceptando esa sessão e você provavelmente quer pressionar o botão adicionar à lista negra em vez disso.\n\nNo futuro este processo de verificação vai ser mais sofisticado."; +"room_event_encryption_verify_ok" = "Verificar"; // Account -"account_save_changes" = "Salvar alterações"; -"account_link_email" = "Vincular e-mail"; -"account_linked_emails" = "E-mails vinculados"; -"account_email_validation_title" = "Confirmação pendente"; -"account_email_validation_message" = "Por favor, verifique seu e-mail e clique no link que ele contém. Feito isso, clique em continuar."; -"account_email_validation_error" = "Não foi possível confirmar o endereço de e-mail. Por favor, verifique seu e-mail e clique no link que ele contém. Feito isso, clique em continuar"; -"account_msisdn_validation_title" = "Confirmação pendente"; -"account_msisdn_validation_message" = "Enviamos um SMS com um código de ativação. Por favor insira este código abaixo."; -"account_msisdn_validation_error" = "Não foi possível confirmar o número de telefone."; +"account_save_changes" = "Salvar mudanças"; +"account_link_email" = "Linkar Email"; +"account_linked_emails" = "Emails linkados"; +"account_email_validation_title" = "Verificação Pendendo"; +"account_email_validation_message" = "Por favor cheque seu email e clique no link que ele contém. Uma vez que isto seja feito, clique em continuar."; +"account_email_validation_error" = "Incapaz de verificar endereço de email. Por favor cheque seu email e clique no link que ele contém. Uma vez que isto seja feito, clique em continuar"; +"account_msisdn_validation_title" = "Verificação Pendendo"; +"account_msisdn_validation_message" = "Nós temos enviado um SMS com um código de ativação. Por favor entre este código abaixo."; +"account_msisdn_validation_error" = "Incapaz de verificar número de telefone."; "room_event_encryption_info_event_identity_key" = "Chave de identidade Curve25519\n"; -"room_event_encryption_info_event_fingerprint_key" = "Reivindicou a chave de impressão digital Ed25519\n"; +"room_event_encryption_info_event_fingerprint_key" = "Chave de impressão digital Ed25519 clamada\n"; "room_event_encryption_info_device_fingerprint" = "Impressão digital Ed25519\n"; -"account_error_display_name_change_failed" = "Falha ao alterar o nome e sobrenome"; -"account_error_picture_change_failed" = "Falha ao alterar a foto de perfil"; -"account_error_matrix_session_is_not_opened" = "A sessão da Matrix não está aberta"; -"account_error_email_wrong_title" = "Endereço de e-mail inválido"; -"account_error_email_wrong_description" = "Este não parece ser um endereço de e-mail válido"; -"account_error_msisdn_wrong_title" = "Número de telefone inválido"; -"account_error_msisdn_wrong_description" = "Este não parece ser um número de telefone válido"; +"account_error_display_name_change_failed" = "Mudança de nome de exibição falhou"; +"account_error_picture_change_failed" = "Mudança de imagem falhou"; +"account_error_matrix_session_is_not_opened" = "Sessão Matrix não está aberta"; +"account_error_email_wrong_title" = "Endereço de Email Inválido"; +"account_error_email_wrong_description" = "Isto não parece ser um endereço de email válido"; +"account_error_msisdn_wrong_title" = "Número de Telefone Inválido"; +"account_error_msisdn_wrong_description" = "Isto não parece ser um número de telefone válido"; // Room creation -"room_creation_name_title" = "Nome da sala:"; -"room_creation_name_placeholder" = "(por exemplo: grupoAlmoço)"; -"room_creation_alias_title" = "Alias da sala:"; +"room_creation_name_title" = "Nome de sala:"; +"room_creation_name_placeholder" = "(e.g. grupoDeAlmoço)"; +"room_creation_alias_title" = "Alias de sala:"; "room_creation_participants_title" = "Participantes:"; // Room -"room_please_select" = "Por favor. selecione uma sala"; -"room_error_join_failed_title" = "Não foi possível entrar na sala"; -"room_error_join_failed_empty_room" = "Atualmente, não é possível entrar novamente em uma sala vazia."; -"room_error_name_edition_not_authorized" = "Você não tem permissão para editar o nome desta sala"; -"room_error_topic_edition_not_authorized" = "Você não tem permissão para editar a descrição desta sala"; -"room_error_cannot_load_timeline" = "Falha ao carregar a conversa"; -"room_error_timeline_event_not_found_title" = "Falha ao carregar um trecho da conversa"; -"room_error_timeline_event_not_found" = "O aplicativo tentou carregar um trecho específico da conversa nesta sala, mas não conseguiu"; +"room_please_select" = "Por favor selecione uma sala"; +"room_error_join_failed_title" = "Falha para se juntar a sala"; +"room_error_join_failed_empty_room" = "Não é atualmente possível se rejuntar a uma sala vazia."; +"room_error_name_edition_not_authorized" = "Você não está autorizada(o) a editar o nome deste sala"; +"room_error_topic_edition_not_authorized" = "Você não está autorizada(o) a editar o tópico desta sala"; +"room_error_cannot_load_timeline" = "Falha para carregar timeline"; +"room_error_timeline_event_not_found_title" = "Falha para carregar posição de timeline"; +"room_error_timeline_event_not_found" = "O aplicativo estava tentando carregar um ponto específico na timeline desta sala mas foi incapaz de o encontrar"; "room_left" = "Você saiu da sala"; -"room_no_power_to_create_conference_call" = "Você precisa de permissão para convidar, para iniciar uma chamada em grupo nesta sala"; -"room_no_conference_call_in_encrypted_rooms" = "Não há suporte para chamadas em grupo em salas criptografadas"; +"room_no_power_to_create_conference_call" = "Você precisa de permissão para convidar para começar uma conferência nesta sala"; +"room_no_conference_call_in_encrypted_rooms" = "Chamadas de conferência não são suportadas em salas encriptadas"; // Reply to message "message_reply_to_sender_sent_an_image" = "enviou uma imagem."; "message_reply_to_sender_sent_a_video" = "enviou um vídeo."; -"room_creation_alias_placeholder" = "(por exemplo, #foo:example.org)"; -"room_creation_alias_placeholder_with_homeserver" = "(por exemplo, #foo%@)"; -"room_creation_participants_placeholder" = "(por exemplo, @bob:servidorlocal1; @john:servidorlocal2...)"; +"room_creation_alias_placeholder" = "(e.g. #foo:exemplo.org)"; +"room_creation_alias_placeholder_with_homeserver" = "(e.g. #foo%@)"; +"room_creation_participants_placeholder" = "(e.g. @bob:servidorcasa1; @john:servidorcasa2...)"; "message_reply_to_sender_sent_an_audio_file" = "enviou um arquivo de áudio."; "message_reply_to_sender_sent_a_file" = "enviou um arquivo."; "message_reply_to_message_to_reply_to_prefix" = "Em resposta a"; // Room members -"room_member_ignore_prompt" = "Tem certeza de que deseja ocultar todas as mensagens deste usuário?"; -"room_member_power_level_prompt" = "Você não poderá desfazer essa alteração, pois está promovendo que o usuário tenha o mesmo nível de permissão que você.\nVocê tem certeza?"; +"room_member_ignore_prompt" = "Você tem certeza que você quer esconder todas as mensagens desta(e) usuária(o)?"; +"room_member_power_level_prompt" = "Você não vai ser capaz de desfazer esta mudança como você está promovendo a/o usuária(o) para ter o mesmo nível de poder que você mesma(o).\nVocê tem certeza?"; // Attachment "attachment_size_prompt" = "Você quer enviar como:"; -"attachment_original" = "Tamanho real: %@"; +"attachment_original" = "Tamanho de Verdade: %@"; "attachment_small" = "Pequeno: %@"; "attachment_medium" = "Médio: %@"; "attachment_large" = "Grande: %@"; "attachment_cancel_download" = "Cancelar o download?"; -"attachment_cancel_upload" = "Cancelar o envio?"; +"attachment_cancel_upload" = "Cancelar o upload?"; "attachment_multiselection_size_prompt" = "Você quer enviar imagens como:"; -"attachment_multiselection_original" = "Tamanho real"; -"attachment_e2e_keys_file_prompt" = "Este arquivo contém chaves de criptografia exportadas de um cliente Matrix.\nDeseja visualizar o conteúdo do arquivo ou importar as chaves nele contidas?"; +"attachment_multiselection_original" = "Tamanho de Verdade"; +"attachment_e2e_keys_file_prompt" = "Este arquivo contém chaves de encriptação exportadas de um cliente Matrix.\nVocê quer visualizar o conteúdo do arquivo ou importar as chaves que ele contém?"; "attachment_e2e_keys_import" = "Importar..."; // Contacts -"contact_mx_users" = "Usuários da Matrix"; -"contact_local_contacts" = "Contatos locais"; +"contact_mx_users" = "Usuárias(os) Matrix"; +"contact_local_contacts" = "Contatos Locais"; // Groups "group_invite_section" = "Convites"; -"group_section" = "Comunidades"; +"group_section" = "Grupos"; // Search -"search_no_results" = "Nenhum resultado"; -"search_searching" = "Busca em andamento..."; +"search_no_results" = "Nenhum Resultado"; +"search_searching" = "Pesquisa em Progresso..."; // Time "format_time_s" = "s"; "format_time_m" = "m"; "format_time_h" = "h"; "format_time_d" = "d"; // E2E import -"e2e_import_room_keys" = "Importar chaves da sala"; -"e2e_import_prompt" = "Esse processo permite importar chaves de criptografia que você exportou anteriormente de outro cliente Matrix. Você poderá, então, descriptografar todas as mensagens que o outro cliente possa descriptografar.\nO arquivo de exportação é protegido por uma frase secreta. Você deve inserir a frase secreta aqui para descriptografar o arquivo."; +"e2e_import_room_keys" = "Importar chaves de sala"; +"e2e_import_prompt" = "Esse processo permite a você importar chaves de encriptação que você tinha previamente exportado de um outro cliente Matrix. Você vai então ser capaz de descriptar quaisquer mensagens que o outro cliente podia decriptar.\nO arquivo de exportação é protegido com uma frasepasse. Você deveria inserir a frasepasse aqui, para decriptar o arquivo."; "e2e_import" = "Importar"; -"e2e_passphrase_enter" = "Digite a frase secreta"; +"e2e_passphrase_enter" = "Entrar frasepasse"; // E2E export -"e2e_export_room_keys" = "Exportar as chaves da sala"; -"e2e_export_prompt" = "Esse processo permite exportar as chaves das mensagens que você recebeu em salas criptografadas para um arquivo local. Você poderá importar o arquivo para outro cliente Matrix no futuro, para que o cliente também possa descriptografar essas mensagens.\nO arquivo exportado permitirá que qualquer pessoa que possa lê-lo descriptografe qualquer mensagem criptografada que você possa ver, portanto, tenha cuidado para mantê-la protegida."; +"e2e_export_room_keys" = "Exportar chaves de sala"; +"e2e_export_prompt" = "Este processo permite a você exportar as chaves para mensagens que você recebeu em salas encriptadas para um arquivo local. Você vai então ser capaz importar o arquivo para um outro cliente Matrix no futuro, para que o cliente também possa decriptar estas mensagens.\nO arquivo exportado vai permitir a qualquer pessoa que o possa ler decriptar quaisquer mensagens encriptadas que você pode ver, então você deveria ser cuidadosa(o) para mantê-lo protegido."; "e2e_export" = "Exportar"; -"e2e_passphrase_confirm" = "Confirmar frase secreta"; -"e2e_passphrase_empty" = "A frase secreta não pode estar vazia"; -"e2e_passphrase_not_match" = "Frases secretas devem corresponder"; -"e2e_passphrase_create" = "Criar frase secreta"; +"e2e_passphrase_confirm" = "Confirmar frasepasse"; +"e2e_passphrase_empty" = "Frasepasse não deve estar vazia"; +"e2e_passphrase_not_match" = "Frasepasses devem corresponder"; +"e2e_passphrase_create" = "Criar frasepasse"; // Others -"user_id_title" = "ID do usuário:"; +"user_id_title" = "ID de usuária(o):"; "offline" = "offline"; -"unsent" = "Não enviado"; +"unsent" = "Não-enviado"; "error" = "Erro"; -"error_common_message" = "Um erro ocorreu. Por favor, tente novamente mais tarde."; -"not_supported_yet" = "Ainda não suportado"; +"error_common_message" = "Um erro ocorreu. Por favor tente de novo mais tarde."; +"not_supported_yet" = "Não suportado ainda"; "default" = "padrão"; "private" = "Privado"; "public" = "Público"; -"network_error_not_reachable" = "Por favor, verifique sua conexão de rede"; -"user_id_placeholder" = "ex: @bob:servidorlocal"; -"ssl_homeserver_url" = "Endereço do servidor local: %@"; +"network_error_not_reachable" = "Por favor cheque sua conectividade de rede"; +"user_id_placeholder" = "ex: @bob:servidorcasa"; +"ssl_homeserver_url" = "URL de servidorcasa: %@"; // Permissions -"camera_access_not_granted_for_call" = "As chamadas de vídeo requerem acesso à câmera, mas %@ não tem permissão para usá-la"; -"microphone_access_not_granted_for_call" = "As chamadas exigem acesso ao microfone, mas o %@ não tem permissão para usá-lo"; -"local_contacts_access_not_granted" = "A descoberta de usuários de contatos locais requer acesso a seus contatos, mas %@ não tem permissão para usá-los"; -"local_contacts_access_discovery_warning_title" = "Descoberta de usuários"; -"local_contacts_access_discovery_warning" = "Para descobrir contatos que já usam a tecnologia Matrix, %@ pode enviar endereços de e-mail e números de celular do seu catálogo de endereços para o seu servidor de identidade escolhido para usar a tecnologia Matrix. Se for suportado, os dados pessoais serão criptografados antes do envio - consulte a política de privacidade do seu servidor de identidade para obter mais detalhes."; +"camera_access_not_granted_for_call" = "Chamadas de vídeo requerem acesso à Câmera mas %@ não tem permissão para usá-la"; +"microphone_access_not_granted_for_call" = "Chamadas requerem acesso ao Microfone mas %@ não tem permissão para usá-lo"; +"local_contacts_access_not_granted" = "Descoberta de usuárias(os) desde contatos locais requer acesso a seus contatos mas %@ não tem permissão para usá-los"; +"local_contacts_access_discovery_warning_title" = "Descoberta de usuárias(os)"; +"local_contacts_access_discovery_warning" = "Para descobrir contatos já usando Matrix, %@ pode enviar endereços de email e números de telefone em seu livro de endereços para seu servidor de identidade Matrix escolhido. Onde suportado, dados pessoais são hashados antes do envio - por favor cheque a política de privacidade de seu servidor de identidade para mais detalhes."; // Country picker "country_picker_title" = "Escolha um país"; // Language picker -"language_picker_title" = "Escolha um idioma"; -"language_picker_default_language" = "Padrão (%@)"; -"notice_room_invite" = "%@ convidado %@"; -"notice_room_third_party_invite" = "%@ enviou um convite para %@ entrar na sala"; +"language_picker_title" = "Escolha uma língua"; +"language_picker_default_language" = "Default (%@)"; +"notice_room_invite" = "%@ convidou %@"; +"notice_room_third_party_invite" = "%@ enviou um convite para %@ para se juntar à sala"; "notice_room_third_party_registered_invite" = "%@ aceitou o convite para %@"; -"notice_room_join" = "%@ entrou"; +"notice_room_join" = "%@ juntou-se"; "notice_room_leave" = "%@ saiu"; -"notice_room_reject" = "%@ recusou o convite"; -"notice_room_kick" = "%@ removeu %@"; -"notice_room_unban" = "%@ removeu o banimento de %@"; +"notice_room_reject" = "%@ rejeitou o convite"; +"notice_room_kick" = "%@ expulsou %@"; +"notice_room_unban" = "%@ desbaniu %@"; "notice_room_ban" = "%@ baniu %@"; "notice_room_withdraw" = "%@ retirou o convite de %@"; -"notice_room_reason" = ". Motivo: %@"; -"notice_avatar_url_changed" = "%@ alterou a foto de perfil"; -"notice_display_name_set" = "%@ definiu o nome e sobrenome como %@"; -"notice_display_name_changed_from" = "%@ alterou o nome e sobrenome de %@ para %@"; -"notice_display_name_removed" = "%@ removeu o nome e sobrenome"; -"notice_topic_changed" = "%@ alterou a descrição para \"%@\"."; -"notice_room_name_changed" = "%@ alterou o nome da sala para %@."; -"notice_placed_voice_call" = "%@ fez uma chamada de voz"; -"notice_placed_video_call" = "% @ fez uma chamada de vídeo"; -"notice_answered_video_call" = "%@ aceitou a chamada"; -"notice_ended_video_call" = "%@ encerrou a chamada"; -"notice_conference_call_request" = "%@ deseja iniciar uma chamada em grupo"; -"notice_conference_call_started" = "Chamada em grupo iniciada"; -"notice_conference_call_finished" = "Chamada em grupo encerrada"; +"notice_room_reason" = ". Razão: %@"; +"notice_avatar_url_changed" = "%@ mudou o avatar dela(e)"; +"notice_display_name_set" = "%@ definiu o nome de exibição dela(e) para %@"; +"notice_display_name_changed_from" = "%@ mudou o nome de exibição dela(e) de %@ para %@"; +"notice_display_name_removed" = "%@ removeu o nome de exibição dela(e)"; +"notice_topic_changed" = "%@ mudou o tópico para \"%@\"."; +"notice_room_name_changed" = "%@ mudou o nome da sala para %@."; +"notice_placed_voice_call" = "%@ começou uma chamada de voz"; +"notice_placed_video_call" = "%@ começou uma chamada de vídeo"; +"notice_answered_video_call" = "%@ atendeu a chamada"; +"notice_ended_video_call" = "%@ terminou a chamada"; +"notice_conference_call_request" = "%@ requisitou uma conferência de VoIP"; +"notice_conference_call_started" = "Conferência de VoIP começada"; +"notice_conference_call_finished" = "Conferência de VoIP terminada"; // button names "ok" = "OK"; "send" = "Enviar"; @@ -302,161 +302,164 @@ "resend" = "Reenviar"; "redact" = "Remover"; "share" = "Compartilhar"; -"delete" = "Excluir"; +"delete" = "Deletar"; // actions -"action_logout" = "Sair"; -"create_room" = "Criar sala"; -"login" = "Entrar"; -"create_account" = "Criar conta"; -"membership_invite" = "Convidado"; +"action_logout" = "Fazer logout"; +"create_room" = "Criar Sala"; +"login" = "Fazer login"; +"create_account" = "Criar Conta"; +"membership_invite" = "Convidada(o)"; "membership_leave" = "Saiu"; -"membership_ban" = "Banido"; -"num_members_one" = "%@ usuário"; -"num_members_other" = "%@ usuários"; -"kick" = "Remover da sala"; +"membership_ban" = "Banida(o)"; +"num_members_one" = "%@ usuária(o)"; +"num_members_other" = "%@ usuárias(os)"; +"kick" = "Expulsar"; "ban" = "Banir"; -"unban" = "Desbanir"; -"message_unsaved_changes" = "Existem alterações não salvas. Ao sair, elas serão descartadas."; +"unban" = "Des-banir"; +"message_unsaved_changes" = "Existem mudanças não-salvas. Sair vai descartá-las."; // Login Screen -"login_error_already_logged_in" = "já logado"; -"login_error_must_start_http" = "O endereço precisa começar com http[s]://"; +"login_error_already_logged_in" = "Login já feito"; +"login_error_must_start_http" = "URL deve começar com http[s]://"; // room details dialog screen -"room_details_title" = "Detalhes da sala"; +"room_details_title" = "Detalhes de Sala"; // contacts list screen -"invitation_message" = "Eu gostaria de conversar com você com na Matrix. Por favor, visite o site http://matrix.org para obter mais informações."; +"invitation_message" = "Eu gostaria de fazer chat com você com matrix. Por favor, visite o website http://matrix.org para ter mais informação."; // Settings screen "settings_title_config" = "Configuração"; "settings_title_notifications" = "Notificações"; // Notification settings screen "notification_settings_disable_all" = "Desativar todas as notificações"; "notification_settings_enable_notifications" = "Ativar notificações"; -"notification_settings_enable_notifications_warning" = "Todas as notificações estão atualmente desativadas para todos os aparelhos."; -"notification_settings_global_info" = "As configurações de notificação são salvas na sua conta de usuário e são compartilhadas entre todos os clientes que as suportam (incluindo as notificações na área de trabalho).\n\nRegras são aplicadas em ordem; a primeira regra que corresponde define o resultado da mensagem.\nPortanto, as notificações por palavra são mais importantes do que as notificações por sala, que são mais importantes do que as notificações por remetente.\nPara várias regras do mesmo tipo, a primeira na lista que corresponde tem prioridade."; -"notification_settings_per_word_notifications" = "Notificações por palavra"; -"notification_settings_per_word_info" = "As palavras correspondem independente de maiúsculas ou minúsculas e podem incluir um caractere curinga *. Assim:\nfoo corresponde à cadeia de caracteres delimitada por delimitadores de palavras (por exemplo, pontuação e espaço em branco ou início/fim da linha).\nfoo* corresponde a qualquer palavra que começa foo.\n*foo* corresponde a qualquer palavra que inclua as 3 letras foo."; -"notification_settings_always_notify" = "Sempre notifique"; -"notification_settings_never_notify" = "Nunca notifique"; -"notification_settings_word_to_match" = "palavra para combinar"; -"notification_settings_highlight" = "Realçar"; +"notification_settings_enable_notifications_warning" = "Todas as notificações estão atualmente desativadas para todos os dispositivos."; +"notification_settings_global_info" = "Configurações de notificação são salvas em sua conta de usuária(o) e são compartilhadas entre todos os clientes que as suportam (incluindo notificações de desktop).\n\nRegras são aplicadas em ordem; a primeira regra que corresponde define o resultado da mensagem.\nEntão: Notificações per-palavra são mais importantes que notificações per-sala que são mais importantes que notificações per-enviador(a).\nPara múltiplas regras do mesmo tipo, a primeira na lista que corresponde leva prioridade."; +"notification_settings_per_word_notifications" = "Notificações per-palavra"; +"notification_settings_per_word_info" = "Palavras correspondem insensivelmente a maiúsculas e minúsculas, e podem incluir um wildcard *. Então:\nfoo corresponde a string foo rodeado por delimitadores de palavras (e.g., pontuação e whitespace ou início/fim de linha).\nfoo* corresponde a qualquer palavra que começa foo.\n*foo* corresponde a qualquer palavra que inclui as 3 letras foo."; +"notification_settings_always_notify" = "Sempre notificar"; +"notification_settings_never_notify" = "Nunca notificar"; +"notification_settings_word_to_match" = "palavra para corresponder"; +"notification_settings_highlight" = "Destacar"; "notification_settings_custom_sound" = "Som personalizado"; -"notification_settings_per_room_notifications" = "Notificações por sala"; -"notification_settings_per_sender_notifications" = "Notificações por remetente"; -"notification_settings_sender_hint" = "@user:domain.com"; -"notification_settings_select_room" = "Selecione uma sala"; -"notification_settings_other_alerts" = "Outras alertas"; -"notification_settings_contain_my_user_name" = "Notifique-me com som nas mensagens que contenham meu nome de usuário"; -"notification_settings_contain_my_display_name" = "Notifique-me com som nas mensagens que contenham meu nome e sobrenome"; -"notification_settings_just_sent_to_me" = "Notifique-me com som nas mensagens enviadas apenas para mim"; -"notification_settings_invite_to_a_new_room" = "Notifique-me quando eu for convidado para uma nova sala"; -"notification_settings_people_join_leave_rooms" = "Avisar-me quando as pessoas entrarem ou saírem de salas"; -"notification_settings_receive_a_call" = "Notifique-me quando eu receber uma chamada"; -"notification_settings_suppress_from_bots" = "Desativar notificações de bots"; -"notification_settings_by_default" = "Por padrão..."; +"notification_settings_per_room_notifications" = "Notificações per-sala"; +"notification_settings_per_sender_notifications" = "Notificações per-enviador(a)"; +"notification_settings_sender_hint" = "@usuarix:dominio.com"; +"notification_settings_select_room" = "Selecionar uma sala"; +"notification_settings_other_alerts" = "Outros Alertas"; +"notification_settings_contain_my_user_name" = "Notificar-me com som sobre mensagens que contêm meu nome de usuária(o)"; +"notification_settings_contain_my_display_name" = "Notificar-me com som sobre mensagens que contêm meu nome de exibição"; +"notification_settings_just_sent_to_me" = "Notificar-me com som sobre mensagens enviadas apenas para mim"; +"notification_settings_invite_to_a_new_room" = "Notificar-me quando eu sou convidada(o) para uma nova sala"; +"notification_settings_people_join_leave_rooms" = "Notificar-me quando pessoas se juntam ou saem de salas"; +"notification_settings_receive_a_call" = "Notificar-me quando eu recebo uma chamada"; +"notification_settings_suppress_from_bots" = "Suprimir notificações de bots"; +"notification_settings_by_default" = "Por default..."; "notification_settings_notify_all_other" = "Notificar para todas as outras mensagens/salas"; // gcm section -"settings_config_home_server" = "Servidor local: %@"; -"settings_config_identity_server" = "Servidor de Identidade: %@"; -"settings_config_user_id" = "ID do usuário: %@"; +"settings_config_home_server" = "Servidorcasa: %@"; +"settings_config_identity_server" = "Servidor de identidade: %@"; +"settings_config_user_id" = "ID de usuária(o): %@"; // call string "call_waiting" = "Aguardando..."; "call_connecting" = "Conectando…"; -"call_ended" = "Chamada encerrada"; +"call_ended" = "Chamada terminada"; "call_ring" = "Chamando..."; -"incoming_video_call" = "Recebendo chamada de vídeo"; -"incoming_voice_call" = "Recebendo chamada de voz"; -"call_invite_expired" = "Convite para chamada expirado"; +"incoming_video_call" = "Chamada de Vídeo Recebendo"; +"incoming_voice_call" = "Chamada de Voz Recebendo"; +"call_invite_expired" = "Convite de Chamada Expirado"; // unrecognized SSL certificate -"ssl_trust" = "Confiança"; -"ssl_logout_account" = "Sair"; -"ssl_remain_offline" = "Bloquear"; +"ssl_trust" = "Confiar"; +"ssl_logout_account" = "Fazer logout"; +"ssl_remain_offline" = "Ignorar"; "ssl_fingerprint_hash" = "Impressão digital (%@):"; -"ssl_could_not_verify" = "Não foi possível verificar a identidade do servidor remoto."; -"ssl_cert_not_trust" = "Isso pode significar que alguém está interceptando seu tráfego maliciosamente ou que seu telefone não confia no certificado fornecido pelo servidor remoto."; -"ssl_cert_new_account_expl" = "Se o administrador do servidor disse que isso era esperado, verifique se a impressão digital abaixo é a mesma que a impressão digital que ele forneceu a você."; -"ssl_unexpected_existing_expl" = "Você tinha um certificado confiável para o seu telefone, mas ele mudou. Isso é ALTAMENTE INCOMUM. É recomendável que você NÃO ACEITE este novo certificado."; -"ssl_expected_existing_expl" = "O certificado foi alterado de um anteriormente confiável para um que não é confiável. O servidor pode ter renovado seu certificado. Entre em contato com o administrador do servidor para obter a impressão digital esperada."; -"ssl_only_accept" = "APENAS aceite o certificado se o administrador do servidor tiver publicado uma impressão digital que corresponda à acima."; -"notice_encryption_enabled_ok" = "%@ ativou a criptografia de ponta a ponta."; -"notice_encryption_enabled_unknown_algorithm" = "%1$@ ativou a criptografia de ponta a ponta (algoritmo não reconhecido %2$@)."; -"device_details_rename_prompt_title" = "Nome da sessão"; -"account_error_push_not_allowed" = "Notificações não são permitidas"; -"notice_room_third_party_revoked_invite" = "%@ revogou o convite para %@ entrar na sala"; +"ssl_could_not_verify" = "Não foi possível verificar identidade de servidor remoto."; +"ssl_cert_not_trust" = "Isto pode significar que alguém está interceptando maliciosamente seu tráfico, ou que seu telefone não confia no certificado provido pelo servidor remoto."; +"ssl_cert_new_account_expl" = "Se o/a administrador(a) do servidor tem dito que isto é esperado, assegure-se que a impressão digital abaixo bate com a impressão digital provida por ele(a)."; +"ssl_unexpected_existing_expl" = "O certificado tem mudado de um que esta confiado por seu telefone. Isto é ALTAMENTE INCOMUM. É recomendado que você NÃO ACEITE este novo certificado."; +"ssl_expected_existing_expl" = "O certificado tem sido mudado de um previamente confiado para um que não é confiado. O servidor pode ter renovado o certificado dele. Contacte o/a administrador(a) do servidor a impressão digital esperada."; +"ssl_only_accept" = "SOMENTE aceite o certificado se o/a administrador(a) do servidor tem publicado uma impressão digital que corresponde à acima."; +"notice_encryption_enabled_ok" = "%@ ativou encriptação ponta-a-ponta."; +"notice_encryption_enabled_unknown_algorithm" = "%1$@ ativou encriptação ponta-a-ponta (algoritmo não-reconhecido %2$@)."; +"device_details_rename_prompt_title" = "Nome da Sessão"; +"account_error_push_not_allowed" = "Notificações não permitidas"; +"notice_room_third_party_revoked_invite" = "%@ revogou o convite para %@ para se juntar à sala"; // Notice Events with "You" "notice_room_invite_by_you" = "Você convidou %@"; "notice_room_invite_you" = "%@ convidou você"; -"notice_room_third_party_invite_by_you" = "Você enviou um convite para %@ entrar na sala"; +"notice_room_third_party_invite_by_you" = "Você enviou um convite para %@ para se juntar à sala"; "notice_room_third_party_registered_invite_by_you" = "Você aceitou o convite para %@"; -"notice_room_third_party_revoked_invite_by_you" = "Você revogou o convite para %@ entrar na sala"; -"notice_room_join_by_you" = "Você entrou"; +"notice_room_third_party_revoked_invite_by_you" = "Você revogou o convite para que %@ se junte à sala"; +"notice_room_join_by_you" = "Você juntou-se"; "notice_room_leave_by_you" = "Você saiu"; -"notice_room_reject_by_you" = "Você recusou o convite"; -"notice_room_kick_by_you" = "Você removeu %@"; -"notice_room_unban_by_you" = "Você removeu o banimento de %@"; +"notice_room_reject_by_you" = "Você rejeitou o convite"; +"notice_room_kick_by_you" = "Você expulsou %@"; +"notice_room_unban_by_you" = "Você desbaniu %@"; "notice_room_ban_by_you" = "Você baniu %@"; "notice_room_withdraw_by_you" = "Você retirou o convite de %@"; -"notice_avatar_url_changed_by_you" = "Você alterou a sua foto de perfil"; -"notice_display_name_set_by_you" = "Você definiu o seu nome e sobrenome como %@"; -"notice_display_name_changed_from_by_you" = "Você alterou o seu nome e sobrenome de %@ para %@"; -"notice_display_name_removed_by_you" = "Você removeu o seu nome e sobrenome"; -"notice_topic_changed_by_you" = "Você alterou a descrição para \"%@\"."; -"notice_room_name_changed_by_you" = "Você alterou o nome da sala para %@."; -"notice_placed_voice_call_by_you" = "Você fez uma chamada de voz"; -"notice_placed_video_call_by_you" = "Você fez uma chamada de vídeo"; -"notice_answered_video_call_by_you" = "Você aceitou a chamada"; -"notice_ended_video_call_by_you" = "Você encerrou a chamada"; -"notice_conference_call_request_by_you" = "Você solicitou uma chamada em grupo"; +"notice_avatar_url_changed_by_you" = "Você mudou seu avatar"; +"notice_display_name_set_by_you" = "Você definiu seu nome de exibição para %@"; +"notice_display_name_changed_from_by_you" = "Você mudou seu nome de exibição de %@ para %@"; +"notice_display_name_removed_by_you" = "Você removeu seu nome de exibição"; +"notice_topic_changed_by_you" = "Você mudou o tópico para \"%@\"."; +"notice_room_name_changed_by_you" = "Você mudou o nome da sala para %@."; +"notice_placed_voice_call_by_you" = "Você começou uma chamada de voz"; +"notice_placed_video_call_by_you" = "Você começou uma chamada de vídeo"; +"notice_answered_video_call_by_you" = "Você atendeu a chamada"; +"notice_ended_video_call_by_you" = "Você terminou a chamada"; +"notice_conference_call_request_by_you" = "Você requisitou uma conferência de VoIP"; "notice_room_name_removed_by_you" = "Você removeu o nome da sala"; -"notice_room_topic_removed_by_you" = "Você removeu a descrição"; -"notice_event_redacted_by_you" = " ·por você"; +"notice_room_topic_removed_by_you" = "Você removeu o tópico"; +"notice_event_redacted_by_you" = " por você"; "notice_profile_change_redacted_by_you" = "Você atualizou seu perfil %@"; "notice_room_created_by_you" = "Você criou e configurou a sala."; -"notice_encryption_enabled_ok_by_you" = "Você ativou a criptografia de ponta a ponta."; -"notice_encryption_enabled_unknown_algorithm_by_you" = "Você ativou a criptografia de ponta a ponta (algoritmo não reconhecido %@)."; -"notice_redaction_by_you" = "Você editou um evento (id: %@)"; -"notice_room_history_visible_to_anyone_by_you" = "Você tornou o histórico da sala visível para qualquer pessoa no futuro."; -"notice_room_history_visible_to_members_by_you" = "Você tornou o histórico da sala visível para todos os participantes da sala no futuro."; -"notice_room_history_visible_to_members_from_invited_point_by_you" = "Você tornou o histórico da sala visível a todos os participantes da sala no futuro, a partir do momento em que são convidados."; -"notice_room_history_visible_to_members_from_joined_point_by_you" = "Você tornou o histórico da sala visível a todos os participantes no futuro, a partir do momento em que ingressaram."; +"notice_encryption_enabled_ok_by_you" = "Você ativou encriptação ponta-a-ponta."; +"notice_encryption_enabled_unknown_algorithm_by_you" = "Você ativou a encriptação ponta-a-ponta (algoritmo irreconhecido %@)."; +"notice_redaction_by_you" = "Você redigiu um evento (id: %@)"; +"notice_room_history_visible_to_anyone_by_you" = "Você fez histórico da sala futuro visível para qualquer pessoa."; +"notice_room_history_visible_to_members_by_you" = "Você fez histórico da sala futuro visível para todos os membros da sala."; +"notice_room_history_visible_to_members_from_invited_point_by_you" = "Você fez histórico de sala futuro visível para todos os membros da sala, do ponto que são convidados."; +"notice_room_history_visible_to_members_from_joined_point_by_you" = "Você fez histórico da sala futuro visível para todos os membros da sala, do momento que se juntaram."; "notice_room_name_removed_for_dm" = "%@ removeu o nome"; -"notice_room_created_for_dm" = "%@ entrou."; +"notice_room_created_for_dm" = "%@ juntou-se."; // New -"notice_room_join_rule_invite" = "%@ definiu que a sala só receberá integrantes por convite."; -"notice_room_join_rule_invite_for_dm" = "%@ definiu que esta sala só receberá integrantes por convite."; -"notice_room_join_rule_invite_by_you" = "Você definiu que esta sala só receberá integrantes por convite."; -"notice_room_join_rule_invite_by_you_for_dm" = "Você definiu que esta sala só receberá integrantes por convite."; -"notice_room_join_rule_public" = "%@ definiu que a sala é pública."; -"notice_room_join_rule_public_for_dm" = "%@ definiu que a sala é pública."; -"notice_room_join_rule_public_by_you" = "Você definiu que esta sala é pública."; -"notice_room_join_rule_public_by_you_for_dm" = "Você definiu que esta sala é pública."; -"notice_room_power_level_intro_for_dm" = "As permissões dos integrantes são:"; -"notice_room_aliases_for_dm" = "Os nomes são: %@"; -"notice_room_history_visible_to_members_for_dm" = "%@ definiu que mensagens enviadas a partir do presente momento estarão disponíveis para todos os integrantes da sala."; -"notice_room_history_visible_to_members_from_invited_point_for_dm" = "%@ definiu que mensagens enviadas a partir do presente momento estarão disponíveis para todos os integrantes desta sala, a partir do momento em que eles foram convidados a entrar na sala."; -"notice_room_history_visible_to_members_from_joined_point_for_dm" = "%@ definiu que mensagens enviadas a partir do presente momento estarão disponíveis para todos os integrantes desta sala, a partir do momento em que eles entrarem na sala."; +"notice_room_join_rule_invite" = "%@ fez a sala somente convite."; +"notice_room_join_rule_invite_for_dm" = "%@ fez isto somente convite."; +"notice_room_join_rule_invite_by_you" = "Você fez a sala somente convite."; +"notice_room_join_rule_invite_by_you_for_dm" = "Você fez isto somente convite."; +"notice_room_join_rule_public" = "%@ fez a sala pública."; +"notice_room_join_rule_public_for_dm" = "%@ fez isto público."; +"notice_room_join_rule_public_by_you" = "Você fez a sala pública."; +"notice_room_join_rule_public_by_you_for_dm" = "Você fez isto público."; +"notice_room_power_level_intro_for_dm" = "Os níveis de poder de membros são:"; +"notice_room_aliases_for_dm" = "Os aliases são: %@"; +"notice_room_history_visible_to_members_for_dm" = "%@ fez mensagens futuras visíveis para todos os membros da sala."; +"notice_room_history_visible_to_members_from_invited_point_for_dm" = "%@ fez mensagens futuras visíveis para todas as pessoas, do ponto que são convidadas."; +"notice_room_history_visible_to_members_from_joined_point_for_dm" = "%@ fez mensagens futuras visíveis para todas as pessoas, do ponto que se juntaram."; "room_left_for_dm" = "Você saiu"; "notice_room_third_party_invite_for_dm" = "%@ convidou %@"; -"notice_room_third_party_revoked_invite_for_dm" = "%@ cancelou o convite para %@"; -"notice_room_name_changed_for_dm" = "%@ alterou o nome da sala para %@."; +"notice_room_third_party_revoked_invite_for_dm" = "%@ revogou o convite de %@"; +"notice_room_name_changed_for_dm" = "%@ mudou o nome para %@."; "notice_room_third_party_invite_by_you_for_dm" = "Você convidou %@"; -"notice_room_third_party_revoked_invite_by_you_for_dm" = "Você cancelou o convite para %@"; -"notice_room_name_changed_by_you_for_dm" = "Você alterou o nome da sala para %@."; -"notice_room_name_removed_by_you_for_dm" = "Você removeu o nome da sala"; -"notice_room_created_by_you_for_dm" = "Você entrou."; -"notice_room_history_visible_to_members_by_you_for_dm" = "Você definiu que mensagens enviadas a partir do presente momento estarão disponíveis para todos os integrantes da sala."; -"notice_room_history_visible_to_members_from_invited_point_by_you_for_dm" = "Você definiu que mensagens enviadas a partir do presente momento estarão disponíveis para todos os integrantes desta sala, a partir do momento em que eles foram convidados a entrar na sala."; -"notice_room_history_visible_to_members_from_joined_point_by_you_for_dm" = "Você definiu que mensagens enviadas a partir do presente momento estarão disponíveis para todos os integrantes desta sala, a partir do momento em que eles entrarem na sala."; -"call_more_actions_dialpad" = "Teclado de discagem"; +"notice_room_third_party_revoked_invite_by_you_for_dm" = "Você revogou o convite de %@"; +"notice_room_name_changed_by_you_for_dm" = "Você mudou o nome para %@."; +"notice_room_name_removed_by_you_for_dm" = "Você removeu o nome"; +"notice_room_created_by_you_for_dm" = "Você juntou-se."; +"notice_room_history_visible_to_members_by_you_for_dm" = "Você fez mensagens futuras visíveis para todos os membros da sala."; +"notice_room_history_visible_to_members_from_invited_point_by_you_for_dm" = "Você fez mensagens futuras visíveis para todas as pessoas, do ponto que são convidadas."; +"notice_room_history_visible_to_members_from_joined_point_by_you_for_dm" = "Você fez mensagens futuras visíveis para todas as pessoas, do ponto que se juntaram."; +"call_more_actions_dialpad" = "Pad de disco"; "call_more_actions_unhold" = "Retomar"; -"call_more_actions_hold" = "Pausar"; -"call_holded" = "Você pausou a chamada"; -"call_remote_holded" = "%@ pausou a chamada"; -"notice_declined_video_call_by_you" = "Você recusou a chamada"; -"notice_declined_video_call" = "%@ recusou a chamada"; +"call_more_actions_hold" = "Pôr em espera"; +"call_holded" = "Você pôs a chamada em espera"; +"call_remote_holded" = "%@ pôs a chamada em espera"; +"notice_declined_video_call_by_you" = "Você declinou a chamada"; +"notice_declined_video_call" = "%@ declinou a chamada"; "resume_call" = "Retomar"; "call_more_actions_transfer" = "Transferir"; -"call_more_actions_audio_use_device" = "Usar caixa de som"; -"call_more_actions_audio_use_headset" = "Usar fone de ouvido"; -"call_more_actions_change_audio_device" = "Mudar o dispositivo de áudio"; +"call_more_actions_audio_use_device" = "Usar Áudio de Dispositivo"; +"call_more_actions_audio_use_headset" = "Usar Áudio de Auscultador"; +"call_more_actions_change_audio_device" = "Mudar Dispositivo de Áudio"; "call_video_with_user" = "Chamada de vídeo com %@"; "call_voice_with_user" = "Chamada de voz com %@"; "call_ringing" = "Tocando…"; +"call_transfer_to_user" = "Transferir para %@"; +"call_consulting_with_user" = "Consultando com %@"; +"e2e_passphrase_too_short" = "Frasepasse curta demais (Ela deve ser a um mínimo %d caracteres em comprimento)"; diff --git a/MatrixKit/Assets/MatrixKitAssets.bundle/sq.lproj/MatrixKit.strings b/MatrixKit/Assets/MatrixKitAssets.bundle/sq.lproj/MatrixKit.strings index 5d42d6e31..01a8c6833 100644 --- a/MatrixKit/Assets/MatrixKitAssets.bundle/sq.lproj/MatrixKit.strings +++ b/MatrixKit/Assets/MatrixKitAssets.bundle/sq.lproj/MatrixKit.strings @@ -462,3 +462,4 @@ "call_video_with_user" = "Thirrje me video me %@"; "call_voice_with_user" = "Thirrje me zë me %@"; "call_ringing" = "Po i bihet ziles…"; +"e2e_passphrase_too_short" = "Frazëkalim shumë i shkurtër (Duhet të jetë e pakta %d shenja i gjatë)"; diff --git a/MatrixKit/Assets/MatrixKitAssets.bundle/sv.lproj/MatrixKit.strings b/MatrixKit/Assets/MatrixKitAssets.bundle/sv.lproj/MatrixKit.strings index a9e532493..4f9aa7265 100644 --- a/MatrixKit/Assets/MatrixKitAssets.bundle/sv.lproj/MatrixKit.strings +++ b/MatrixKit/Assets/MatrixKitAssets.bundle/sv.lproj/MatrixKit.strings @@ -461,3 +461,4 @@ "call_video_with_user" = "Videosamtal med %@"; "call_voice_with_user" = "Röstsamtal med %@"; "call_ringing" = "Ringer…"; +"e2e_passphrase_too_short" = "Lösenfras för kort (den måste vara minst %d tecken långt)"; diff --git a/MatrixKit/Assets/MatrixKitAssets.bundle/uk.lproj/MatrixKit.strings b/MatrixKit/Assets/MatrixKitAssets.bundle/uk.lproj/MatrixKit.strings index 10fe4ca47..5499d75df 100644 --- a/MatrixKit/Assets/MatrixKitAssets.bundle/uk.lproj/MatrixKit.strings +++ b/MatrixKit/Assets/MatrixKitAssets.bundle/uk.lproj/MatrixKit.strings @@ -98,3 +98,26 @@ "login_identity_server_title" = "URL-адреса сервера ідентифікації:"; "login_home_server_info" = "Ваш домашній сервер зберігає всі ваші розмови та дані облікового запису"; "login_home_server_title" = "URL-адреса домашнього сервера:"; +"notice_room_power_level_intro_for_dm" = "Рівні доступу учасників:"; +"notice_room_power_level_intro" = "Рівні доступу учасників кімнати:"; +"notice_room_join_rule_public_by_you_for_dm" = "Ви дозволяєте доступ всім."; +"notice_room_join_rule_public_by_you" = "Ви дозволяєте доступ до кімнати всім."; +"notice_room_join_rule_public_for_dm" = "%@ дозволяє доступ всім."; +"notice_room_join_rule_public" = "%@ дозволяє доступ до кімнати всім."; +"notice_room_join_rule_invite_by_you_for_dm" = "Ви забороняєте доступ всім, окрім запрошених."; +"notice_room_join_rule_invite_by_you" = "Ви забороняєте доступ до кімнати всім, окрім запрошених."; +// New +"notice_room_join_rule_invite" = "%@ забороняє доступ до кімнати всім, окрім запрошених."; +"notice_room_join_rule_invite_for_dm" = "%@ забороняє доступ всім, окрім запрошених."; +// Old +"notice_room_join_rule" = "Правило приєднання: %@"; +"notice_room_created_for_dm" = "%@ приєднується."; +"notice_room_created" = "%@ створює і налаштовує кімнату."; +"notice_profile_change_redacted" = "%@ оновлює свій профіль %@"; +"notice_event_redacted_reason" = " [причина: %@]"; +"notice_event_redacted_by" = " від %@"; +"notice_event_redacted" = "<змінено%@>"; +"notice_room_topic_removed" = "%@ вилучає тему"; +"notice_room_name_removed_for_dm" = "%@ вилучає назву"; +"notice_room_name_removed" = "%@ вилучає назву кімнати"; +"login_error_do_not_support_login_flows" = "Наразі ми не підтримуємо один або кілька потоків авторизації, визначених цим домашнім сервером"; diff --git a/MatrixKit/Assets/MatrixKitAssets.bundle/zh_Hans.lproj/MatrixKit.strings b/MatrixKit/Assets/MatrixKitAssets.bundle/zh_Hans.lproj/MatrixKit.strings index e72e26a14..c47761f54 100644 --- a/MatrixKit/Assets/MatrixKitAssets.bundle/zh_Hans.lproj/MatrixKit.strings +++ b/MatrixKit/Assets/MatrixKitAssets.bundle/zh_Hans.lproj/MatrixKit.strings @@ -463,3 +463,4 @@ "call_consulting_with_user" = "与 %@ 商量"; "call_video_with_user" = "与 %@ 进行视频通话"; "call_voice_with_user" = "与 %@ 进行语音通话"; +"e2e_passphrase_too_short" = "密码口令太短 (长度至少为 %d 个字符)"; diff --git a/MatrixKit/Controllers/MXKCallViewController.m b/MatrixKit/Controllers/MXKCallViewController.m index ee3b0dbfa..426cc42f0 100644 --- a/MatrixKit/Controllers/MXKCallViewController.m +++ b/MatrixKit/Controllers/MXKCallViewController.m @@ -58,6 +58,9 @@ @interface MXKCallViewController () // Current alert (if any). UIAlertController *currentAlert; + + // Current peer display name + NSString *peerDisplayName; } @property (nonatomic, assign) Boolean isRinging; @@ -397,9 +400,36 @@ - (void)setMxCallOnHold:(MXCall *)callOnHold if (mxCallOnHold) { self.onHoldCallContainerView.hidden = NO; - self.peerOnHold = [callOnHold.room.mxSession getOrCreateUser:callOnHold.callerId]; [self.onHoldCallContainerView addGestureRecognizer:self.onHoldCallContainerTapRecognizer]; [self.onHoldCallContainerView setUserInteractionEnabled:YES]; + + // Handle peer here + if (mxCallOnHold.isIncoming) + { + self.peerOnHold = [mxCallOnHold.room.mxSession getOrCreateUser:mxCallOnHold.callerId]; + } + else + { + // For 1:1 call, find the other peer + // Else, the room information will be used to display information about the call + MXWeakify(self); + [mxCallOnHold.room state:^(MXRoomState *roomState) { + MXStrongifyAndReturnIfNil(self); + + MXUser *theMember = nil; + NSArray *members = roomState.members.joinedMembers; + for (MXUser *member in members) + { + if (![member.userId isEqualToString:self->mxCallOnHold.callerId]) + { + theMember = member; + break; + } + } + + self.peerOnHold = theMember; + }]; + } } else { @@ -455,7 +485,6 @@ - (void)setPeerOnHold:(MXUser *)peerOnHold - (void)updatePeerInfoDisplay { - NSString *peerDisplayName; NSString *peerAvatarURL; if (_peer) @@ -965,7 +994,7 @@ - (void)call:(MXCall *)call stateDidChange:(MXCallState)state reason:(MXEvent *) speakerButton.enabled = NO; cameraSwitchButton.enabled = NO; _moreButton.enabled = NO; - callStatusLabel.text = [NSString stringWithFormat:[NSBundle mxk_localizedStringForKey:@"call_remote_holded"], callerNameLabel.text]; + callStatusLabel.text = [NSString stringWithFormat:[NSBundle mxk_localizedStringForKey:@"call_remote_holded"], peerDisplayName]; break; case MXCallStateInviteExpired: @@ -1067,7 +1096,6 @@ - (void)callAssertedIdentityDidChange:(MXCall *)call if (assertedIdentity) { // update caller display name and avatar with the asserted identity - NSString *peerDisplayName; NSString *peerAvatarURL = assertedIdentity.avatarUrl; if (assertedIdentity.displayname) diff --git a/MatrixKit/Controllers/MXKRoomViewController.m b/MatrixKit/Controllers/MXKRoomViewController.m index 8b6b6b596..bbc7b4976 100644 --- a/MatrixKit/Controllers/MXKRoomViewController.m +++ b/MatrixKit/Controllers/MXKRoomViewController.m @@ -1770,8 +1770,8 @@ - (BOOL)isBubblesTableScrollViewAtTheBottom return (isScrolledToBottom || isScrollingToBottom); } - // Here the table view is not ready - return NO; + // Consider empty table view as at the bottom + return YES; } - (void)scrollBubblesTableViewToBottomAnimated:(BOOL)animated diff --git a/MatrixKit/MatrixKitVersion.m b/MatrixKit/MatrixKitVersion.m index fe6bc50bc..50f6cc6dd 100644 --- a/MatrixKit/MatrixKitVersion.m +++ b/MatrixKit/MatrixKitVersion.m @@ -16,4 +16,4 @@ #import -NSString *const MatrixKitVersion = @"0.15.0"; +NSString *const MatrixKitVersion = @"0.15.1"; diff --git a/MatrixKit/Models/Account/MXKAccount.m b/MatrixKit/Models/Account/MXKAccount.m index 8b4b3846d..211dc8988 100644 --- a/MatrixKit/Models/Account/MXKAccount.m +++ b/MatrixKit/Models/Account/MXKAccount.m @@ -1758,20 +1758,43 @@ - (void)onDateTimeFormatUpdate // Update the date and time formatters [eventFormatter initDateTimeFormatters]; - for (MXRoomSummary *summary in mxSession.roomsSummaries) - { - summary.lastMessageOthers[@"lastEventDate"] = [eventFormatter dateStringFromEvent:summary.lastMessageEvent withTime:YES]; - [mxSession.store storeSummaryForRoom:summary.roomId summary:summary]; - } + dispatch_group_t dispatchGroup = dispatch_group_create(); - // Commit store changes done - if ([mxSession.store respondsToSelector:@selector(commit)]) + for (MXRoomSummary *summary in mxSession.roomsSummaries) { - [mxSession.store commit]; + dispatch_group_enter(dispatchGroup); + [summary.mxSession eventWithEventId:summary.lastMessage.eventId + inRoom:summary.roomId + success:^(MXEvent *event) { + + if (event) + { + if (summary.lastMessage.others == nil) + { + summary.lastMessage.others = [NSMutableDictionary dictionary]; + } + summary.lastMessage.others[@"lastEventDate"] = [eventFormatter dateStringFromEvent:event withTime:YES]; + [self->mxSession.store storeSummaryForRoom:summary.roomId summary:summary]; + } + + dispatch_group_leave(dispatchGroup); + } failure:^(NSError *error) { + dispatch_group_leave(dispatchGroup); + }]; } - // Broadcast the change which concerns all the room summaries. - [[NSNotificationCenter defaultCenter] postNotificationName:kMXRoomSummaryDidChangeNotification object:nil userInfo:nil]; + dispatch_group_notify(dispatchGroup, dispatch_get_main_queue(), ^{ + + // Commit store changes done + if ([self->mxSession.store respondsToSelector:@selector(commit)]) + { + [self->mxSession.store commit]; + } + + // Broadcast the change which concerns all the room summaries. + [[NSNotificationCenter defaultCenter] postNotificationName:kMXRoomSummaryDidChangeNotification object:nil userInfo:nil]; + + }); } } diff --git a/MatrixKit/Models/Room/MXKAttachment.m b/MatrixKit/Models/Room/MXKAttachment.m index 83db0b35a..356566380 100644 --- a/MatrixKit/Models/Room/MXKAttachment.m +++ b/MatrixKit/Models/Room/MXKAttachment.m @@ -193,11 +193,6 @@ - (NSString *)getThumbnailURI - (NSString *)getThumbnailMimeType { - if (thumbnailFile) - { - return thumbnailFile.mimetype; - } - return _thumbnailInfo[@"mimetype"]; } @@ -311,6 +306,7 @@ - (void)getThumbnail:(void (^)(MXKAttachment *, UIImage *))onSuccess failure:(vo else { [_mediaManager downloadEncryptedMediaFromMatrixContentFile:thumbnailFile + mimeType:_thumbnailMimeType inFolder:_eventRoomId success:^(NSString *outputFilePath) { decryptAndCache(); @@ -481,6 +477,7 @@ - (void)prepare:(void (^)(void))onAttachmentReady failure:(void (^)(NSError *err if (_isEncrypted) { loader = [_mediaManager downloadEncryptedMediaFromMatrixContentFile:contentFile + mimeType:mimetype inFolder:_eventRoomId]; } else diff --git a/MatrixKit/Models/Room/MXKRoomDataSource.h b/MatrixKit/Models/Room/MXKRoomDataSource.h index 99c1b3e9f..fccdf10b3 100644 --- a/MatrixKit/Models/Room/MXKRoomDataSource.h +++ b/MatrixKit/Models/Room/MXKRoomDataSource.h @@ -504,6 +504,40 @@ extern NSString *const kMXKRoomDataSourceTimelineErrorErrorKey; success:(void (^)(NSString *eventId))success failure:(void (^)(NSError *error))failure; +/** + Send an audio file to the room. + + While sending, a fake event will be echoed in the messages list. + Once complete, this local echo will be replaced by the event saved by the homeserver. + + @param audioFileLocalURL the local filesystem path of the audio file to send. + @param mimeType the mime type of the file. + @param success A block object called when the operation succeeds. It returns + the event id of the event generated on the homeserver + @param failure A block object called when the operation fails. + */ +- (void)sendAudioFile:(NSURL *)audioFileLocalURL + mimeType:mimeType + success:(void (^)(NSString *))success + failure:(void (^)(NSError *))failure; + +/** + Send a voice message to the room. + + While sending, a fake event will be echoed in the messages list. + Once complete, this local echo will be replaced by the event saved by the homeserver. + + @param audioFileLocalURL the local filesystem path of the audio file to send. + @param mimeType (optional) the mime type of the file. Defaults to `audio/ogg` + @param success A block object called when the operation succeeds. It returns + the event id of the event generated on the homeserver + @param failure A block object called when the operation fails. + */ +- (void)sendVoiceMessage:(NSURL *)audioFileLocalURL + mimeType:mimeType + success:(void (^)(NSString *))success + failure:(void (^)(NSError *))failure; + /** Send a file to the room. diff --git a/MatrixKit/Models/Room/MXKRoomDataSource.m b/MatrixKit/Models/Room/MXKRoomDataSource.m index fd3e01b38..5227123cd 100644 --- a/MatrixKit/Models/Room/MXKRoomDataSource.m +++ b/MatrixKit/Models/Room/MXKRoomDataSource.m @@ -922,7 +922,11 @@ - (void)refreshEventListeners:(NSArray *)liveEventTypesFilterForMessages } } - if (nil == localEcho) + if (self.secondaryRoom) + { + [self reloadNotifying:NO]; + } + else if (nil == localEcho) { // Process here incoming events, and outgoing events sent from another device. [self queueEventForProcessing:event withRoomState:roomState direction:MXTimelineDirectionForwards]; @@ -1071,7 +1075,8 @@ - (void)refreshSecondaryEventListeners:(NSArray *)liveEventTypesFilterForMessage if (nil == localEcho) { // Process here incoming events, and outgoing events sent from another device. - [self reloadNotifying:NO]; + [self queueEventForProcessing:event withRoomState:roomState direction:MXTimelineDirectionForwards]; + [self processQueuedEvents:nil]; } } }]; @@ -1860,6 +1865,35 @@ - (void)sendVideo:(NSURL *)videoLocalURL withThumbnail:(UIImage *)videoThumbnail } } +- (void)sendAudioFile:(NSURL *)audioFileLocalURL mimeType:mimeType success:(void (^)(NSString *))success failure:(void (^)(NSError *))failure +{ + __block MXEvent *localEchoEvent = nil; + + [_room sendAudioFile:audioFileLocalURL mimeType:mimeType localEcho:&localEchoEvent success:success failure:failure keepActualFilename:YES]; + + if (localEchoEvent) + { + // Make the data source digest this fake local echo message + [self queueEventForProcessing:localEchoEvent withRoomState:self.roomState direction:MXTimelineDirectionForwards]; + [self processQueuedEvents:nil]; + } +} + +- (void)sendVoiceMessage:(NSURL *)audioFileLocalURL mimeType:mimeType success:(void (^)(NSString *))success failure:(void (^)(NSError *))failure +{ + __block MXEvent *localEchoEvent = nil; + + [_room sendVoiceMessage:audioFileLocalURL mimeType:mimeType localEcho:&localEchoEvent success:success failure:failure keepActualFilename:YES]; + + if (localEchoEvent) + { + // Make the data source digest this fake local echo message + [self queueEventForProcessing:localEchoEvent withRoomState:self.roomState direction:MXTimelineDirectionForwards]; + [self processQueuedEvents:nil]; + } +} + + - (void)sendFile:(NSURL *)fileLocalURL mimeType:(NSString*)mimeType success:(void (^)(NSString *))success failure:(void (^)(NSError *))failure { __block MXEvent *localEchoEvent = nil; @@ -2442,7 +2476,7 @@ - (void)eventDidChangeSentState:(NSNotification *)notif } // Inform the delegate - if (self.delegate) + if (self.delegate && (self.secondaryRoom ? bubbles.count > 0 : YES)) { [self.delegate dataSource:self didCellChange:nil]; } diff --git a/MatrixKit/Models/RoomList/MXKInterleavedRecentsDataSource.m b/MatrixKit/Models/RoomList/MXKInterleavedRecentsDataSource.m index 93898f477..8ed044039 100644 --- a/MatrixKit/Models/RoomList/MXKInterleavedRecentsDataSource.m +++ b/MatrixKit/Models/RoomList/MXKInterleavedRecentsDataSource.m @@ -423,7 +423,7 @@ - (void)dataSource:(MXKDataSource*)dataSource didCellChange:(id)changes } else { - while (updatedCellData && (updatedCellData.lastEvent.originServerTs > currentCellData.lastEvent.originServerTs)) + while (updatedCellData && (updatedCellData.roomSummary.lastMessage.originServerTs > currentCellData.roomSummary.lastMessage.originServerTs)) { [interleavedCellDataArray insertObject:updatedCellData atIndex:currentCellIndex++]; updatedCellData = [updateRecentsDataSource cellDataAtIndex:updatedCellIndex++]; diff --git a/MatrixKit/Models/RoomList/MXKRecentCellData.m b/MatrixKit/Models/RoomList/MXKRecentCellData.m index 6ee0f7255..42e9662e0 100644 --- a/MatrixKit/Models/RoomList/MXKRecentCellData.m +++ b/MatrixKit/Models/RoomList/MXKRecentCellData.m @@ -21,7 +21,7 @@ #import "MXEvent+MatrixKit.h" @implementation MXKRecentCellData -@synthesize roomSummary, recentsDataSource, lastEvent, roomDisplayname, lastEventTextMessage, lastEventAttributedTextMessage, lastEventDate; +@synthesize roomSummary, recentsDataSource, roomDisplayname, lastEventTextMessage, lastEventAttributedTextMessage, lastEventDate; - (instancetype)initWithRoomSummary:(MXRoomSummary*)theRoomSummary andRecentListDataSource:(MXKSessionRecentsDataSource*)recentListDataSource { @@ -41,13 +41,10 @@ - (instancetype)initWithRoomSummary:(MXRoomSummary*)theRoomSummary andRecentList - (void)update { // Keep ref on displayed last event - lastEvent = roomSummary.lastMessageEvent; roomDisplayname = roomSummary.displayname; - lastEventTextMessage = roomSummary.lastMessageString; - lastEventAttributedTextMessage = roomSummary.lastMessageAttributedString; - - lastEvent.mxkEventFormatterError = [((NSNumber*)roomSummary.lastMessageOthers[@"mxkEventFormatterError"]) intValue]; + lastEventTextMessage = roomSummary.lastMessage.text; + lastEventAttributedTextMessage = roomSummary.lastMessage.attributedText; } - (void)dealloc @@ -55,14 +52,13 @@ - (void)dealloc [[NSNotificationCenter defaultCenter] removeObserver:self name:kMXRoomSummaryDidChangeNotification object:roomSummary]; roomSummary = nil; - lastEvent = nil; lastEventTextMessage = nil; lastEventAttributedTextMessage = nil; } - (NSString*)lastEventDate { - return (NSString*)roomSummary.lastMessageOthers[@"lastEventDate"]; + return (NSString*)roomSummary.lastMessage.others[@"lastEventDate"]; } - (BOOL)hasUnread diff --git a/MatrixKit/Models/RoomList/MXKRecentCellDataStoring.h b/MatrixKit/Models/RoomList/MXKRecentCellDataStoring.h index 1ebc708fe..380736fd3 100644 --- a/MatrixKit/Models/RoomList/MXKRecentCellDataStoring.h +++ b/MatrixKit/Models/RoomList/MXKRecentCellDataStoring.h @@ -40,11 +40,6 @@ */ @property (nonatomic, readonly) MXRoomSummary *roomSummary; -/** - The last event to display. - */ -@property (nonatomic, readonly) MXEvent *lastEvent; - @property (nonatomic, readonly) NSString *roomDisplayname; @property (nonatomic, readonly) NSString *lastEventTextMessage; @property (nonatomic, readonly) NSString *lastEventDate; diff --git a/MatrixKit/Models/RoomList/MXKSessionRecentsDataSource.m b/MatrixKit/Models/RoomList/MXKSessionRecentsDataSource.m index 715ea85e8..52a6da523 100644 --- a/MatrixKit/Models/RoomList/MXKSessionRecentsDataSource.m +++ b/MatrixKit/Models/RoomList/MXKSessionRecentsDataSource.m @@ -389,16 +389,7 @@ - (void)sortCellDataAndNotifyChanges // Order them by origin_server_ts [internalCellDataArray sortUsingComparator:^NSComparisonResult(id cellData1, id cellData2) { - NSComparisonResult result = NSOrderedAscending; - if (cellData2.lastEvent.originServerTs > cellData1.lastEvent.originServerTs) - { - result = NSOrderedDescending; - } - else if (cellData2.lastEvent.originServerTs == cellData1.lastEvent.originServerTs) - { - result = NSOrderedSame; - } - return result; + return [cellData1.roomSummary.lastMessage compareOriginServerTs:cellData2.roomSummary.lastMessage]; }]; // Snapshot the cell data array diff --git a/MatrixKit/Utils/EventFormatter/MXKEventFormatter.m b/MatrixKit/Utils/EventFormatter/MXKEventFormatter.m index d40b8e1d9..516f26b77 100644 --- a/MatrixKit/Utils/EventFormatter/MXKEventFormatter.m +++ b/MatrixKit/Utils/EventFormatter/MXKEventFormatter.m @@ -1363,17 +1363,38 @@ - (NSAttributedString *)attributedStringFromEvent:(MXEvent *)event withRoomState // Build the full emote string after the body message formatting if ([msgtype isEqualToString:kMXMessageTypeEmote]) { + __block NSUInteger insertAt = 0; + + // For replies, look for the end of the parent message + // This helps us insert the emote prefix in the right place + NSDictionary *relatesTo; + MXJSONModelSetDictionary(relatesTo, event.content[@"m.relates_to"]); + if ([relatesTo[@"m.in_reply_to"] isKindOfClass:NSDictionary.class]) + { + [attributedDisplayText enumerateAttribute:kMXKToolsBlockquoteMarkAttribute + inRange:NSMakeRange(0, attributedDisplayText.length) + options:(NSAttributedStringEnumerationReverse) + usingBlock:^(id value, NSRange range, BOOL *stop) { + insertAt = range.location; + *stop = YES; + }]; + } + // Always use default font and color for the emote prefix NSString *emotePrefix = [NSString stringWithFormat:@"* %@ ", senderDisplayName]; + NSAttributedString *attributedEmotePrefix = + [[NSAttributedString alloc] initWithString:emotePrefix + attributes:@{ + NSForegroundColorAttributeName: _defaultTextColor, + NSFontAttributeName: _defaultTextFont + }]; + + // Then, insert the emote prefix at the start of the message + // (location varies depending on whether it was a reply) NSMutableAttributedString *newAttributedDisplayText = - [[NSMutableAttributedString alloc] initWithString:emotePrefix - attributes:@{ - NSForegroundColorAttributeName: _defaultTextColor, - NSFontAttributeName: _defaultTextFont - }]; - - // Then, append the styled body message - [newAttributedDisplayText appendAttributedString:attributedDisplayText]; + [[NSMutableAttributedString alloc] initWithAttributedString:attributedDisplayText]; + [newAttributedDisplayText insertAttributedString:attributedEmotePrefix + atIndex:insertAt]; attributedDisplayText = newAttributedDisplayText; } } @@ -1807,12 +1828,6 @@ - (NSString*)renderReplyTo:(NSString*)htmlString withRoomState:(MXRoomState*)roo html = [html stringByReplacingCharactersInRange:inReplyToLinkRange withString:@"#"]; } - //
content in a reply-to message must be under a

child like - // other quoted messages. Else it breaks the workaround we use to display - // the vertical bar on blockquotes with DTCoreText - html = [html stringByReplacingOccurrencesOfString:@"

" withString:@"

"]; - html = [html stringByReplacingOccurrencesOfString:@"

" withString:@"

"]; - return html; } @@ -1896,18 +1911,18 @@ - (BOOL)session:(MXSession *)session updateRoomSummary:(MXRoomSummary *)summary { // We build strings containing the sender displayname (ex: "Bob: Hello!") // If a sender changes his displayname, we need to update the lastMessage. - MXEvent *lastMessageEvent; + MXRoomLastMessage *lastMessage; for (MXEvent *event in stateEvents) { if (event.isUserProfileChange) { - if (!lastMessageEvent) + if (!lastMessage) { // Load lastMessageEvent on demand to save I/O - lastMessageEvent = summary.lastMessageEvent; + lastMessage = summary.lastMessage; } - if ([event.sender isEqualToString:lastMessageEvent.sender]) + if ([event.sender isEqualToString:lastMessage.sender]) { // The last message must be recomputed [summary resetLastMessage:nil failure:nil commit:YES]; @@ -1926,7 +1941,7 @@ - (BOOL)session:(MXSession *)session updateRoomSummary:(MXRoomSummary *)summary - (BOOL)session:(MXSession *)session updateRoomSummary:(MXRoomSummary *)summary withLastEvent:(MXEvent *)event eventState:(MXRoomState *)eventState roomState:(MXRoomState *)roomState { // Use the default updater as first pass - MXEvent *currentlastMessageEvent = summary.lastMessageEvent; + MXRoomLastMessage *currentlastMessage = summary.lastMessage; BOOL updated = [defaultRoomSummaryUpdater session:session updateRoomSummary:summary withLastEvent:event eventState:eventState roomState:roomState]; if (updated) { @@ -1942,16 +1957,21 @@ - (BOOL)session:(MXSession *)session updateRoomSummary:(MXRoomSummary *)summary // @TODO: there is a conflict with what [defaultRoomSummaryUpdater updateRoomSummary] did :/ updated = NO; // Restore the previous lastMessageEvent - summary.lastMessageEvent = currentlastMessageEvent; + [summary updateLastMessage:currentlastMessage]; } else { - summary.lastMessageString = lastMessageString; + summary.lastMessage.text = lastMessageString; + + if (summary.lastMessage.others == nil) + { + summary.lastMessage.others = [NSMutableDictionary dictionary]; + } // Store the potential error - summary.lastMessageOthers[@"mxkEventFormatterError"] = @(error); + summary.lastMessage.others[@"mxkEventFormatterError"] = @(error); - summary.lastMessageOthers[@"lastEventDate"] = [self dateStringFromEvent:event withTime:YES]; + summary.lastMessage.others[@"lastEventDate"] = [self dateStringFromEvent:event withTime:YES]; // Check whether the sender name has to be added NSString *prefix = nil; @@ -1972,7 +1992,7 @@ - (BOOL)session:(MXSession *)session updateRoomSummary:(MXRoomSummary *)summary } // Compute the attribute text message - summary.lastMessageAttributedString = [self renderString:summary.lastMessageString withPrefix:prefix forEvent:event]; + summary.lastMessage.attributedText = [self renderString:summary.lastMessage.text withPrefix:prefix forEvent:event]; } } diff --git a/MatrixKit/Utils/MXKTools.h b/MatrixKit/Utils/MXKTools.h index 2bcb65340..be3a142fa 100644 --- a/MatrixKit/Utils/MXKTools.h +++ b/MatrixKit/Utils/MXKTools.h @@ -26,6 +26,9 @@ #define MXKTOOLS_EVENT_IDENTIFIER_BITWISE 0x08 #define MXKTOOLS_GROUP_IDENTIFIER_BITWISE 0x10 +// Attribute in an NSAttributeString that marks a blockquote block that was in the original HTML string. +extern NSString *const kMXKToolsBlockquoteMarkAttribute; + /** Structure representing an the size of an image and its file size. */ diff --git a/MatrixKit/Utils/MXKTools.m b/MatrixKit/Utils/MXKTools.m index 28f68a08f..774227f7e 100644 --- a/MatrixKit/Utils/MXKTools.m +++ b/MatrixKit/Utils/MXKTools.m @@ -1143,7 +1143,7 @@ + (void)createLinksInAttributedString:(NSAttributedString*)attributedString matc + (NSString*)cssToMarkBlockquotes { - return [NSString stringWithFormat:@"blockquote {background: #%lX;}", (unsigned long)[MXKTools rgbValueWithColor:kMXKToolsBlockquoteMarkColor]]; + return [NSString stringWithFormat:@"blockquote {background: #%lX; display: block;}", (unsigned long)[MXKTools rgbValueWithColor:kMXKToolsBlockquoteMarkColor]]; } + (NSAttributedString*)removeMarkedBlockquotesArtifacts:(NSAttributedString*)attributedString diff --git a/Podfile b/Podfile index 07ca57f28..56358c25e 100644 --- a/Podfile +++ b/Podfile @@ -8,7 +8,7 @@ abstract_target 'MatrixKitSamplePods' do # Different flavours of pods to Matrix SDK # The tagged version on which this version of MatrixKit has been built - pod 'MatrixSDK', '= 0.19.0' + pod 'MatrixSDK', '= 0.19.1' # The lastest release available on the CocoaPods repository #pod 'MatrixSDK' diff --git a/Podfile.lock b/Podfile.lock index ed53d07f5..0b9570c34 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -39,9 +39,9 @@ PODS: - JSQSystemSoundPlayer (2.0.1) - libbase58 (0.1.4) - libPhoneNumber-iOS (0.9.15) - - MatrixSDK (0.19.0): - - MatrixSDK/Core (= 0.19.0) - - MatrixSDK/Core (0.19.0): + - MatrixSDK (0.19.1): + - MatrixSDK/Core (= 0.19.1) + - MatrixSDK/Core (0.19.1): - AFNetworking (~> 4.0.0) - GZIP (~> 1.3.0) - libbase58 (~> 0.1.4) @@ -64,7 +64,7 @@ DEPENDENCIES: - HPGrowingTextView (~> 1.1) - JSQMessagesViewController (~> 7.3.5) - libPhoneNumber-iOS (~> 0.9.13) - - MatrixSDK (= 0.19.0) + - MatrixSDK (= 0.19.1) SPEC REPOS: trunk: @@ -94,11 +94,11 @@ SPEC CHECKSUMS: JSQSystemSoundPlayer: c5850e77a4363ffd374cd851154b9af93264ed8d libbase58: 7c040313537b8c44b6e2d15586af8e21f7354efd libPhoneNumber-iOS: 0a32a9525cf8744fe02c5206eb30d571e38f7d75 - MatrixSDK: 60c9ac811395879ede3f8c0c6ea6578fd3c0063f + MatrixSDK: e02c4998a4fea689000feb9c70f7df62c4443481 OLMKit: 2d73cd67d149b5c3e3a8eb8ecae93d0b429d8a02 Realm: ed860452717c8db8f4bf832b6807f7f2ce708839 SwiftyBeaver: 84069991dd5dca07d7069100985badaca7f0ce82 -PODFILE CHECKSUM: 8b5ed40d021a63e7683b3c0ccba332673980c11d +PODFILE CHECKSUM: bcd6f6067f0fa97b510fa3eb7b48c1cf10f2b9f0 COCOAPODS: 1.10.1