From f7cce00d77846fdfa9c76615e2465f5a54b02b0d Mon Sep 17 00:00:00 2001 From: "lingohub[bot]" <69908207+lingohub[bot]@users.noreply.github.com> Date: Mon, 13 Sep 2021 08:42:14 -0300 Subject: [PATCH 1/2] =?UTF-8?q?Language=20update=20from=20LingoHub=20?= =?UTF-8?q?=F0=9F=A4=96=20(#23184)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Project Name: Rocket.Chat Project Link: https://translate.lingohub.com/rocketchat/dashboard/rocket-dot-chat User: Robot LingoHub Easy language translations with LingoHub 🚀 Co-authored-by: Robot LingoHub --- .../rocketchat-i18n/i18n/bas-CM.i18n.json | 2 +- packages/rocketchat-i18n/i18n/ca.i18n.json | 25 ++++++++++++- packages/rocketchat-i18n/i18n/es.i18n.json | 25 +++++++++++-- packages/rocketchat-i18n/i18n/fr.i18n.json | 8 ++-- packages/rocketchat-i18n/i18n/kg.i18n.json | 2 +- packages/rocketchat-i18n/i18n/ln.i18n.json | 2 +- packages/rocketchat-i18n/i18n/nl.i18n.json | 8 ++-- packages/rocketchat-i18n/i18n/ru.i18n.json | 37 +++++++++++++++---- 8 files changed, 86 insertions(+), 23 deletions(-) diff --git a/packages/rocketchat-i18n/i18n/bas-CM.i18n.json b/packages/rocketchat-i18n/i18n/bas-CM.i18n.json index 9e26dfeeb6e6..6f31cf5a2e62 100644 --- a/packages/rocketchat-i18n/i18n/bas-CM.i18n.json +++ b/packages/rocketchat-i18n/i18n/bas-CM.i18n.json @@ -1 +1 @@ -{} \ No newline at end of file +{ } \ No newline at end of file diff --git a/packages/rocketchat-i18n/i18n/ca.i18n.json b/packages/rocketchat-i18n/i18n/ca.i18n.json index 2849ac284a90..681efea44524 100644 --- a/packages/rocketchat-i18n/i18n/ca.i18n.json +++ b/packages/rocketchat-i18n/i18n/ca.i18n.json @@ -301,6 +301,7 @@ "Agent_messages": "Missatges de l'agent", "Agent_Name_Placeholder": "Si us plau, introduïu el nom d'un agent ...", "Agent_removed": "Agent eliminat", + "Agent_deactivated": "L'agent va ser desactivat", "Agents": "Agents", "Alerts": "Alertes", "Alias": "Àlies", @@ -530,6 +531,7 @@ "are_also_typing": "també estan escrivint", "are_typing": "estan escrivint", "Are_you_sure": "N'estàs segur?", + "Are_you_sure_you_want_to_clear_all_unread_messages": "Esteu segur que voleu esborrar tots els missatges no llegits?", "Are_you_sure_you_want_to_close_this_chat": "Estàs segur que vols tancar aquest xat?", "Are_you_sure_you_want_to_delete_this_record": "Esteu segur que voleu suprimir aquest registre?", "Are_you_sure_you_want_to_delete_your_account": "Estàs segur d'eliminar el teu compte?", @@ -864,6 +866,7 @@ "Clients_will_refresh_in_a_few_seconds": "Els clients es refrescaran en breus instants", "close": "tanca", "Close": "Tanca", + "Close_chat": "Tancar xat", "Close_room_description": "Esteu a punt de tancar aquest xat. Esteu segur que voleu continuar?", "close-livechat-room": "Tancar sala de Livechat", "close-livechat-room_description": "Permís per tancar la sala d'LiveChat actual", @@ -872,6 +875,7 @@ "Closed": "Tancat", "Closed_At": "Tancat a les", "Closed_automatically": "Tancat automàticament pel sistema", + "Closed_automatically_chat_queued_too_long": "Tancat automàticament pel sistema (temps màxim de cua excedit)", "Closed_by_visitor": "Tancat pel visitant", "Closing_chat": "Tancant xat", "Closing_chat_message": "Missatge de tancament de xat", @@ -1901,6 +1905,7 @@ "FileSize_KB": "__fileSize__ KB", "FileSize_MB": "__fileSize__ MB", "FileUpload": "Pujar arxius", + "FileUpload_Cannot_preview_file": "No es pot obtenir una vista prèvia de l'arxiu", "FileUpload_Disabled": "Les pujades de fitxers estan desactivades.", "FileUpload_Enable_json_web_token_for_files": "Activar la protecció de JSON web Tokens per fitxers enviats", "FileUpload_Enable_json_web_token_for_files_description": "Afegeix un JWT a la URL dels arxius carregats", @@ -1923,6 +1928,7 @@ "FileUpload_json_web_token_secret_for_files_description": "File Upload json web Token Secret (s'utilitza per poder accedir als arxius carregats sense autenticació)", "FileUpload_MaxFileSize": "Mida màxima de pujada (en bytes)", "FileUpload_MaxFileSizeDescription": "Establiu-lo a -1 per eliminar la limitació de la mida del fitxer.", + "FileUpload_MediaType_NotAccepted__type__": "Tipus de mitjà no acceptat: __type__", "FileUpload_MediaType_NotAccepted": "Tipus d'arxius no acceptats", "FileUpload_MediaTypeBlackList": "Tipus de mitjans bloquejats", "FileUpload_MediaTypeBlackListDescription": "Llista de tipus de mitjans separats per comes. Aquesta configuració té prioritat sobre els tipus de paper acceptats.", @@ -2579,6 +2585,8 @@ "Livechat_last_chatted_agent_routing_Description": "La configuració de l'últim agent amb el qual va conversar assigna xats a l'agent que va interactuar anteriorment amb el mateix visitant si l'agent està disponible quan s'inicia el xat.", "Livechat_managers": "Supervisors de LiveChat", "Livechat_Managers": "Administradors", + "Livechat_max_queue_wait_time_action": "Com gestionar els xats a la cua quan s'arriba al temps màxim d'espera", + "Livechat_maximum_queue_wait_time": "Temps màxim d'espera en cua", "Livechat_message_character_limit": "Límit de caràcters de missatge de LiveChat", "Livechat_monitors": "Monitors de Livechat", "Livechat_Monitors": "Monitors", @@ -2794,6 +2802,10 @@ "Message_Attachments": "Adjunts al missatge", "Message_Attachments_GroupAttach": "Agrupa els botons d'adjuntar", "Message_Attachments_GroupAttachDescription": "Això uneix les icones en un menú desplegable. Ocupen menys espai a la pantalla.", + "Message_Attachments_Thumbnails_Enabled": "Habiliteu les miniatures d'imatges per estalviar ample de banda", + "Message_Attachments_Thumbnails_Width": "Ample màxim de la miniatura (en píxels)", + "Message_Attachments_Thumbnails_Height": "Alçada màxima de la miniatura (en píxels)", + "Message_Attachments_Thumbnails_EnabledDesc": "Es mostraran miniatures en lloc de la imatge original per reduir l'ús de l'ample de banda. Les imatges amb la resolució original es poden descarregar usant la icona al costat de el nom de l'arxiu adjunt.", "Message_Attachments_Strip_Exif": "Eliminar metadades EXIF d'arxius compatibles", "Message_Attachments_Strip_ExifDescription": "Elimina les metadades EXIF dels arxius d'imatge (jpeg, tiff, etc.). Aquesta configuració no és retroactiva, de manera que els arxius carregats mentre estan deshabilitats tindran dades EXIF", "Message_Audio": "Missatge d'àudio", @@ -3050,7 +3062,7 @@ "Notice_that_public_channels_will_be_public_and_visible_to_everyone": "Recordeu que els Channels públics seran públics i visibles per a tothom.", "Notification_Desktop_Default_For": "Mostra notificacions d'escriptori per", "Notification_Desktop_Audio_Default_For": "Reproduir àudio de notificacions d'escriptori per", - "Notification_Push_Default_For": "Notificacions push mòbil per", + "Notification_Push_Default_For": "Notificacions mòbils push per", "Notification_RequireInteraction": "Requerir interacció per descartar la notificació d'escriptori", "Notification_RequireInteraction_Description": "Funciona només amb versions de el navegador Chrome> 50. Utilitza el paràmetre requireInteraction per mostrar la notificació d'escriptori de forma indefinida fins que l'usuari interactuï amb ella.", "Notifications": "Notificacions", @@ -3064,6 +3076,11 @@ "NPS_survey_enabled": "Habilitar l'enquesta NPS", "NPS_survey_enabled_Description": "Permeti que l'enquesta NPS s'executi per a tots els usuaris. Els administradors rebran un avís 2 mesos abans que s'iniciï l'enquesta", "NPS_survey_is_scheduled_to-run-at__date__for_all_users": "L'enquesta de NPS està programada per executar-se en __date__ per a tots els usuaris. És possible desactivar l'enquesta a 'Admin> General> NPS'?", + "Default_Timezone_For_Reporting": "Zona horària per defecte per als informes", + "Default_Timezone_For_Reporting_Description": "Estableix la zona horària per defecte que s'utilitzarà a l'mostrar panells o enviar correus electrònics", + "Default_Server_Timezone": "Zona horària del servidor", + "Default_Custom_Timezone": "Zona horària personalitzada", + "Default_User_Timezone": "Zona horària actual de l'usuari", "Num_Agents": "# d'agents", "Number_in_seconds": "Nombre en segons", "Number_of_events": "Nombre d'esdeveniments", @@ -3327,6 +3344,7 @@ "Query_is_not_valid_JSON": "La consulta no és JSON vàlid", "Queue": "Cua", "Queue_Time": "Temps de cua", + "Queue_management": "Gestió de cues", "quote": "cita", "Quote": "Cita", "Random": "Aleatori", @@ -4101,6 +4119,7 @@ "Thread_message": "Comentat al missatge de *__username__'s* missatge: _ __msg__ _", "Threads": "Fils", "Thursday": "dijous", + "Time_in_minutes": "Temps en minuts", "Time_in_seconds": "Temps en segons", "Timeout": "Temps d'espera", "Timeouts": "Temps d'espera", @@ -4394,6 +4413,10 @@ "UTC_Timezone": "UTC Zona horària", "Utilities": "Utilitats", "UTF8_Names_Slugify": "Slugify de noms UTF8", + "UTF8_User_Names_Validation": "Validació de noms d'usuari UTF8", + "UTF8_User_Names_Validation_Description": "RegExp que s'utilitzarà per validar noms d'usuari", + "UTF8_Channel_Names_Validation": "Validació de noms de channel UTF8", + "UTF8_Channel_Names_Validation_Description": "RegExp que s'utilitzarà per validar els noms dels canals", "Validate_email_address": "Validar l'adreça de correu electrònic", "Validation": "Validació", "Value_messages": "__value__ messages", diff --git a/packages/rocketchat-i18n/i18n/es.i18n.json b/packages/rocketchat-i18n/i18n/es.i18n.json index 8f7e634246fb..66ca0960167e 100644 --- a/packages/rocketchat-i18n/i18n/es.i18n.json +++ b/packages/rocketchat-i18n/i18n/es.i18n.json @@ -301,7 +301,7 @@ "Agent_messages": "Mensajes del agente", "Agent_Name_Placeholder": "Por favor, introduzca el nombre de un agente...", "Agent_removed": "Agente eliminado", - "Agent_deactivated": "Agente desactivado", + "Agent_deactivated": "El agente fue desactivado", "Agents": "Agentes", "Alerts": "Alertas", "Alias": "Alias", @@ -531,6 +531,7 @@ "are_also_typing": "también están escribiendo", "are_typing": "están escribiendo", "Are_you_sure": "Estás seguro?", + "Are_you_sure_you_want_to_clear_all_unread_messages": "¿Está seguro de que desea borrar todos los mensajes no leídos?", "Are_you_sure_you_want_to_close_this_chat": "¿Estás seguro de que quieres cerrar este chat?", "Are_you_sure_you_want_to_delete_this_record": "¿Estás seguro de que quieres borrar este registro?", "Are_you_sure_you_want_to_delete_your_account": "¿Estás seguro de que quieres eliminar tu cuenta?", @@ -865,6 +866,7 @@ "Clients_will_refresh_in_a_few_seconds": "Los clientes se refrescaran en unos pocos segundos", "close": "Cerrar", "Close": "Cerrar", + "Close_chat": "Cerrar chat", "Close_room_description": "Estás a punto de cerrar este chat. ¿Estás seguro de que quieres continuar?", "close-livechat-room": "Cerrar la sala de LiveChat", "close-livechat-room_description": "Permiso para cerrar el canal LiveChat actual", @@ -873,6 +875,7 @@ "Closed": "Cerrado", "Closed_At": "Cerrado en", "Closed_automatically": "Cerrado automáticamente por el sistema", + "Closed_automatically_chat_queued_too_long": "Cerrado automáticamente por el sistema (tiempo máximo de cola excedido)", "Closed_by_visitor": "Cerrado por el visitante", "Closing_chat": "Cerrando chat", "Closing_chat_message": "Mensaje de chat de cierre", @@ -1901,6 +1904,7 @@ "FileSize_KB": "__fileSize__ KB", "FileSize_MB": "__fileSize__ MB", "FileUpload": "Subir archivos", + "FileUpload_Cannot_preview_file": "No se puede obtener una vista previa del archivo", "FileUpload_Disabled": "No está habilitado subir archivos", "FileUpload_Enable_json_web_token_for_files": "Habilitar la protección de Json Web Tokens para archivos subidos", "FileUpload_Enable_json_web_token_for_files_description": "Agrega un JWT a la URL de los archivos cargados", @@ -1923,6 +1927,7 @@ "FileUpload_json_web_token_secret_for_files_description": "File Upload Json Web Token Secret (se utiliza para poder acceder a los archivos cargados sin autenticación)", "FileUpload_MaxFileSize": "Tamaño Maximo de Subida (en bytes)", "FileUpload_MaxFileSizeDescription": "Establézcalo en -1 para eliminar la limitación del tamaño del archivo.", + "FileUpload_MediaType_NotAccepted__type__": "Tipo de medio no aceptado: __type__", "FileUpload_MediaType_NotAccepted": "Tipos de medios no aceptados", "FileUpload_MediaTypeBlackList": "Tipos de medios bloqueados", "FileUpload_MediaTypeBlackListDescription": "Lista de tipos de medios separados por comas. Esta configuración tiene prioridad sobre los tipos de papel aceptados.", @@ -2580,6 +2585,8 @@ "Livechat_last_chatted_agent_routing_Description": "La configuración del último agente con el que conversó asigna chats al agente que interactuó anteriormente con el mismo visitante si el agente está disponible cuando se inicia el chat.", "Livechat_managers": "Supervisores de LiveChat", "Livechat_Managers": "Administradores", + "Livechat_max_queue_wait_time_action": "Cómo manejar los chats en cola cuando se alcanza el tiempo máximo de espera", + "Livechat_maximum_queue_wait_time": "Tiempo máximo de espera en cola", "Livechat_message_character_limit": "Límite de caracteres del mensaje de LiveChat", "Livechat_monitors": "Monitores de LiveChat", "Livechat_Monitors": "Monitores", @@ -2795,6 +2802,10 @@ "Message_Attachments": "Adjuntos de mensajes", "Message_Attachments_GroupAttach": "Botones de archivos adjuntos", "Message_Attachments_GroupAttachDescription": "Esto agrupa los iconos debajo de un menú expandible. Toma menos espacio de pantalla.", + "Message_Attachments_Thumbnails_Enabled": "Habilite las miniaturas de imágenes para ahorrar ancho de banda", + "Message_Attachments_Thumbnails_Width": "Ancho máximo de la miniatura (en píxeles)", + "Message_Attachments_Thumbnails_Height": "Altura máxima de la miniatura (en píxeles)", + "Message_Attachments_Thumbnails_EnabledDesc": "Se mostrarán miniaturas en lugar de la imagen original para reducir el uso del ancho de banda. Las imágenes con la resolución original se pueden descargar usando el icono junto al nombre del archivo adjunto.", "Message_Attachments_Strip_Exif": "Eliminar metadatos EXIF de archivos compatibles", "Message_Attachments_Strip_ExifDescription": "Elimina los metadatos EXIF de los archivos de imagen (jpeg, tiff, etc.). Esta configuración no es retroactiva, por lo que los archivos cargados mientras están deshabilitados tendrán datos EXIF", "Message_Audio": "Mensaje de audio", @@ -3065,10 +3076,10 @@ "NPS_survey_enabled": "Habilitar la encuesta NPS", "NPS_survey_enabled_Description": "Permita que la encuesta NPS se ejecute para todos los usuarios. Los administradores recibirán una alerta 2 meses antes de que se inicie la encuesta", "NPS_survey_is_scheduled_to-run-at__date__for_all_users": "La encuesta de NPS está programada para ejecutarse en __date__ para todos los usuarios. Es posible desactivar la encuesta en 'Admin> General> NPS'", - "Default_Timezone_For_Reporting": "Zona horaria por defecto para reportes", - "Default_Timezone_For_Reporting_Description": "Define la zona horaria por defecto usada para mostrar reportes de actividad", + "Default_Timezone_For_Reporting": "Zona horaria predeterminada para los informes", + "Default_Timezone_For_Reporting_Description": "Establece la zona horaria predeterminada que se utilizará al mostrar paneles o enviar correos electrónicos", "Default_Server_Timezone": "Zona horaria del servidor", - "Default_Custom_Timezone": "Zona horaria definida por el usuario", + "Default_Custom_Timezone": "ZoZona horaria personalizada", "Default_User_Timezone": "Zona horaria actual del usuario", "Num_Agents": "# de Agentes", "Number_in_seconds": "Número en segundos", @@ -3333,6 +3344,7 @@ "Query_is_not_valid_JSON": "La consulta no es JSON válido", "Queue": "Cola", "Queue_Time": "Tiempo de cola", + "Queue_management": "Gestión de colas", "quote": "cita", "Quote": "Cita", "Random": "Aleatorio", @@ -4107,6 +4119,7 @@ "Thread_message": "Comentado en el mensaje de *__username__'s* mensaje: _ __msg__ _", "Threads": "Hilos", "Thursday": "Jueves", + "Time_in_minutes": "Tiempo en minutos", "Time_in_seconds": "Tiempo en segundos", "Timeout": "Tiempo de espera", "Timeouts": "Tiempos de espera", @@ -4400,6 +4413,10 @@ "UTC_Timezone": "Zona horaria UTC", "Utilities": "Utilidades", "UTF8_Names_Slugify": "Slugify de nombres UTF8", + "UTF8_User_Names_Validation": "Validación de nombres de usuario UTF8", + "UTF8_User_Names_Validation_Description": "RegExp que se utilizará para validar nombres de usuario", + "UTF8_Channel_Names_Validation": "Validación de nombres de channel UTF8", + "UTF8_Channel_Names_Validation_Description": "RegExp que se utilizará para validar los nombres de los canales", "Validate_email_address": "Validar correo electrónico", "Validation": "Validación", "Value_messages": "__value__ messages", diff --git a/packages/rocketchat-i18n/i18n/fr.i18n.json b/packages/rocketchat-i18n/i18n/fr.i18n.json index ff80d5bba7aa..421bc228a07b 100644 --- a/packages/rocketchat-i18n/i18n/fr.i18n.json +++ b/packages/rocketchat-i18n/i18n/fr.i18n.json @@ -68,7 +68,7 @@ "Accounts_Default_User_Preferences": "Préférences utilisateur par défaut", "Accounts_Default_User_Preferences_audioNotifications": "Alerte par défaut des notifications audio", "Accounts_Default_User_Preferences_desktopNotifications": "Alerte notification de bureau par défaut", - "Accounts_Default_User_Preferences_pushNotifications": "Alerte par défaut des notifications mobiles", + "Accounts_Default_User_Preferences_pushNotifications": "Alerte par défaut des notifications push", "Accounts_Default_User_Preferences_not_available": "Impossible de récupérer les préférences utilisateur car elles n'ont pas encore été configurées par l'utilisateur", "Accounts_DefaultUsernamePrefixSuggestion": "Suggestion par défaut du préfixe du nom d'utilisateur", "Accounts_denyUnverifiedEmail": "Refuser les e-mails non vérifiés", @@ -900,7 +900,7 @@ "Cloud_register_offline_finish_helper": "Une fois le processus d'enregistrement terminé dans la Cloud Console, vous devriez recevoir du texte. Veuillez le coller ici pour terminer l'enregistrement.", "Cloud_register_offline_helper": "Les espaces de travail peuvent être enregistrés manuellement si l'accès au réseau est restreint ou si airgapped. Copiez le texte ci-dessous et accédez à notre Cloud Console pour terminer le processus.", "Cloud_register_success": "Votre espace de travail a été enregistré avec succès !", - "Cloud_registration_pending_html": "Les notifications mobiles ne fonctionneront pas tant que l'enregistrement n'est pas terminé. En savoir plus", + "Cloud_registration_pending_html": "Les notifications push ne fonctionneront pas tant que l'enregistrement n'est pas terminé. En savoir plus", "Cloud_registration_pending_title": "L'enregistrement dans le cloud est toujours en cours", "Cloud_registration_required": "Inscription requise", "Cloud_registration_required_description": "On dirait que, lors de l'installation, vous n'avez pas choisi d'enregistrer votre espace de travail.", @@ -2926,7 +2926,7 @@ "Mobex_sms_gateway_restful_address_desc": "IP ou hôte de votre REST API Mobex, par exemple `http://192.168.1.1:8080` ou `https://www.example.com:8080`", "Mobex_sms_gateway_username": "Nom d'utilisateur", "Mobile": "Mobile", - "Mobile_Push_Notifications_Default_Alert": "Alerte par défaut des notifications mobiles", + "Mobile_Push_Notifications_Default_Alert": "Alerte par défaut des notifications push", "Monday": "Lundi", "Mongo_storageEngine": "Moteur de stockage Mongo", "Mongo_version": "Version de Mongo", @@ -3063,7 +3063,7 @@ "Notice_that_public_channels_will_be_public_and_visible_to_everyone": "Notez que les canaux publics seront publics et visibles de tous.", "Notification_Desktop_Default_For": "Afficher les notifications de bureau pour", "Notification_Desktop_Audio_Default_For": "Lire les notifications audio de bureau pendant", - "Notification_Push_Default_For": "Notifications mobiles push pour", + "Notification_Push_Default_For": "Envoyer des notifications push pour", "Notification_RequireInteraction": "Exiger une interaction pour ignorer la notification de bureau", "Notification_RequireInteraction_Description": "Fonctionne uniquement avec les versions de navigateur Chrome > 50. Utilise le paramètre requireInteraction pour afficher la notification de bureau pour une durée indéfinie jusqu'à ce que l'utilisateur interagisse avec lui.", "Notifications": "Notifications", diff --git a/packages/rocketchat-i18n/i18n/kg.i18n.json b/packages/rocketchat-i18n/i18n/kg.i18n.json index 9e26dfeeb6e6..6f31cf5a2e62 100644 --- a/packages/rocketchat-i18n/i18n/kg.i18n.json +++ b/packages/rocketchat-i18n/i18n/kg.i18n.json @@ -1 +1 @@ -{} \ No newline at end of file +{ } \ No newline at end of file diff --git a/packages/rocketchat-i18n/i18n/ln.i18n.json b/packages/rocketchat-i18n/i18n/ln.i18n.json index 9e26dfeeb6e6..6f31cf5a2e62 100644 --- a/packages/rocketchat-i18n/i18n/ln.i18n.json +++ b/packages/rocketchat-i18n/i18n/ln.i18n.json @@ -1 +1 @@ -{} \ No newline at end of file +{ } \ No newline at end of file diff --git a/packages/rocketchat-i18n/i18n/nl.i18n.json b/packages/rocketchat-i18n/i18n/nl.i18n.json index 70d4da0be284..b928c476583d 100644 --- a/packages/rocketchat-i18n/i18n/nl.i18n.json +++ b/packages/rocketchat-i18n/i18n/nl.i18n.json @@ -68,7 +68,7 @@ "Accounts_Default_User_Preferences": "Standaard gebruikersvoorkeuren", "Accounts_Default_User_Preferences_audioNotifications": "Audiomeldingen Standaardwaarschuwing", "Accounts_Default_User_Preferences_desktopNotifications": "Desktopmeldingen standaardwaarschuwing", - "Accounts_Default_User_Preferences_pushNotifications": "Standaardwaarschuwing voor mobiele meldingen", + "Accounts_Default_User_Preferences_pushNotifications": "Standaardwaarschuwing pushmeldingen", "Accounts_Default_User_Preferences_not_available": "Het ophalen van gebruikersvoorkeuren is mislukt omdat ze nog niet door de gebruiker zijn ingesteld", "Accounts_DefaultUsernamePrefixSuggestion": "Standaard gebruikersnaam Prefix Suggestie", "Accounts_denyUnverifiedEmail": "Weiger niet geverifieerde e-mail", @@ -900,7 +900,7 @@ "Cloud_register_offline_finish_helper": "Nadat u het registratieproces in de Cloud Console hebt voltooit, krijgt u wat tekst te zien. Plak het hier om de registratie te voltooien.", "Cloud_register_offline_helper": "Werkruimten kunnen handmatig worden geregistreerd als het airgapped is of wanneer de netwerktoegang beperkt is. Kopieer de onderstaande tekst en ga naar onze Cloud Console om het proces te voltooien.", "Cloud_register_success": "Uw werkruimte is succesvol geregistreerd!", - "Cloud_registration_pending_html": "Mobiele meldingen werken pas als de registratie voltooid is. Meer informatie", + "Cloud_registration_pending_html": "Pushmeldingen werken pas als de registratie voltooid is. Meer informatie", "Cloud_registration_pending_title": "Cloudregistratie is nog in behandeling", "Cloud_registration_required": "Registratie vereist", "Cloud_registration_required_description": "Het lijkt erop dat u tijdens de installatie er niet hebt voor gekozen om uw werkruimte te registreren.", @@ -2926,7 +2926,7 @@ "Mobex_sms_gateway_restful_address_desc": "IP of Host van uw Mobex REST API, bijv. `http://192.168.1.1:8080` of `https://www.example.com:8080`", "Mobex_sms_gateway_username": "Gebruikersnaam", "Mobile": "Mobiel", - "Mobile_Push_Notifications_Default_Alert": "Standaardwaarschuwing voor mobiele meldingen", + "Mobile_Push_Notifications_Default_Alert": "Standaardwaarschuwing pushmeldingen", "Monday": "Maandag", "Mongo_storageEngine": "Mongo Storage Engine", "Mongo_version": "Mongo-versie", @@ -3063,7 +3063,7 @@ "Notice_that_public_channels_will_be_public_and_visible_to_everyone": "Merk op dat openbare kanalen openbaar zijn en voor iedereen zichtbaar zijn.", "Notification_Desktop_Default_For": "Bureaubladmeldingen weergeven voor", "Notification_Desktop_Audio_Default_For": "Speel desktop audiomeldingen voor", - "Notification_Push_Default_For": "Mobiele pushmeldingen voor", + "Notification_Push_Default_For": "Stuur pushmeldingen voor", "Notification_RequireInteraction": "Interactie vereisen om bureaubladmelding te sluiten", "Notification_RequireInteraction_Description": "Werkt alleen met Chrome-browserversies > 50. Gebruikt de parameter requireInteraction om de bureaubladmelding voor onbepaalde tijd weer te geven totdat de gebruiker er interactie mee heeft.", "Notifications": "Meldingen", diff --git a/packages/rocketchat-i18n/i18n/ru.i18n.json b/packages/rocketchat-i18n/i18n/ru.i18n.json index aa3011151fe0..5eadac8ddbc7 100644 --- a/packages/rocketchat-i18n/i18n/ru.i18n.json +++ b/packages/rocketchat-i18n/i18n/ru.i18n.json @@ -865,6 +865,7 @@ "Clients_will_refresh_in_a_few_seconds": "Клиенты обновятся через пару секунд", "close": "закрыть", "Close": "Закрыть", + "Close_chat": "Закрыть чат", "Close_room_description": "Вы собираетесь закрыть этот чат. Вы уверены, что хотите продолжить?", "close-livechat-room": "Закрыть комнату Livechat ", "close-livechat-room_description": "Разрешение на закрытие текущего чата LiveChat", @@ -873,6 +874,7 @@ "Closed": "Закрыто", "Closed_At": "Закрыто в", "Closed_automatically": "Автоматически закрыто системой", + "Closed_automatically_chat_queued_too_long": "Закрыт автоматически системой (превышено максимальное время очереди)", "Closed_by_visitor": "Закрыто посетителем", "Closing_chat": "Закрыть чат", "Closing_chat_message": "Сообщение о закрытии чата", @@ -1842,6 +1844,10 @@ "Federation_SRV_no_support_details": "Некоторые DNS-провайдеры не разрешают устанавливать _https или _http в SRV-записях, поэтому мы поддерживаем эти случаи, используя наш старый метод разрешения DNS-записей.", "Federation_Must_add_records": "Вы должны добавить следующие DNS записи на вашем сервере:", "Federation_SRV_records_200": "SRV-запись (2.0.0 или новее)", + "Federation_Public_key_TXT_record": "TXT запись открытого ключа", + "Federation_Protocol_TXT_record": "Протокол TXT записи", + "Federation_Legacy_support": "Поддержка устаревшего", + "Federation_HTTP_instead_HTTPS": "Если вы используете протокол HTTP вместо HTTPS", "Federation_DNS_info_update": "Эта информация обновляется каждую 1 минуту", "Federation_Adding_Federated_Users": "Добавление федеративных пользователей", "Federation_Guide_adding_users": "Мы расскажем вам, как добавить первого федеративного пользователя.", @@ -1881,9 +1887,9 @@ "File_name_Placeholder": "Искать файлы...", "File_not_allowed_direct_messages": "Передача файлов не разрешена в личных сообщениях", "File_Path": "Путь файла", - "file_pruned": "файл очищен", - "File_removed_by_automatic_prune": "Файл удаляется автоматической обрезкой", - "File_removed_by_prune": "Файл удален снизу", + "file_pruned": "файл удален", + "File_removed_by_automatic_prune": "Файл удален автоматической очисткой", + "File_removed_by_prune": "Файл удален в результате очистки", "File_Type": "Тип файла", "File_type_is_not_accepted": "Недопустимый тип файла", "File_uploaded": "Файл загружен", @@ -1892,7 +1898,7 @@ "files": "файлы", "Files": "Файлы", "Files_only": "Удалять только прикрепленные файлы. Сообщения останутся", - "files_pruned": "файлы обрезаны", + "files_pruned": "файлы удалены", "FileSize_Bytes": "__fileSize__ байт", "FileSize_KB": "__fileSize__ КБ", "FileSize_MB": "__fileSize__ МБ", @@ -2578,6 +2584,8 @@ "Livechat_last_chatted_agent_routing_Description": "Настройка последний общавшийся агент назначает чаты агенту, который ранее взаимодействовал с тем же посетителем, если агент доступен, когда чат начинается.", "Livechat_managers": "Менеджеры Livechat", "Livechat_Managers": "Менеджеры", + "Livechat_max_queue_wait_time_action": "Как обрабатывать чаты в очереди при достижении максимального времени ожидания", + "Livechat_maximum_queue_wait_time": "Максимальное время ожидания в очереди", "Livechat_message_character_limit": "Ограничение на количество символов сообщения Livechat", "Livechat_monitors": "Мониторы Livechat", "Livechat_Monitors": "Мониторы", @@ -2792,6 +2800,10 @@ "Message_Attachments": "Вложения сообщений", "Message_Attachments_GroupAttach": "Кнопки присоединения группы", "Message_Attachments_GroupAttachDescription": "Группировка иконок в раскрывающемся меню. Это позволит сэкономить пространство.", + "Message_Attachments_Thumbnails_Enabled": "Включить миниатюры изображений для экономии трафика", + "Message_Attachments_Thumbnails_Width": "Максимальная ширина миниатюры (в пикселях)", + "Message_Attachments_Thumbnails_Height": "Максимальная ширина миниатюры (в пикселях)", + "Message_Attachments_Thumbnails_EnabledDesc": "Миниатюры будут передаваться вместо оригинального изображения для уменьшения использования полосы пропускания сети. Изображения в исходном разрешении можно загрузить с помощью значка рядом с именем вложения.", "Message_Attachments_Strip_Exif": "Удаление метаданных EXIF из поддерживаемых файлов", "Message_Attachments_Strip_ExifDescription": "Удаляет метаданные EXIF из файлов изображений (jpeg, tiff и т.д.). Эта настройка не имеет обратной силы, поэтому файлы, загруженные при отключенной функции, будут содержать данные EXIF", "Message_Audio": "Звуковое сообщение", @@ -2875,7 +2887,7 @@ "MessageBox_view_mode": "MessageBox опции отображения", "messages": "Сообщения", "Messages": "Сообщения", - "messages_pruned": "обрезанные сообщения", + "messages_pruned": "сообщения удалены", "Messages_sent": "Сообщения отправлены", "Messages_that_are_sent_to_the_Incoming_WebHook_will_be_posted_here": "Сообщения, отправленные на Входящий WebHook, будут размещены здесь.", "Meta": "Мета", @@ -3062,6 +3074,11 @@ "NPS_survey_enabled": "Включить опрос NPS", "NPS_survey_enabled_Description": "Разрешить запуск опроса NPS для всех пользователей. Администраторы получат уведомление за 2 месяца до запуска опроса", "NPS_survey_is_scheduled_to-run-at__date__for_all_users": "Опрос NPS запланирован на __date__ для всех пользователей. Можно отключить опрос в разделе 'Admin - General - NPS'", + "Default_Timezone_For_Reporting": "Часовой пояс по умолчанию для отчетов", + "Default_Timezone_For_Reporting_Description": "Устанавливает часовой пояс по умолчанию, который будет использоваться при отображении панелей или при отправке электронной почты", + "Default_Server_Timezone": "Часовой пояс сервера", + "Default_Custom_Timezone": "Настраиваемый часовой пояс", + "Default_User_Timezone": "Текущий часовой пояс пользователя", "Num_Agents": "# Представители", "Number_in_seconds": "Число в секундах", "Number_of_events": "Количество событий", @@ -3325,6 +3342,7 @@ "Query_is_not_valid_JSON": "Запрос не валидный JSON ", "Queue": "Очередь", "Queue_Time": "Время очереди", + "Queue_management": "Управление очередью", "quote": "цитата", "Quote": "цитата", "Random": "Случайный", @@ -3446,7 +3464,7 @@ "RetentionPolicy_AppliesToChannels": "Применяется к открытым каналам", "RetentionPolicy_AppliesToDMs": "Применяется к личным сообщениям", "RetentionPolicy_AppliesToGroups": "Применяется к закрытым каналам", - "RetentionPolicy_Description": "Автоматически обрезает старые сообщения через ваш экземпляр Rocket.Chat.", + "RetentionPolicy_Description": "Автоматически удаляет старые сообщения на вашем сервере Rocket.Chat.", "RetentionPolicy_DoNotPruneDiscussion": "Не удалять сообщения обсуждений", "RetentionPolicy_DoNotPrunePinned": "Не удалять прикрепленные сообщения", "RetentionPolicy_DoNotPruneThreads": "Не очищать треды", @@ -4090,6 +4108,7 @@ "Thread_message": "Оставлен комментарий для *__username__'s* сообщение: _ __msg__ _", "Threads": "Треды", "Thursday": "Четверг", + "Time_in_minutes": "Время в минутах", "Time_in_seconds": "Время в секундах", "Timeout": "Таймаут", "Timeouts": "Таймауты", @@ -4383,6 +4402,10 @@ "UTC_Timezone": "Часовой пояс UTC", "Utilities": "Утилиты", "UTF8_Names_Slugify": "UTF8 Names Slugify", + "UTF8_User_Names_Validation": "UTF8 валидация имени пользователя", + "UTF8_User_Names_Validation_Description": "Регулярное выражение для валидации имени пользователя", + "UTF8_Channel_Names_Validation": "UTF8 валидация имени чата", + "UTF8_Channel_Names_Validation_Description": "Регулярное выражение для валидации имени чата", "Validate_email_address": "Подтвердите адрес электронной почты", "Validation": "Валидация", "Value_messages": "__value__ сообщений", @@ -4546,7 +4569,7 @@ "Yes_hide_it": "Да, спрятать!", "Yes_leave_it": "Да, покинуть!", "Yes_mute_user": "Да, заглушить пользователя!", - "Yes_prune_them": "Да, обрезайте их!", + "Yes_prune_them": "Да, удалить их!", "Yes_remove_user": "Да, удалить пользователя!", "Yes_unarchive_it": "Да, разархивировать.", "yesterday": "вчера", From 6ab82250785f68b8ea23ab614a5684ae67a046b4 Mon Sep 17 00:00:00 2001 From: Diego Sampaio Date: Mon, 13 Sep 2021 14:18:58 -0300 Subject: [PATCH 2/2] [BREAK] Stop sending audio notifications via stream (#23108) --- .../server/functions/notifications/audio.js | 49 ------------ .../server/lib/sendNotificationsOnMessage.js | 20 ----- app/lib/server/startup/settings.js | 18 ----- .../client/lib/stream/queueManager.js | 3 +- app/models/server/models/Subscriptions.js | 75 ++++--------------- .../methods/saveNotificationSettings.js | 15 ++-- app/ui/client/lib/notification.js | 41 ++++++---- app/utils/lib/getDefaultSubscriptionPref.js | 6 -- .../lib/getUserNotificationPreference.js | 1 - .../methods/saveUserPreferences.ts | 1 - .../notifications/konchatNotifications.ts | 49 +++++------- .../PreferencesNotificationsSection.js | 26 ------- .../NotificationPreferences.js | 7 -- .../NotificationPreferences.stories.js | 2 - .../NotificationPreferencesWithData.js | 4 - definition/ISubscription.ts | 1 - packages/rocketchat-i18n/i18n/en.i18n.json | 3 +- server/methods/saveUserPreferences.js | 10 --- server/modules/watchers/publishFields.ts | 1 - server/startup/migrations/index.js | 1 + server/startup/migrations/v235.ts | 34 +++++++++ tests/cypress/integration/11-admin.js | 9 --- .../pageobjects/administration.page.js | 4 - tests/end-to-end/api/00-miscellaneous.js | 1 - tests/end-to-end/api/09-rooms.js | 1 - 25 files changed, 104 insertions(+), 278 deletions(-) delete mode 100644 app/lib/server/functions/notifications/audio.js create mode 100644 server/startup/migrations/v235.ts diff --git a/app/lib/server/functions/notifications/audio.js b/app/lib/server/functions/notifications/audio.js deleted file mode 100644 index 12ce5fb8d5fc..000000000000 --- a/app/lib/server/functions/notifications/audio.js +++ /dev/null @@ -1,49 +0,0 @@ -import { metrics } from '../../../../metrics'; -import { settings } from '../../../../settings'; -import { Notifications } from '../../../../notifications'; - -export function shouldNotifyAudio({ - disableAllMessageNotifications, - status, - statusConnection, - audioNotifications, - hasMentionToAll, - hasMentionToHere, - isHighlighted, - hasMentionToUser, - hasReplyToThread, - roomType, - isThread, -}) { - if (disableAllMessageNotifications && audioNotifications == null && !isHighlighted && !hasMentionToUser && !hasReplyToThread) { - return false; - } - - if (statusConnection === 'offline' || status === 'busy' || audioNotifications === 'nothing') { - return false; - } - - if (!audioNotifications) { - if (settings.get('Accounts_Default_User_Preferences_audioNotifications') === 'all' && (!isThread || hasReplyToThread)) { - return true; - } - if (settings.get('Accounts_Default_User_Preferences_audioNotifications') === 'nothing') { - return false; - } - } - - return (roomType === 'd' || (!disableAllMessageNotifications && (hasMentionToAll || hasMentionToHere)) || isHighlighted || audioNotifications === 'all' || hasMentionToUser) && (!isThread || hasReplyToThread); -} - -export function notifyAudioUser(userId, message, room) { - metrics.notificationsSent.inc({ notification_type: 'audio' }); - Notifications.notifyUser(userId, 'audioNotification', { - payload: { - _id: message._id, - rid: message.rid, - sender: message.u, - type: room.t, - name: room.name, - }, - }); -} diff --git a/app/lib/server/lib/sendNotificationsOnMessage.js b/app/lib/server/lib/sendNotificationsOnMessage.js index a5bb1d688b1c..ac829ef55f1e 100644 --- a/app/lib/server/lib/sendNotificationsOnMessage.js +++ b/app/lib/server/lib/sendNotificationsOnMessage.js @@ -10,7 +10,6 @@ import { callJoinRoom, messageContainsHighlight, parseMessageTextPerUser, replac import { getEmailData, shouldNotifyEmail } from '../functions/notifications/email'; import { getPushData, shouldNotifyMobile } from '../functions/notifications/mobile'; import { notifyDesktopUser, shouldNotifyDesktop } from '../functions/notifications/desktop'; -import { notifyAudioUser, shouldNotifyAudio } from '../functions/notifications/audio'; import { Notification } from '../../../notification-queue/server/NotificationQueue'; import { getMentions } from './notifyUsersOnMessage'; @@ -74,29 +73,11 @@ export const sendNotification = async ({ const isHighlighted = messageContainsHighlight(message, subscription.userHighlights); const { - audioNotifications, desktopNotifications, mobilePushNotifications, emailNotifications, } = subscription; - // busy users don't receive audio notification - if (shouldNotifyAudio({ - disableAllMessageNotifications, - status: receiver.status, - statusConnection: receiver.statusConnection, - audioNotifications, - hasMentionToAll, - hasMentionToHere, - isHighlighted, - hasMentionToUser, - hasReplyToThread, - roomType, - isThread, - })) { - notifyAudioUser(subscription.u._id, message, room); - } - // busy users don't receive desktop notification if (shouldNotifyDesktop({ disableAllMessageNotifications, @@ -191,7 +172,6 @@ export const sendNotification = async ({ const project = { $project: { - audioNotifications: 1, desktopNotifications: 1, emailNotifications: 1, mobilePushNotifications: 1, diff --git a/app/lib/server/startup/settings.js b/app/lib/server/startup/settings.js index 4a851e9adcac..77177cbfb7c2 100644 --- a/app/lib/server/startup/settings.js +++ b/app/lib/server/startup/settings.js @@ -259,24 +259,6 @@ settings.addGroup('Accounts', function() { i18nLabel: 'Notification_RequireInteraction', i18nDescription: 'Notification_RequireInteraction_Description', }); - this.add('Accounts_Default_User_Preferences_audioNotifications', 'mentions', { - type: 'select', - values: [ - { - key: 'all', - i18nLabel: 'All_messages', - }, - { - key: 'mentions', - i18nLabel: 'Mentions', - }, - { - key: 'nothing', - i18nLabel: 'Nothing', - }, - ], - public: true, - }); this.add('Accounts_Default_User_Preferences_desktopNotifications', 'all', { type: 'select', values: [ diff --git a/app/livechat/client/lib/stream/queueManager.js b/app/livechat/client/lib/stream/queueManager.js index 526c5158cf4f..14c2e31eae0a 100644 --- a/app/livechat/client/lib/stream/queueManager.js +++ b/app/livechat/client/lib/stream/queueManager.js @@ -13,9 +13,8 @@ const newInquirySound = () => { const userId = Meteor.userId(); const audioVolume = getUserPreference(userId, 'notificationsSoundVolume'); const newRoomNotification = getUserPreference(userId, 'newRoomNotification'); - const audioNotificationValue = getUserPreference(userId, 'audioNotifications'); - if (audioNotificationValue !== 'none') { + if (newRoomNotification !== 'none') { CustomSounds.play(newRoomNotification, { volume: Number((audioVolume / 100).toPrecision(2)), }); diff --git a/app/models/server/models/Subscriptions.js b/app/models/server/models/Subscriptions.js index 471c9b9e303e..7dac1e85acb8 100644 --- a/app/models/server/models/Subscriptions.js +++ b/app/models/server/models/Subscriptions.js @@ -25,7 +25,6 @@ export class Subscriptions extends Base { this.tryEnsureIndex({ alert: 1 }); this.tryEnsureIndex({ ts: 1 }); this.tryEnsureIndex({ ls: 1 }); - this.tryEnsureIndex({ audioNotifications: 1 }, { sparse: 1 }); this.tryEnsureIndex({ desktopNotifications: 1 }, { sparse: 1 }); this.tryEnsureIndex({ mobilePushNotifications: 1 }, { sparse: 1 }); this.tryEnsureIndex({ emailNotifications: 1 }, { sparse: 1 }); @@ -146,6 +145,20 @@ export class Subscriptions extends Base { return this.update(query, update); } + clearAudioNotificationValueById(_id) { + const query = { + _id, + }; + + const update = { + $unset: { + audioNotificationValue: 1, + }, + }; + + return this.update(query, update); + } + updateNotificationsPrefById(_id, notificationPref, notificationField, notificationPrefOrigin) { const query = { _id, @@ -237,15 +250,6 @@ export class Subscriptions extends Base { this.update(query, update); } - findAlwaysNotifyAudioUsersByRoomId(roomId) { - const query = { - rid: roomId, - audioNotifications: 'all', - }; - - return this.find(query); - } - findAlwaysNotifyDesktopUsersByRoomId(roomId) { const query = { rid: roomId, @@ -293,57 +297,6 @@ export class Subscriptions extends Base { return this.find(query, { fields: { emailNotifications: 1, u: 1 } }); } - findNotificationPreferencesByRoom(query/* { roomId: rid, desktopFilter: desktopNotifications, mobileFilter: mobilePushNotifications, emailFilter: emailNotifications }*/) { - return this._db.find(query, { - fields: { - - // fields needed for notifications - rid: 1, - t: 1, - u: 1, - name: 1, - fname: 1, - code: 1, - - // fields to define if should send a notification - ignored: 1, - audioNotifications: 1, - audioNotificationValue: 1, - desktopNotifications: 1, - mobilePushNotifications: 1, - emailNotifications: 1, - disableNotifications: 1, - muteGroupMentions: 1, - userHighlights: 1, - }, - }); - } - - findAllMessagesNotificationPreferencesByRoom(roomId) { - const query = { - rid: roomId, - 'u._id': { $exists: true }, - $or: [ - { desktopNotifications: { $in: ['all', 'mentions'] } }, - { mobilePushNotifications: { $in: ['all', 'mentions'] } }, - { emailNotifications: { $in: ['all', 'mentions'] } }, - ], - }; - - return this._db.find(query, { - fields: { - 'u._id': 1, - audioNotifications: 1, - audioNotificationValue: 1, - desktopNotifications: 1, - mobilePushNotifications: 1, - emailNotifications: 1, - disableNotifications: 1, - muteGroupMentions: 1, - }, - }); - } - resetUserE2EKey(userId) { this.update({ 'u._id': userId }, { $unset: { diff --git a/app/push-notifications/server/methods/saveNotificationSettings.js b/app/push-notifications/server/methods/saveNotificationSettings.js index 56537abd7683..5ec16221e141 100644 --- a/app/push-notifications/server/methods/saveNotificationSettings.js +++ b/app/push-notifications/server/methods/saveNotificationSettings.js @@ -2,7 +2,11 @@ import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; import { Subscriptions } from '../../../models/server'; -import { getUserNotificationPreference } from '../../../utils'; +import { getUserNotificationPreference } from '../../../utils/server'; + +const saveAudioNotificationValue = (subId, value) => (value === 'default' + ? Subscriptions.clearAudioNotificationValueById(subId) + : Subscriptions.updateAudioNotificationValueById(subId, value)); Meteor.methods({ saveNotificationSettings(roomId, field, value) { @@ -22,9 +26,6 @@ Meteor.methods({ }; const notifications = { - audioNotifications: { - updateMethod: (subscription, value) => Subscriptions.updateNotificationsPrefById(subscription._id, getNotificationPrefValue('audio', value), 'audioNotifications', 'audioPrefOrigin'), - }, desktopNotifications: { updateMethod: (subscription, value) => Subscriptions.updateNotificationsPrefById(subscription._id, getNotificationPrefValue('desktop', value), 'desktopNotifications', 'desktopPrefOrigin'), }, @@ -47,12 +48,12 @@ Meteor.methods({ updateMethod: (subscription, value) => Subscriptions.updateMuteGroupMentions(subscription._id, value === '1'), }, audioNotificationValue: { - updateMethod: (subscription, value) => Subscriptions.updateAudioNotificationValueById(subscription._id, value), + updateMethod: (subscription, value) => saveAudioNotificationValue(subscription._id, value), }, }; const isInvalidNotification = !Object.keys(notifications).includes(field); const basicValuesForNotifications = ['all', 'mentions', 'nothing', 'default']; - const fieldsMustHaveBasicValues = ['emailNotifications', 'audioNotifications', 'mobilePushNotifications', 'desktopNotifications']; + const fieldsMustHaveBasicValues = ['emailNotifications', 'mobilePushNotifications', 'desktopNotifications']; if (isInvalidNotification) { throw new Meteor.Error('error-invalid-settings', 'Invalid settings field', { method: 'saveNotificationSettings' }); @@ -77,7 +78,7 @@ Meteor.methods({ if (!subscription) { throw new Meteor.Error('error-invalid-subscription', 'Invalid subscription', { method: 'saveAudioNotificationValue' }); } - Subscriptions.updateAudioNotificationValueById(subscription._id, value); + saveAudioNotificationValue(subscription._id, value); return true; }, }); diff --git a/app/ui/client/lib/notification.js b/app/ui/client/lib/notification.js index ee8b8918d900..b249b451a1a5 100644 --- a/app/ui/client/lib/notification.js +++ b/app/ui/client/lib/notification.js @@ -101,24 +101,35 @@ export const KonchatNotification = { }, newMessage(rid) { - if (!Session.equals(`user_${ Meteor.user().username }_status`, 'busy')) { - const userId = Meteor.userId(); - const newMessageNotification = getUserPreference(userId, 'newMessageNotification'); - const audioVolume = getUserPreference(userId, 'notificationsSoundVolume'); + if (Session.equals(`user_${ Meteor.user().username }_status`, 'busy')) { + return; + } - const sub = ChatSubscription.findOne({ rid }, { fields: { audioNotificationValue: 1 } }); + const userId = Meteor.userId(); + const newMessageNotification = getUserPreference(userId, 'newMessageNotification'); + const audioVolume = getUserPreference(userId, 'notificationsSoundVolume'); - if (sub && sub.audioNotificationValue !== 'none') { - if (sub && sub.audioNotificationValue && sub.audioNotificationValue !== '0') { - CustomSounds.play(sub.audioNotificationValue, { - volume: Number((audioVolume / 100).toPrecision(2)), - }); - } else if (newMessageNotification !== 'none') { - CustomSounds.play(newMessageNotification, { - volume: Number((audioVolume / 100).toPrecision(2)), - }); - } + const sub = ChatSubscription.findOne({ rid }, { fields: { audioNotificationValue: 1 } }); + + if (!sub || sub.audioNotificationValue === 'none') { + return; + } + + try { + if (sub.audioNotificationValue && sub.audioNotificationValue !== '0') { + CustomSounds.play(sub.audioNotificationValue, { + volume: Number((audioVolume / 100).toPrecision(2)), + }); + return; + } + + if (newMessageNotification !== 'none') { + CustomSounds.play(newMessageNotification, { + volume: Number((audioVolume / 100).toPrecision(2)), + }); } + } catch (e) { + // do nothing } }, diff --git a/app/utils/lib/getDefaultSubscriptionPref.js b/app/utils/lib/getDefaultSubscriptionPref.js index e0761ac55956..294a7d50a734 100644 --- a/app/utils/lib/getDefaultSubscriptionPref.js +++ b/app/utils/lib/getDefaultSubscriptionPref.js @@ -5,7 +5,6 @@ export const getDefaultSubscriptionPref = (userPref) => { desktopNotifications, mobileNotifications, emailNotificationMode, - audioNotifications, highlights, } = (userPref.settings && userPref.settings.preferences) || {}; @@ -28,10 +27,5 @@ export const getDefaultSubscriptionPref = (userPref) => { subscription.emailPrefOrigin = 'user'; } - if (audioNotifications && audioNotifications !== 'default') { - subscription.audioNotifications = audioNotifications; - subscription.audioPrefOrigin = 'user'; - } - return subscription; }; diff --git a/app/utils/lib/getUserNotificationPreference.js b/app/utils/lib/getUserNotificationPreference.js index bab787117d6f..4b7bcdec4379 100644 --- a/app/utils/lib/getUserNotificationPreference.js +++ b/app/utils/lib/getUserNotificationPreference.js @@ -8,7 +8,6 @@ export const getUserNotificationPreference = (user, pref) => { let preferenceKey; switch (pref) { - case 'audio': preferenceKey = 'audioNotifications'; break; case 'desktop': preferenceKey = 'desktopNotifications'; break; case 'mobile': preferenceKey = 'pushNotifications'; break; case 'email': preferenceKey = 'emailNotificationMode'; break; diff --git a/client/contexts/ServerContext/methods/saveUserPreferences.ts b/client/contexts/ServerContext/methods/saveUserPreferences.ts index 54fdddee5553..1f5f67100c97 100644 --- a/client/contexts/ServerContext/methods/saveUserPreferences.ts +++ b/client/contexts/ServerContext/methods/saveUserPreferences.ts @@ -12,7 +12,6 @@ type UserPreferences = { unreadAlert: boolean; notificationsSoundVolume: number; desktopNotifications: string; - audioNotifications: string; mobileNotifications: string; enableAutoAway: boolean; highlights: string[]; diff --git a/client/startup/notifications/konchatNotifications.ts b/client/startup/notifications/konchatNotifications.ts index 3467a73bcd8e..f1696df9252f 100644 --- a/client/startup/notifications/konchatNotifications.ts +++ b/client/startup/notifications/konchatNotifications.ts @@ -44,15 +44,24 @@ type NotificationEvent = { }; }; -type AudioNotificationEvent = { - payload: { - _id: IMessage['_id']; - rid: IMessage['rid']; - sender: IMessage['u']; - type: IRoom['t']; - name: IRoom['name']; - }; -}; +function notifyNewMessageAudio(rid: string): void { + const openedRoomId = Session.get('openedRoom'); + + // This logic is duplicated in /client/startup/unread.coffee. + const hasFocus = readMessage.isEnable(); + const messageIsInOpenedRoom = openedRoomId === rid; + const muteFocusedConversations = getUserPreference(Meteor.userId(), 'muteFocusedConversations'); + + if (Layout.isEmbedded()) { + if (!hasFocus && messageIsInOpenedRoom) { + // Play a notification sound + KonchatNotification.newMessage(rid); + } + } else if (!hasFocus || !messageIsInOpenedRoom || !muteFocusedConversations) { + // Play a notification sound + KonchatNotification.newMessage(rid); + } +} Meteor.startup(() => { Tracker.autorun(() => { @@ -85,28 +94,8 @@ Meteor.startup(() => { // Show a notification. KonchatNotification.showDesktop(notification); } - }); - - Notifications.onUser('audioNotification', (notification: AudioNotificationEvent) => { - const openedRoomId = Session.get('openedRoom'); - // This logic is duplicated in /client/startup/unread.coffee. - const hasFocus = readMessage.isEnable(); - const messageIsInOpenedRoom = openedRoomId === notification.payload.rid; - const muteFocusedConversations = getUserPreference( - Meteor.userId(), - 'muteFocusedConversations', - ); - - if (Layout.isEmbedded()) { - if (!hasFocus && messageIsInOpenedRoom) { - // Play a notification sound - KonchatNotification.newMessage(notification.payload.rid); - } - } else if (!hasFocus || !messageIsInOpenedRoom || !muteFocusedConversations) { - // Play a notification sound - KonchatNotification.newMessage(notification.payload.rid); - } + notifyNewMessageAudio(notification.payload.rid); }); CachedChatSubscription.onSyncData = (( diff --git a/client/views/account/preferences/PreferencesNotificationsSection.js b/client/views/account/preferences/PreferencesNotificationsSection.js index b2c9dbf40ac8..615b063d8e3e 100644 --- a/client/views/account/preferences/PreferencesNotificationsSection.js +++ b/client/views/account/preferences/PreferencesNotificationsSection.js @@ -37,14 +37,10 @@ const PreferencesNotificationsSection = ({ onChange, commitRef, ...props }) => { const userDesktopNotifications = useUserPreference('desktopNotifications'); const userMobileNotifications = useUserPreference('pushNotifications'); const userEmailNotificationMode = useUserPreference('emailNotificationMode'); - const userDesktopAudioNotifications = useUserPreference('audioNotifications'); const defaultDesktopNotifications = useSetting( 'Accounts_Default_User_Preferences_desktopNotifications', ); - const defaultDesktopAudioNotifications = useSetting( - 'Accounts_Default_User_Preferences_audioNotifications', - ); const defaultMobileNotifications = useSetting( 'Accounts_Default_User_Preferences_pushNotifications', ); @@ -56,7 +52,6 @@ const PreferencesNotificationsSection = ({ onChange, commitRef, ...props }) => { desktopNotifications: userDesktopNotifications, mobileNotifications: userMobileNotifications, emailNotificationMode: userEmailNotificationMode, - audioNotifications: userDesktopAudioNotifications, }, onChange, ); @@ -66,7 +61,6 @@ const PreferencesNotificationsSection = ({ onChange, commitRef, ...props }) => { desktopNotifications, mobileNotifications, emailNotificationMode, - audioNotifications, } = values; const { @@ -74,7 +68,6 @@ const PreferencesNotificationsSection = ({ onChange, commitRef, ...props }) => { handleDesktopNotifications, handleMobileNotifications, handleEmailNotificationMode, - handleAudioNotifications, } = handlers; useEffect(() => setNotificationsPermission(window.Notification && Notification.permission), []); @@ -108,15 +101,6 @@ const PreferencesNotificationsSection = ({ onChange, commitRef, ...props }) => { return optionsCp; }, [defaultDesktopNotifications, notificationOptions, t]); - const desktopNotificationAudioOptions = useMemo(() => { - const optionsCp = notificationOptions.slice(); - optionsCp.unshift([ - 'default', - `${t('Default')} (${t(notificationOptionsLabelMap[defaultDesktopAudioNotifications])})`, - ]); - return optionsCp; - }, [defaultDesktopAudioNotifications, notificationOptions, t]); - const mobileNotificationOptions = useMemo(() => { const optionsCp = notificationOptions.slice(); optionsCp.unshift([ @@ -183,16 +167,6 @@ const PreferencesNotificationsSection = ({ onChange, commitRef, ...props }) => { /> - - {t('Notification_Desktop_Audio_Default_For')} - -