diff --git a/.changeset/sixty-bananas-sit.md b/.changeset/sixty-bananas-sit.md new file mode 100644 index 00000000000..8b39668be9a --- /dev/null +++ b/.changeset/sixty-bananas-sit.md @@ -0,0 +1,6 @@ +--- +"@rocket.chat/meteor": minor +"@rocket.chat/model-typings": minor +--- + +Added feature to sync the user's language preference with the autotranslate setting. diff --git a/apps/meteor/server/methods/saveUserPreferences.ts b/apps/meteor/server/methods/saveUserPreferences.ts index 814627a745b..c23f466cf8a 100644 --- a/apps/meteor/server/methods/saveUserPreferences.ts +++ b/apps/meteor/server/methods/saveUserPreferences.ts @@ -5,6 +5,8 @@ import type { ThemePreference } from '@rocket.chat/ui-theming/src/types/themes'; import { Match, check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; +import { settings as rcSettings } from '../../app/settings/server'; + type UserPreferences = { language: string; newRoomNotification: string; @@ -102,6 +104,7 @@ export const saveUserPreferences = async (settings: Partial, us desktopNotifications: oldDesktopNotifications, pushNotifications: oldMobileNotifications, emailNotificationMode: oldEmailNotifications, + language: oldLanguage, } = user.settings?.preferences || {}; if (user.settings == null) { @@ -169,6 +172,10 @@ export const saveUserPreferences = async (settings: Partial, us if (Array.isArray(settings.highlights)) { await Subscriptions.updateUserHighlights(user._id, settings.highlights); } + + if (settings.language && oldLanguage !== settings.language && rcSettings.get('AutoTranslate_AutoEnableOnJoinRoom')) { + await Subscriptions.updateAllAutoTranslateLanguagesByUserId(user._id, settings.language); + } }); }; diff --git a/apps/meteor/server/models/raw/Subscriptions.ts b/apps/meteor/server/models/raw/Subscriptions.ts index 72a91e6ab17..6b3c184a0e2 100644 --- a/apps/meteor/server/models/raw/Subscriptions.ts +++ b/apps/meteor/server/models/raw/Subscriptions.ts @@ -61,6 +61,7 @@ export class SubscriptionsRaw extends BaseRaw implements ISubscri { key: { prid: 1 } }, { key: { 'u._id': 1, 'open': 1, 'department': 1 } }, { key: { rid: 1, ls: 1 } }, + { key: { 'u._id': 1, 'autotranslate': 1 } }, ]; } @@ -603,6 +604,21 @@ export class SubscriptionsRaw extends BaseRaw implements ISubscri return this.updateOne(query, update); } + updateAllAutoTranslateLanguagesByUserId(userId: IUser['_id'], language: string): Promise { + const query = { + 'u._id': userId, + 'autoTranslate': true, + }; + + const update: UpdateFilter = { + $set: { + autoTranslateLanguage: language, + }, + }; + + return this.updateMany(query, update); + } + disableAutoTranslateByRoomId(roomId: IRoom['_id']): Promise { const query = { rid: roomId, diff --git a/apps/meteor/tests/end-to-end/api/00-autotranslate.js b/apps/meteor/tests/end-to-end/api/00-autotranslate.js index 7695718bd01..fe2e45ef361 100644 --- a/apps/meteor/tests/end-to-end/api/00-autotranslate.js +++ b/apps/meteor/tests/end-to-end/api/00-autotranslate.js @@ -470,6 +470,14 @@ describe('AutoTranslate', function () { expect(sub).to.have.property('autoTranslate'); expect(sub).to.have.property('autoTranslateLanguage').and.to.be.equal('en'); }); + + it('should change the auto translate language when the user changes his language preference', async () => { + await setLanguagePref('es', credA); + const subscription = await getSub(channel._id, credA); + + expect(subscription).to.have.property('autoTranslate', true); + expect(subscription).to.have.property('autoTranslateLanguage', 'es'); + }); }); }); }); diff --git a/packages/model-typings/src/models/ISubscriptionsModel.ts b/packages/model-typings/src/models/ISubscriptionsModel.ts index 56119982afb..bb7d4718b7f 100644 --- a/packages/model-typings/src/models/ISubscriptionsModel.ts +++ b/packages/model-typings/src/models/ISubscriptionsModel.ts @@ -131,6 +131,7 @@ export interface ISubscriptionsModel extends IBaseModel { findByUserId(userId: string, options?: FindOptions): FindCursor; cachedFindByUserId(userId: string, options?: FindOptions): FindCursor; updateAutoTranslateById(_id: string, autoTranslate: boolean): Promise; + updateAllAutoTranslateLanguagesByUserId(userId: IUser['_id'], language: string): Promise; disableAutoTranslateByRoomId(roomId: IRoom['_id']): Promise; findAlwaysNotifyDesktopUsersByRoomId(roomId: string): FindCursor;