diff --git a/packages/rocketchat-autotranslate/client/lib/actionButton.js b/packages/rocketchat-autotranslate/client/lib/actionButton.js index 869e1801e06..8003cd9e8c0 100644 --- a/packages/rocketchat-autotranslate/client/lib/actionButton.js +++ b/packages/rocketchat-autotranslate/client/lib/actionButton.js @@ -11,8 +11,15 @@ Meteor.startup(function() { ], action() { const message = this._arguments[1]; + const subscription = RocketChat.models.Subscriptions.findOne({ rid: message.rid, 'u._id': Meteor.userId() }); RocketChat.MessageAction.hideDropDown(); - if (message.autoTranslateShowInverse) { + if (!message.translations || !message.translations[subscription && subscription.autoTranslateLanguage]) { + if (!subscription.autoTranslateDisplay) { + RocketChat.AutoTranslate.messageIdsToWait[message._id] = true; + } + RocketChat.models.Messages.update({ _id: message._id }, { $set: { autoTranslateFetching: true } }); + Meteor.call('autoTranslate.translateMessage', message); + } else if (message.autoTranslateShowInverse) { RocketChat.models.Messages.update({ _id: message._id }, { $unset: { autoTranslateShowInverse: true } }); } else { RocketChat.models.Messages.update({ _id: message._id }, { $set: { autoTranslateShowInverse: true } }); diff --git a/packages/rocketchat-autotranslate/client/lib/autotranslate.js b/packages/rocketchat-autotranslate/client/lib/autotranslate.js index 84c1028981d..4c4e465b387 100644 --- a/packages/rocketchat-autotranslate/client/lib/autotranslate.js +++ b/packages/rocketchat-autotranslate/client/lib/autotranslate.js @@ -1,24 +1,44 @@ -Meteor.startup(function() { - Tracker.autorun(function() { - if (RocketChat.settings.get('AutoTranslate_Enabled') && RocketChat.authz.hasAtLeastOnePermission(['auto-translate'])) { - RocketChat.callbacks.add('renderMessage', (message) => { - if (message.u._id !== Meteor.userId()) { - const subscription = RocketChat.models.Subscriptions.findOne({ rid: message.rid }, { fields: { autoTranslate: 1, autoTranslateLanguage: 1, autoTranslateDisplay: 1 } }); - if (subscription && subscription.autoTranslate === true && subscription.autoTranslateLanguage && !!subscription.autoTranslateDisplay !== !!message.autoTranslateShowInverse) { - const autoTranslateLanguage = subscription.autoTranslateLanguage; - if (!message.translations) { - message.translations = {}; +RocketChat.AutoTranslate = { + messageIdsToWait: {}, + + init() { + Tracker.autorun(() => { + if (RocketChat.settings.get('AutoTranslate_Enabled') && RocketChat.authz.hasAtLeastOnePermission(['auto-translate'])) { + RocketChat.callbacks.add('renderMessage', (message) => { + if (message.u._id !== Meteor.userId()) { + const subscription = RocketChat.models.Subscriptions.findOne({ rid: message.rid }, { fields: { autoTranslate: 1, autoTranslateLanguage: 1, autoTranslateDisplay: 1 } }); + if (subscription && subscription.autoTranslate === true && subscription.autoTranslateLanguage && !!subscription.autoTranslateDisplay !== !!message.autoTranslateShowInverse) { + const autoTranslateLanguage = subscription.autoTranslateLanguage; + if (!message.translations) { + message.translations = {}; + } + message.translations['original'] = message.html; + if (message.translations[autoTranslateLanguage]) { + message.html = message.translations[autoTranslateLanguage]; + } + return message; } - message.translations['original'] = message.html; - if (message.translations[autoTranslateLanguage]) { - message.html = message.translations[autoTranslateLanguage]; - } - return message; } - } - }, RocketChat.callbacks.priority.HIGH - 3, 'autotranslate'); - } else { - RocketChat.callbacks.remove('renderMessage', 'autotranslate'); - } - }); + }, RocketChat.callbacks.priority.HIGH - 3, 'autotranslate'); + + RocketChat.callbacks.add('streamMessage', (message) => { + const subscription = RocketChat.models.Subscriptions.findOne({ rid: message.rid }, { fields: { autoTranslate: 1, autoTranslateLanguage: 1, autoTranslateDisplay: 1 } }); + if (subscription && subscription.autoTranslate === true && subscription.autoTranslateLanguage && subscription.autoTranslateDisplay && (!message.translations || !message.translations[subscription.autoTranslateLanguage])) { + RocketChat.models.Messages.update({ _id: message._id }, { $set: { autoTranslateFetching: true } }); + } + if (this.messageIdsToWait[message._id] !== undefined) { + RocketChat.models.Messages.update({ _id: message._id }, { $set: { autoTranslateShowInverse: true }, $unset: { autoTranslateFetching: 1 } }); + delete this.messageIdsToWait[message._id]; + } + }, RocketChat.callbacks.priority.HIGH - 3, 'autotranslate-stream'); + } else { + RocketChat.callbacks.remove('renderMessage', 'autotranslate'); + RocketChat.callbacks.remove('streamMessage', 'autotranslate-stream'); + } + }); + } +}; + +Meteor.startup(function() { + RocketChat.AutoTranslate.init(); }); diff --git a/packages/rocketchat-autotranslate/client/stylesheets/autotranslate.less b/packages/rocketchat-autotranslate/client/stylesheets/autotranslate.less index 8982744481d..9a1905ef017 100644 --- a/packages/rocketchat-autotranslate/client/stylesheets/autotranslate.less +++ b/packages/rocketchat-autotranslate/client/stylesheets/autotranslate.less @@ -39,6 +39,11 @@ border-left: 1px dotted; padding-left: 3px; margin-left: 3px; + + i.icon-language.loading { + display: inline-block; + animation: spinh 2000ms infinite linear; + } } &.sequential { diff --git a/packages/rocketchat-autotranslate/client/views/autoTranslateFlexTab.html b/packages/rocketchat-autotranslate/client/views/autoTranslateFlexTab.html index 1852591f12e..90e31e6c9b8 100644 --- a/packages/rocketchat-autotranslate/client/views/autoTranslateFlexTab.html +++ b/packages/rocketchat-autotranslate/client/views/autoTranslateFlexTab.html @@ -28,6 +28,9 @@ {{/each}} +
auto-translate permission to have all messages automatically translated into their selected language. Fees may apply, see Google's Documentation",
+ "AutoTranslate_Change_Language_Description": "Changing the auto-translate language does not translate previous messages.",
"AutoTranslate_GoogleAPIKey": "Google API Key",
"Available": "Available",
"Available_agents": "Available agents",
diff --git a/packages/rocketchat-theme/client/imports/base.less b/packages/rocketchat-theme/client/imports/base.less
index 78381af1c3c..841378120b5 100644
--- a/packages/rocketchat-theme/client/imports/base.less
+++ b/packages/rocketchat-theme/client/imports/base.less
@@ -491,6 +491,46 @@ blockquote {
}
}
+@-ms-keyframes spinh {
+ from {
+ -ms-transform: rotateY(0deg);
+ }
+
+ to {
+ -ms-transform: rotateY(360deg);
+ }
+}
+
+@-moz-keyframes spinh {
+ from {
+ -moz-transform: rotateY(0deg);
+ }
+
+ to {
+ -moz-transform: rotateY(360deg);
+ }
+}
+
+@-webkit-keyframes spinh {
+ from {
+ -webkit-transform: rotateY(0deg);
+ }
+
+ to {
+ -webkit-transform: rotateY(360deg);
+ }
+}
+
+@keyframes spinh {
+ from {
+ transform: rotateY(0deg);
+ }
+
+ to {
+ transform: rotateY(360deg);
+ }
+}
+
.rocket-h2 {
font-weight: 300;
text-transform: uppercase;
diff --git a/packages/rocketchat-ui-message/message/message.coffee b/packages/rocketchat-ui-message/message/message.coffee
index 306ddb3f0ce..817d4388b37 100644
--- a/packages/rocketchat-ui-message/message/message.coffee
+++ b/packages/rocketchat-ui-message/message/message.coffee
@@ -42,7 +42,7 @@ Template.message.helpers
showTranslated: ->
if RocketChat.settings.get('AutoTranslate_Enabled') and this.u?._id isnt Meteor.userId() and !RocketChat.MessageTypes.isSystemMessage(this)
subscription = RocketChat.models.Subscriptions.findOne({ rid: this.rid }, { fields: { autoTranslate: 1, autoTranslateLanguage: 1, autoTranslateDisplay: 1 } });
- return subscription.autoTranslate && !!subscription?.autoTranslateDisplay isnt !!this.autoTranslateShowInverse
+ return subscription.autoTranslate && !!subscription?.autoTranslateDisplay isnt !!this.autoTranslateShowInverse && (this.autoTranslateFetching || this.translations && this.translations[subscription.autoTranslateLanguage])
edited: ->
return Template.instance().wasEdited
diff --git a/packages/rocketchat-ui-message/message/message.html b/packages/rocketchat-ui-message/message/message.html
index 172fe0a1c75..4aba38182c9 100644
--- a/packages/rocketchat-ui-message/message/message.html
+++ b/packages/rocketchat-ui-message/message/message.html
@@ -36,7 +36,7 @@
{{time}}
{{#if showTranslated}}
-
+
{{/if}}
{{#if edited}}