From 889d07823ddad00a721b5d7e51f4dce9fe174fa2 Mon Sep 17 00:00:00 2001 From: Alexander Zinchuk Date: Fri, 17 Apr 2026 13:38:08 +0200 Subject: [PATCH] Message Translate: Support Tone (#6849) --- src/api/gramjs/methods/messages.ts | 17 ++- src/api/types/updates.ts | 4 +- src/assets/font-icons/tone.svg | 1 + src/assets/localization/fallback.strings | 4 + .../common/embedded/EmbeddedMessage.tsx | 7 +- src/components/middle/ChatLanguageModal.tsx | 12 +- src/components/middle/HeaderActions.tsx | 49 ++++++- .../middle/HeaderMenuContainer.scss | 8 ++ .../middle/message/ContextMenuContainer.tsx | 47 ++++++- src/components/middle/message/Message.tsx | 19 ++- .../middle/message/MessageContextMenu.scss | 8 ++ .../middle/message/MessageContextMenu.tsx | 45 ++++++- .../message/hooks/useMessageTranslation.ts | 42 +++--- src/global/actions/api/messages.ts | 31 +++-- src/global/actions/apiUpdaters/messages.ts | 8 +- src/global/actions/ui/chats.ts | 25 +++- src/global/initialState.ts | 1 + src/global/reducers/translations.ts | 122 ++++++++++++++++-- src/global/selectors/chats.ts | 9 ++ src/global/selectors/messages.ts | 23 +++- src/global/types/actions.ts | 15 +++ src/styles/icons.css | 81 ++++++------ src/styles/icons.scss | 75 +++++------ src/styles/icons.woff | Bin 42556 -> 42684 bytes src/styles/icons.woff2 | Bin 35308 -> 35424 bytes src/types/icons/font.ts | 1 + src/types/index.ts | 5 + src/types/language.d.ts | 5 +- src/util/keys/translationKey.ts | 24 ++++ 29 files changed, 543 insertions(+), 145 deletions(-) create mode 100644 src/assets/font-icons/tone.svg create mode 100644 src/util/keys/translationKey.ts diff --git a/src/api/gramjs/methods/messages.ts b/src/api/gramjs/methods/messages.ts index aae1a2c6d..cbef58e8b 100644 --- a/src/api/gramjs/methods/messages.ts +++ b/src/api/gramjs/methods/messages.ts @@ -6,6 +6,7 @@ import type { ForwardMessagesParams, SendMessageParams, ThreadId, + TranslationTone, } from '../../../types'; import type { ApiAttachment, @@ -128,7 +129,7 @@ type TranslateTextParams = ({ messageIds: number[]; }) & { toLanguageCode: string; - tone?: string; + tone?: TranslationTone; }; type SearchResults = { @@ -2462,20 +2463,24 @@ export async function transcribeAudio({ export async function translateText(params: TranslateTextParams) { let result; const isMessageTranslation = 'chat' in params; + const { toLanguageCode, tone } = params; + const apiTone = tone === 'neutral' ? undefined : tone; + if (isMessageTranslation) { - const { chat, messageIds, toLanguageCode, tone } = params; + const { chat, messageIds } = params; + result = await invokeRequest(new GramJs.messages.TranslateText({ peer: buildInputPeer(chat.id, chat.accessHash), id: messageIds, toLang: toLanguageCode, - tone, + tone: apiTone, })); } else { - const { text, toLanguageCode, tone } = params; + const { text } = params; result = await invokeRequest(new GramJs.messages.TranslateText({ text: text.map((t) => buildInputTextWithEntities(t)), toLang: toLanguageCode, - tone, + tone: apiTone, })); } @@ -2486,6 +2491,7 @@ export async function translateText(params: TranslateTextParams) { chatId: params.chat.id, messageIds: params.messageIds, toLanguageCode: params.toLanguageCode, + tone, }); } return undefined; @@ -2500,6 +2506,7 @@ export async function translateText(params: TranslateTextParams) { messageIds: params.messageIds, translations: formattedText, toLanguageCode: params.toLanguageCode, + tone, }); } diff --git a/src/api/types/updates.ts b/src/api/types/updates.ts index 46295549a..9d0afca5a 100644 --- a/src/api/types/updates.ts +++ b/src/api/types/updates.ts @@ -6,7 +6,7 @@ import type { VideoRotation, VideoState, } from '../../lib/secret-sauce'; -import type { ThreadId, ThreadReadState } from '../../types'; +import type { ThreadId, ThreadReadState, TranslationTone } from '../../types'; import type { RegularLangFnParameters } from '../../util/localization'; import type { ApiBotCommand, ApiBotMenuButton } from './bots'; import type { @@ -778,6 +778,7 @@ export type ApiUpdateMessageTranslations = { messageIds: number[]; translations: ApiFormattedText[]; toLanguageCode: string; + tone?: TranslationTone; }; export type ApiUpdateFailedMessageTranslations = { @@ -785,6 +786,7 @@ export type ApiUpdateFailedMessageTranslations = { chatId: string; messageIds: number[]; toLanguageCode: string; + tone?: TranslationTone; }; export type ApiUpdateFetchingDifference = { diff --git a/src/assets/font-icons/tone.svg b/src/assets/font-icons/tone.svg new file mode 100644 index 000000000..b30bc314e --- /dev/null +++ b/src/assets/font-icons/tone.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/localization/fallback.strings b/src/assets/localization/fallback.strings index 909a6b1aa..230f2e1ef 100644 --- a/src/assets/localization/fallback.strings +++ b/src/assets/localization/fallback.strings @@ -2775,6 +2775,10 @@ "Transfer" = "Transfer"; "TranslateMenuCocoon" = "Translations are powered by 🥚 **Cocoon**. {link}"; "TranslateMenuCocoonLinkText" = "How does it work?"; +"TranslationTone" = "Translation Tone"; +"TranslationToneNeutral" = "Neutral"; +"TranslationToneFormal" = "Formal"; +"TranslationToneCasual" = "Casual"; "CocoonTitle" = "Cocoon"; "CocoonDescription" = "Cocoon (**Co**nfidential **Co**mpute **O**pen **N**etwork)\nhandles AI tasks safely and efficiently."; "CocoonFeature1Title" = "Private"; diff --git a/src/components/common/embedded/EmbeddedMessage.tsx b/src/components/common/embedded/EmbeddedMessage.tsx index 6e866d559..092233847 100644 --- a/src/components/common/embedded/EmbeddedMessage.tsx +++ b/src/components/common/embedded/EmbeddedMessage.tsx @@ -6,7 +6,7 @@ import type { ApiMessage, ApiPeer, ApiReplyInfo, MediaContainer, } from '../../../api/types'; import type { ObserveFn } from '../../../hooks/useIntersectionObserver'; -import type { ChatTranslatedMessages } from '../../../types'; +import type { ChatTranslatedMessages, TranslationTone } from '../../../types'; import type { IconName } from '../../../types/icons'; import { TON_CURRENCY_CODE } from '../../../config'; @@ -54,6 +54,7 @@ type OwnProps = { isInComposer?: boolean; chatTranslations?: ChatTranslatedMessages; requestedChatTranslationLanguage?: string; + requestedChatTranslationTone?: TranslationTone; isOpen?: boolean; isMediaNsfw?: boolean; noCaptions?: boolean; @@ -83,6 +84,7 @@ const EmbeddedMessage = ({ noUserColors, chatTranslations, requestedChatTranslationLanguage, + requestedChatTranslationTone, isMediaNsfw, noCaptions, pictogramActionIcon, @@ -110,7 +112,8 @@ const EmbeddedMessage = ({ const shouldTranslate = message && isMessageTranslatable(message); const { translatedText } = useMessageTranslation( - chatTranslations, message?.chatId, shouldTranslate ? message?.id : undefined, requestedChatTranslationLanguage, + chatTranslations, message?.chatId, shouldTranslate ? message?.id : undefined, + requestedChatTranslationLanguage, requestedChatTranslationTone, ); const oldLang = useOldLang(); diff --git a/src/components/middle/ChatLanguageModal.tsx b/src/components/middle/ChatLanguageModal.tsx index 1e0023d81..72454b8f4 100644 --- a/src/components/middle/ChatLanguageModal.tsx +++ b/src/components/middle/ChatLanguageModal.tsx @@ -5,11 +5,14 @@ import { } from '../../lib/teact/teact'; import { getActions, withGlobal } from '../../global'; +import type { TranslationTone } from '../../types'; + import { SUPPORTED_TRANSLATION_LANGUAGES } from '../../config'; import { selectLanguageCode, selectRequestedChatTranslationLanguage, selectRequestedMessageTranslationLanguage, + selectRequestedMessageTranslationTone, selectTabState, } from '../../global/selectors'; import buildClassName from '../../util/buildClassName'; @@ -39,6 +42,7 @@ type StateProps = { messageId?: number; activeTranslationLanguage?: string; currentLanguageCode: string; + currentTone?: TranslationTone; }; const ChatLanguageModal: FC = ({ @@ -47,6 +51,7 @@ const ChatLanguageModal: FC = ({ messageId, activeTranslationLanguage, currentLanguageCode, + currentTone, }) => { const { requestMessageTranslation, @@ -62,7 +67,7 @@ const ChatLanguageModal: FC = ({ if (!chatId) return; if (messageId) { - requestMessageTranslation({ chatId, id: messageId, toLanguageCode: langCode }); + requestMessageTranslation({ chatId, id: messageId, toLanguageCode: langCode, tone: currentTone }); } else { setSettingOption({ translationLanguage: langCode }); requestChatTranslation({ chatId, toLanguageCode: langCode }); @@ -157,11 +162,16 @@ export default memo(withGlobal( : selectRequestedChatTranslationLanguage(global, chatId) : undefined; + const currentTone = chatId && messageId + ? selectRequestedMessageTranslationTone(global, chatId, messageId) + : undefined; + return { chatId, messageId, activeTranslationLanguage, currentLanguageCode, + currentTone, }; }, )(ChatLanguageModal)); diff --git a/src/components/middle/HeaderActions.tsx b/src/components/middle/HeaderActions.tsx index 6a27a3f6e..a98c65d7b 100644 --- a/src/components/middle/HeaderActions.tsx +++ b/src/components/middle/HeaderActions.tsx @@ -4,7 +4,7 @@ import { } from '../../lib/teact/teact'; import { getActions, withGlobal } from '../../global'; -import type { IAnchorPosition, MessageListType, ThreadId } from '../../types'; +import type { IAnchorPosition, MessageListType, ThreadId, TranslationTone } from '../../types'; import { MAIN_THREAD_ID } from '../../api/types'; import { ManagementScreens } from '../../types'; @@ -31,6 +31,7 @@ import { selectIsUserBlocked, selectLanguageCode, selectRequestedChatTranslationLanguage, + selectRequestedChatTranslationTone, selectTranslationLanguage, selectUserFullInfo, } from '../../global/selectors'; @@ -44,11 +45,13 @@ import useLastCallback from '../../hooks/useLastCallback'; import useOldLang from '../../hooks/useOldLang'; import CustomEmoji from '../common/CustomEmoji'; +import Icon from '../common/icons/Icon'; import Button from '../ui/Button'; import DropdownMenu from '../ui/DropdownMenu'; import Link from '../ui/Link'; import MenuItem from '../ui/MenuItem'; import MenuSeparator from '../ui/MenuSeparator'; +import NestedMenuItem from '../ui/NestedMenuItem'; import HeaderMenuContainer from './HeaderMenuContainer.async'; interface OwnProps { @@ -91,6 +94,7 @@ interface StateProps { detectedChatLanguage?: string; doNotTranslate: string[]; isAccountFrozen?: boolean; + currentTone?: TranslationTone; } const HeaderActions: FC = ({ @@ -128,6 +132,7 @@ const HeaderActions: FC = ({ detectedChatLanguage, doNotTranslate, isAccountFrozen, + currentTone, onTopicSearch, }) => { const { @@ -140,6 +145,7 @@ const HeaderActions: FC = ({ showNotification, openChat, requestChatTranslation, + setChatTranslationTone, togglePeerTranslations, openChatLanguageModal, setSettingOption, @@ -293,6 +299,11 @@ const HeaderActions: FC = ({ showNotification({ message: getTextWithLanguage('AddedToDoNotTranslate', detectedChatLanguage) }); }); + const handleSetTone = useLastCallback((tone: TranslationTone) => { + setChatTranslationTone({ chatId, tone }); + setSettingOption({ translationTone: tone }); + }); + useHotkeys(useMemo(() => ({ 'Mod+F': handleHotkeySearchClick, }), [])); @@ -326,6 +337,37 @@ const HeaderActions: FC = ({ {oldLang('Chat.Translate.Menu.To')} + + : undefined} + onClick={() => handleSetTone('neutral')} + > + {lang('TranslationToneNeutral')} + + : undefined} + onClick={() => handleSetTone('formal')} + > + {lang('TranslationToneFormal')} + + : undefined} + onClick={() => handleSetTone('casual')} + > + {lang('TranslationToneCasual')} + + + )} + > + {lang('TranslationTone')} + {detectedChatLanguage && {doNotTranslateText}} @@ -494,7 +536,7 @@ export default memo(withGlobal( const language = selectLanguageCode(global); const translationLanguage = selectTranslationLanguage(global); const isPrivate = isUserId(chatId); - const { doNotTranslate } = global.settings.byKey; + const { doNotTranslate, translationTone } = global.settings.byKey; const isRestricted = selectIsChatRestricted(global, chatId); if (!chat || isRestricted || selectIsInSelectMode(global)) { @@ -503,6 +545,7 @@ export default memo(withGlobal( language, translationLanguage, doNotTranslate, + currentTone: translationTone, } as Complete; } @@ -545,6 +588,7 @@ export default memo(withGlobal( const isTranslating = Boolean(selectRequestedChatTranslationLanguage(global, chatId)); const canTranslate = selectCanTranslateChat(global, chatId) && !fullInfo?.isTranslationDisabled; const isAccountFrozen = selectIsCurrentUserFrozen(global); + const currentTone = selectRequestedChatTranslationTone(global, chatId); const channelMonoforumId = isChatChannel(chat) ? chat.linkedMonoforumId : undefined; @@ -578,6 +622,7 @@ export default memo(withGlobal( canUnblock, isAccountFrozen, channelMonoforumId, + currentTone, }; }, )(HeaderActions)); diff --git a/src/components/middle/HeaderMenuContainer.scss b/src/components/middle/HeaderMenuContainer.scss index 1d9f71316..5854544d5 100644 --- a/src/components/middle/HeaderMenuContainer.scss +++ b/src/components/middle/HeaderMenuContainer.scss @@ -22,3 +22,11 @@ } } } + +.translation-tone-menu .bubble { + min-width: 0; + + .icon { + margin-inline: 0.25rem; + } +} diff --git a/src/components/middle/message/ContextMenuContainer.tsx b/src/components/middle/message/ContextMenuContainer.tsx index 4528523f4..829a49b15 100644 --- a/src/components/middle/message/ContextMenuContainer.tsx +++ b/src/components/middle/message/ContextMenuContainer.tsx @@ -23,6 +23,7 @@ import type { IAnchorPosition, MessageListType, ThreadId, + TranslationTone, } from '../../../types'; import { MAIN_THREAD_ID } from '../../../api/types'; @@ -64,6 +65,7 @@ import { selectPeerStory, selectPollFromMessage, selectRequestedChatTranslationLanguage, + selectRequestedChatTranslationTone, selectRequestedMessageTranslationLanguage, selectStickerSet, selectTopic, @@ -77,6 +79,7 @@ import { selectSavedDialogIdFromMessage, selectThreadInfo } from '../../../globa import buildClassName from '../../../util/buildClassName'; import { copyTextToClipboard } from '../../../util/clipboard'; import { isUserId } from '../../../util/entities/ids'; +import { getTranslationCacheKey, parseTranslationCacheKey } from '../../../util/keys/translationKey'; import { getSelectionAsFormattedText } from './helpers/getSelectionAsFormattedText'; import { isSelectionRangeInsideMessage } from './helpers/isSelectionRangeInsideMessage'; @@ -138,6 +141,8 @@ type StateProps = { canShowOriginal?: boolean; isMessageTranslated?: boolean; canSelectLanguage?: boolean; + currentTranslationTone?: TranslationTone; + translationRequestLanguage?: string; isPrivate?: boolean; isCurrentUserPremium?: boolean; hasFullInfo?: boolean; @@ -227,6 +232,8 @@ const ContextMenuContainer: FC = ({ isMessageTranslated, canShowOriginal, canSelectLanguage, + currentTranslationTone, + translationRequestLanguage, isReactionPickerOpen, isInSavedMessages, canReplyInChat, @@ -278,6 +285,7 @@ const ContextMenuContainer: FC = ({ reportMessages, openTodoListModal, showNotification, + setSettingOption, } = getActions(); const oldLang = useOldLang(); @@ -655,6 +663,20 @@ const ContextMenuContainer: FC = ({ requestMessageTranslation({ chatId: message.chatId, id: message.id, + tone: currentTranslationTone, + }); + closeMenu(); + }); + + const handleTranslateWithTone = useLastCallback((tone: TranslationTone) => { + const { languageCode } = parseTranslationCacheKey(translationRequestLanguage!); + + setSettingOption({ translationTone: tone }); + requestMessageTranslation({ + chatId: message.chatId, + id: message.id, + toLanguageCode: languageCode, + tone, }); closeMenu(); }); @@ -736,6 +758,7 @@ const ContextMenuContainer: FC = ({ canTranslate={canTranslate} canShowOriginal={canShowOriginal} canSelectLanguage={canSelectLanguage} + currentTranslationTone={currentTranslationTone} canPlayAnimatedEmojis={canPlayAnimatedEmojis} shouldRenderShowWhen={shouldRenderShowWhen} canLoadReadDate={canLoadReadDate} @@ -777,6 +800,7 @@ const ContextMenuContainer: FC = ({ onShowReactors={handleOpenReactorListModal} onReactionPickerOpen={handleReactionPickerOpen} onTranslate={handleTranslate} + onTranslateWithTone={handleTranslateWithTone} onShowOriginal={handleShowOriginal} onSelectLanguage={handleSelectLanguage} userFullName={userFullName} @@ -901,11 +925,26 @@ export default memo(withGlobal( ? customEmojiSetsNotFiltered : undefined; const translationRequestLanguage = selectRequestedMessageTranslationLanguage(global, message.chatId, message.id); - const hasTranslation = translationRequestLanguage - ? Boolean(selectMessageTranslations(global, message.chatId, translationRequestLanguage)[message.id]?.text) + const chatTranslationLanguage = selectRequestedChatTranslationLanguage(global, message.chatId); + const chatTranslationTone = selectRequestedChatTranslationTone(global, message.chatId); + + const isManualMessageTranslation = !chatTranslationLanguage && translationRequestLanguage; + const { tone: manualMessageTone } = isManualMessageTranslation + ? parseTranslationCacheKey(translationRequestLanguage) + : { tone: undefined }; + const globalTone = global.settings.byKey.translationTone; + const currentTranslationTone = manualMessageTone || chatTranslationTone || globalTone; + + const translationCacheKey = chatTranslationLanguage + ? getTranslationCacheKey(chatTranslationLanguage, currentTranslationTone) + : translationRequestLanguage; + + const messageTranslation = translationCacheKey + ? selectMessageTranslations(global, message.chatId, translationCacheKey)[message.id] : undefined; + const hasTranslation = Boolean(messageTranslation?.text); const canTranslate = !hasTranslation && selectCanTranslateMessage(global, message, detectedLanguage); - const isChatTranslated = selectRequestedChatTranslationLanguage(global, message.chatId); + const isChatTranslated = chatTranslationLanguage; const isInSavedMessages = selectIsChatWithSelf(global, message.chatId); @@ -966,6 +1005,8 @@ export default memo(withGlobal( canShowOriginal: hasTranslation && !isChatTranslated, canSelectLanguage: hasTranslation && !isChatTranslated, isMessageTranslated: hasTranslation, + currentTranslationTone, + translationRequestLanguage, canPlayAnimatedEmojis: selectCanPlayAnimatedEmojis(global), isReactionPickerOpen: selectIsReactionPickerOpen(global), isInSavedMessages, diff --git a/src/components/middle/message/Message.tsx b/src/components/middle/message/Message.tsx index fa3ae2f49..a5245afbd 100644 --- a/src/components/middle/message/Message.tsx +++ b/src/components/middle/message/Message.tsx @@ -40,6 +40,7 @@ import type { TextSummary, ThemeKey, ThreadId, + TranslationTone, } from '../../../types'; import type { Signal } from '../../../util/signals'; import { MAIN_THREAD_ID } from '../../../api/types'; @@ -106,6 +107,7 @@ import { selectPollFromMessage, selectReplyMessage, selectRequestedChatTranslationLanguage, + selectRequestedChatTranslationTone, selectRequestedMessageTranslationLanguage, selectSender, selectSenderFromHeader, @@ -131,6 +133,7 @@ import buildClassName from '../../../util/buildClassName'; import buildStyle from '../../../util/buildStyle'; import { isUserId } from '../../../util/entities/ids'; import { getMessageKey } from '../../../util/keys/messageKey'; +import { parseTranslationCacheKey } from '../../../util/keys/translationKey'; import { getServerTime } from '../../../util/serverTime'; import stopEvent from '../../../util/stopEvent'; import { isElementInViewport } from '../../../util/visibility/isElementInViewport'; @@ -313,6 +316,7 @@ type StateProps = { shouldDetectChatLanguage?: boolean; requestedTranslationLanguage?: string; requestedChatTranslationLanguage?: string; + requestedTranslationTone?: TranslationTone; withAnimatedEffects?: boolean; canAnimateTextStreaming?: boolean; webPageStory?: ApiTypeStory; @@ -442,6 +446,7 @@ const Message = ({ shouldDetectChatLanguage, requestedTranslationLanguage, requestedChatTranslationLanguage, + requestedTranslationTone, withAnimatedEffects, canAnimateTextStreaming, webPageStory, @@ -827,12 +832,19 @@ const Message = ({ useDetectChatLanguage(message, detectedLanguage, !shouldDetectChatLanguage, getIsMessageListReady); const shouldTranslate = isMessageTranslatable(message, !requestedChatTranslationLanguage); + + const isManualMessageTranslation = !requestedChatTranslationLanguage && requestedTranslationLanguage; + const parsedManualTranslation = isManualMessageTranslation + ? parseTranslationCacheKey(requestedTranslationLanguage) : undefined; + const translationLanguageForHook = parsedManualTranslation?.languageCode || requestedChatTranslationLanguage; + const translationToneForHook = parsedManualTranslation?.tone || requestedTranslationTone; + const { isPending: isTranslationPending, translatedText } = useMessageTranslation( - chatTranslations, chatId, shouldTranslate ? messageId : undefined, requestedTranslationLanguage, + chatTranslations, chatId, shouldTranslate ? messageId : undefined, translationLanguageForHook, + translationToneForHook, ); const isSummaryPending = Boolean(summary?.isPending); const isNewTextPending = isTranslationPending || isSummaryPending; - // Used to display previous result while new one is loading const previousTranslatedText = usePreviousDeprecated(translatedText, Boolean(shouldTranslate)); useEffectWithPrevDeps(([prevIsShowingSummary]) => { @@ -1224,6 +1236,7 @@ const Message = ({ chatTranslations={chatTranslations} isMediaNsfw={isReplyMediaNsfw} requestedChatTranslationLanguage={requestedChatTranslationLanguage} + requestedChatTranslationTone={requestedTranslationTone} observeIntersectionForLoading={observeIntersectionForLoading} observeIntersectionForPlaying={observeIntersectionForPlaying} onClick={handleReplyClick} @@ -2149,6 +2162,7 @@ export default memo(withGlobal( const requestedTranslationLanguage = selectRequestedMessageTranslationLanguage(global, chatId, message.id); const requestedChatTranslationLanguage = selectRequestedChatTranslationLanguage(global, chatId); + const requestedTranslationTone = selectRequestedChatTranslationTone(global, chatId); const areTranslationsEnabled = IS_TRANSLATION_SUPPORTED && global.settings.byKey.canTranslate && !requestedChatTranslationLanguage; // Stop separate language detection if chat translation is requested @@ -2250,6 +2264,7 @@ export default memo(withGlobal( shouldDetectChatLanguage: selectShouldDetectChatLanguage(global, chatId), requestedTranslationLanguage, requestedChatTranslationLanguage, + requestedTranslationTone, hasLinkedChat: Boolean(chatFullInfo?.linkedChatId), withAnimatedEffects: selectPerformanceSettingsValue(global, 'stickerEffects'), canAnimateTextStreaming: selectPerformanceSettingsValue(global, 'textStreaming'), diff --git a/src/components/middle/message/MessageContextMenu.scss b/src/components/middle/message/MessageContextMenu.scss index 49d1b399b..7a2eb0da5 100644 --- a/src/components/middle/message/MessageContextMenu.scss +++ b/src/components/middle/message/MessageContextMenu.scss @@ -87,3 +87,11 @@ min-width: 12rem; } } + +.translation-tone-menu .bubble { + min-width: 0; + + .icon { + margin-inline: 0.25rem; + } +} diff --git a/src/components/middle/message/MessageContextMenu.tsx b/src/components/middle/message/MessageContextMenu.tsx index 6cee520c4..7aaa32a96 100644 --- a/src/components/middle/message/MessageContextMenu.tsx +++ b/src/components/middle/message/MessageContextMenu.tsx @@ -18,7 +18,7 @@ import type { ApiUser, ApiWebPage, } from '../../../api/types'; -import type { IAnchorPosition } from '../../../types'; +import type { IAnchorPosition, TranslationTone } from '../../../types'; import { getUserFullName, @@ -38,9 +38,11 @@ import useLastCallback from '../../../hooks/useLastCallback'; import useOldLang from '../../../hooks/useOldLang'; import AvatarList from '../../common/AvatarList'; +import Icon from '../../common/icons/Icon'; import Menu from '../../ui/Menu'; import MenuItem from '../../ui/MenuItem'; import MenuSeparator from '../../ui/MenuSeparator'; +import NestedMenuItem from '../../ui/NestedMenuItem'; import Skeleton from '../../ui/placeholder/Skeleton'; import LastEditTimeMenuItem from './LastEditTimeMenuItem'; import ReactionSelector from './reactions/ReactionSelector'; @@ -86,6 +88,7 @@ type OwnProps = { canTranslate?: boolean; canShowOriginal?: boolean; canSelectLanguage?: boolean; + currentTranslationTone?: TranslationTone; isPrivate?: boolean; isCurrentUserPremium?: boolean; canDownload?: boolean; @@ -128,6 +131,7 @@ type OwnProps = { onShowSeenBy?: NoneToVoidFunction; onShowReactors?: NoneToVoidFunction; onTranslate?: NoneToVoidFunction; + onTranslateWithTone?: (tone: TranslationTone) => void; onShowOriginal?: NoneToVoidFunction; onSelectLanguage?: NoneToVoidFunction; onToggleReaction?: (reaction: ApiReaction) => void; @@ -185,6 +189,7 @@ const MessageContextMenu: FC = ({ canTranslate, canShowOriginal, canSelectLanguage, + currentTranslationTone, isDownloading, repliesThreadInfo, canShowSeenBy, @@ -227,6 +232,7 @@ const MessageContextMenu: FC = ({ onCopyMessages, onReactionPickerOpen, onTranslate, + onTranslateWithTone, onShowOriginal, onSelectLanguage, userFullName, @@ -435,12 +441,47 @@ const MessageContextMenu: FC = ({ {canUnfaveSticker && ( {oldLang('Stickers.RemoveFromFavorites')} )} - {canTranslate && {oldLang('TranslateMessage')}} + {canTranslate && ( + onTranslate?.()}>{oldLang('TranslateMessage')} + )} {canShowOriginal && ( {oldLang('ShowOriginalButton')} )} + {canShowOriginal && ( + + : undefined} + onClick={() => onTranslateWithTone?.('neutral')} + > + {lang('TranslationToneNeutral')} + + : undefined} + onClick={() => onTranslateWithTone?.('formal')} + > + {lang('TranslationToneFormal')} + + : undefined} + onClick={() => onTranslateWithTone?.('casual')} + > + {lang('TranslationToneCasual')} + + + )} + > + {lang('TranslationTone')} + + )} {canSelectLanguage && ( {oldLang('lng_settings_change_lang')} )} diff --git a/src/components/middle/message/hooks/useMessageTranslation.ts b/src/components/middle/message/hooks/useMessageTranslation.ts index e4ebf2849..dc934dbaf 100644 --- a/src/components/middle/message/hooks/useMessageTranslation.ts +++ b/src/components/middle/message/hooks/useMessageTranslation.ts @@ -1,8 +1,9 @@ import { useEffect } from '../../../../lib/teact/teact'; import { getActions } from '../../../../global'; -import type { ChatTranslatedMessages } from '../../../../types'; +import type { ChatTranslatedMessages, TranslationTone } from '../../../../types'; +import { getTranslationCacheKey, parseTranslationCacheKey } from '../../../../util/keys/translationKey'; import { throttle } from '../../../../util/schedulers'; const MESSAGE_LIMIT_PER_REQUEST = 20; @@ -14,19 +15,21 @@ export default function useMessageTranslation( chatId?: string, messageId?: number, requestedLanguageCode?: string, + tone?: TranslationTone, ) { - const messageTranslation = requestedLanguageCode && messageId - ? chatTranslations?.byLangCode[requestedLanguageCode]?.[messageId] : undefined; + const cacheKey = requestedLanguageCode ? getTranslationCacheKey(requestedLanguageCode, tone) : undefined; + const messageTranslation = cacheKey && messageId + ? chatTranslations?.byLangCode[cacheKey]?.[messageId] : undefined; const { isPending, text } = messageTranslation || {}; useEffect(() => { - if (!chatId || !messageId) return; + if (!chatId || !messageId || !cacheKey || !requestedLanguageCode) return; - if (!text && isPending === undefined && requestedLanguageCode) { - addPendingTranslation(chatId, messageId, requestedLanguageCode); + if (!text && isPending === undefined) { + addPendingTranslation(chatId, messageId, requestedLanguageCode, tone); } - }, [chatId, text, isPending, messageId, requestedLanguageCode]); + }, [chatId, text, isPending, messageId, cacheKey, requestedLanguageCode, tone]); if (!chatId || !messageId) { return { @@ -46,7 +49,10 @@ const throttledProcessPending = throttle(processPending, THROTTLE_DELAY); function processPending() { const { translateMessages } = getActions(); let hasUnprocessed = false; - PENDING_TRANSLATIONS.forEach((chats, toLanguageCode) => { + + PENDING_TRANSLATIONS.forEach((chats, cacheKey) => { + const { languageCode, tone } = parseTranslationCacheKey(cacheKey); + chats.forEach((messageIds, chatId) => { const messageIdsToTranslate = messageIds.slice(0, MESSAGE_LIMIT_PER_REQUEST); @@ -54,9 +60,9 @@ function processPending() { hasUnprocessed = true; } - translateMessages({ chatId, messageIds: messageIdsToTranslate, toLanguageCode }); + translateMessages({ chatId, messageIds: messageIdsToTranslate, toLanguageCode: languageCode, tone }); - removePendingTranslations(chatId, messageIdsToTranslate, toLanguageCode); + removePendingTranslations(chatId, messageIdsToTranslate, cacheKey); }); }); @@ -69,8 +75,10 @@ function addPendingTranslation( chatId: string, messageId: number, toLanguageCode: string, + tone?: TranslationTone, ) { - const languageTranslations = PENDING_TRANSLATIONS.get(toLanguageCode) || new Map(); + const cacheKey = getTranslationCacheKey(toLanguageCode, tone); + const languageTranslations = PENDING_TRANSLATIONS.get(cacheKey) || new Map(); const messageIds = languageTranslations.get(chatId) || []; if (messageIds.includes(messageId)) { @@ -80,9 +88,9 @@ function addPendingTranslation( messageIds.push(messageId); languageTranslations.set(chatId, messageIds); - PENDING_TRANSLATIONS.set(toLanguageCode, languageTranslations); + PENDING_TRANSLATIONS.set(cacheKey, languageTranslations); - getActions().markMessagesTranslationPending({ chatId, messageIds, toLanguageCode }); + getActions().markMessagesTranslationPending({ chatId, messageIds, toLanguageCode, tone }); throttledProcessPending(); } @@ -90,11 +98,11 @@ function addPendingTranslation( function removePendingTranslations( chatId: string, messageIds: number[], - toLanguageCode: string, + cacheKey: string, ) { - const languageTranslations = PENDING_TRANSLATIONS.get(toLanguageCode); + const languageTranslations = PENDING_TRANSLATIONS.get(cacheKey); if (!languageTranslations?.size) { - PENDING_TRANSLATIONS.delete(toLanguageCode); + PENDING_TRANSLATIONS.delete(cacheKey); return; } @@ -109,7 +117,7 @@ function removePendingTranslations( if (!newMessageIds?.length) { languageTranslations.delete(chatId); if (!languageTranslations.size) { - PENDING_TRANSLATIONS.delete(toLanguageCode); + PENDING_TRANSLATIONS.delete(cacheKey); } return; } diff --git a/src/global/actions/api/messages.ts b/src/global/actions/api/messages.ts index 87c3d9c44..ac7b73952 100644 --- a/src/global/actions/api/messages.ts +++ b/src/global/actions/api/messages.ts @@ -55,6 +55,7 @@ import { uniqueByField, } from '../../../util/iteratees'; import { getMessageKey, isLocalMessageId } from '../../../util/keys/messageKey'; +import { parseTranslationCacheKey } from '../../../util/keys/translationKey'; import { getTranslationFn, type RegularLangFnParameters } from '../../../util/localization'; import { formatStarsAsText } from '../../../util/localization/format'; import { oldTranslate } from '../../../util/oldLangProvider'; @@ -2879,13 +2880,16 @@ addActionHandler('forwardStory', (global, actions, payload): ActionReturnType => addActionHandler('requestMessageTranslation', (global, actions, payload): ActionReturnType => { const { - chatId, id, toLanguageCode = selectTranslationLanguage(global), tabId = getCurrentTabId(), + chatId, id, toLanguageCode = selectTranslationLanguage(global), tone, tabId = getCurrentTabId(), } = payload; - global = updateRequestedMessageTranslation(global, chatId, id, toLanguageCode, tabId); - global = replaceSettings(global, { - translationLanguage: toLanguageCode, - }); + global = updateRequestedMessageTranslation(global, chatId, id, toLanguageCode, tone, tabId); + + if (!tone) { + global = replaceSettings(global, { + translationLanguage: toLanguageCode, + }); + } return global; }); @@ -2902,13 +2906,13 @@ addActionHandler('showOriginalMessage', (global, actions, payload): ActionReturn addActionHandler('markMessagesTranslationPending', (global, actions, payload): ActionReturnType => { const { - chatId, messageIds, toLanguageCode = selectLanguageCode(global), + chatId, messageIds, toLanguageCode = selectLanguageCode(global), tone, } = payload; messageIds.forEach((id) => { global = updateMessageTranslation(global, chatId, id, toLanguageCode, { isPending: true, - }); + }, tone); }); return global; @@ -2916,18 +2920,19 @@ addActionHandler('markMessagesTranslationPending', (global, actions, payload): A addActionHandler('translateMessages', (global, actions, payload): ActionReturnType => { const { - chatId, messageIds, toLanguageCode = selectLanguageCode(global), + chatId, messageIds, toLanguageCode = selectLanguageCode(global), tone, } = payload; const chat = selectChat(global, chatId); if (!chat) return undefined; - actions.markMessagesTranslationPending({ chatId, messageIds, toLanguageCode }); + actions.markMessagesTranslationPending({ chatId, messageIds, toLanguageCode, tone }); callApi('translateText', { chat, messageIds, toLanguageCode, + tone, }); return global; @@ -2938,6 +2943,11 @@ addActionHandler('summarizeMessage', async (global, actions, payload): Promise { case 'updateMessageTranslations': { const { - chatId, messageIds, toLanguageCode, translations, + chatId, messageIds, toLanguageCode, translations, tone, } = update; - global = updateMessageTranslations(global, chatId, messageIds, toLanguageCode, translations); + global = updateMessageTranslations(global, chatId, messageIds, toLanguageCode, translations, tone); setGlobal(global); break; } case 'failedMessageTranslations': { - const { chatId, messageIds, toLanguageCode } = update; + const { chatId, messageIds, toLanguageCode, tone } = update; - global = updateMessageTranslations(global, chatId, messageIds, toLanguageCode, []); + global = updateMessageTranslations(global, chatId, messageIds, toLanguageCode, [], tone); setGlobal(global); break; diff --git a/src/global/actions/ui/chats.ts b/src/global/actions/ui/chats.ts index c8092384d..13b20ebe6 100644 --- a/src/global/actions/ui/chats.ts +++ b/src/global/actions/ui/chats.ts @@ -7,13 +7,15 @@ import { createMessageHashUrl } from '../../../util/routing'; import { addActionHandler, execAfterActions, getGlobal, setGlobal } from '../../index'; import { closeMiddleSearch, - exitMessageSelectMode, updateCurrentMessageList, updateRequestedChatTranslation, + exitMessageSelectMode, + updateChatTranslationTone, + updateCurrentMessageList, + updateMessageTranslationTone, + updateRequestedChatTranslation, } from '../../reducers'; import { updateTabState } from '../../reducers/tabs'; import { replaceTabThreadParam } from '../../reducers/threads'; -import { - selectChat, selectCurrentMessageList, selectTabState, -} from '../../selectors'; +import { selectChat, selectCurrentMessageList, selectTabState } from '../../selectors'; addActionHandler('processOpenChatOrThread', (global, actions, payload): ActionReturnType => { const { @@ -241,7 +243,20 @@ addActionHandler('closeChatlistModal', (global, actions, payload): ActionReturnT addActionHandler('requestChatTranslation', (global, actions, payload): ActionReturnType => { const { chatId, toLanguageCode, tabId = getCurrentTabId() } = payload; - return updateRequestedChatTranslation(global, chatId, toLanguageCode, tabId); + const tabState = selectTabState(global, tabId); + const existingTone = tabState.requestedTranslations.byChatId[chatId]?.tone; + const tone = existingTone || global.settings.byKey.translationTone; + return updateRequestedChatTranslation(global, chatId, toLanguageCode, tone, tabId); +}); + +addActionHandler('setChatTranslationTone', (global, actions, payload): ActionReturnType => { + const { chatId, tone, tabId = getCurrentTabId() } = payload; + return updateChatTranslationTone(global, chatId, tone, tabId); +}); + +addActionHandler('setMessageTranslationTone', (global, actions, payload): ActionReturnType => { + const { chatId, messageId, tone, tabId = getCurrentTabId() } = payload; + return updateMessageTranslationTone(global, chatId, messageId, tone, tabId); }); addActionHandler('closeChatInviteModal', (global, actions, payload): ActionReturnType => { diff --git a/src/global/initialState.ts b/src/global/initialState.ts index 861ed213c..dbf71f385 100644 --- a/src/global/initialState.ts +++ b/src/global/initialState.ts @@ -313,6 +313,7 @@ export const INITIAL_GLOBAL_STATE: GlobalState = { canTranslate: false, canTranslateChats: true, doNotTranslate: [], + translationTone: 'neutral', }, privacy: {}, botVerificationShownPeerIds: [], diff --git a/src/global/reducers/translations.ts b/src/global/reducers/translations.ts index d073f7fdf..9606116ba 100644 --- a/src/global/reducers/translations.ts +++ b/src/global/reducers/translations.ts @@ -1,16 +1,23 @@ import type { ApiFormattedText } from '../../api/types'; -import type { TextSummary, TranslatedMessage } from '../../types'; +import type { TextSummary, TranslatedMessage, TranslationTone } from '../../types'; import type { GlobalState, TabArgs } from '../types'; import { getCurrentTabId } from '../../util/establishMultitabRole'; import { omit } from '../../util/iteratees'; +import { getTranslationCacheKey, parseTranslationCacheKey } from '../../util/keys/translationKey'; import { selectMessageTranslations, selectTabState } from '../selectors'; import { updateTabState } from './tabs'; export function updateMessageTranslation( - global: T, chatId: string, messageId: number, toLanguageCode: string, translation: Partial, + global: T, + chatId: string, + messageId: number, + toLanguageCode: string, + translation: Partial, + tone?: TranslationTone, ) { - const translatedMessages = selectMessageTranslations(global, chatId, toLanguageCode); + const cacheKey = getTranslationCacheKey(toLanguageCode, tone); + const translatedMessages = selectMessageTranslations(global, chatId, cacheKey); return { ...global, @@ -22,7 +29,7 @@ export function updateMessageTranslation( ...global.translations.byChatId[chatId], byLangCode: { ...global.translations.byChatId[chatId]?.byLangCode, - [toLanguageCode]: { + [cacheKey]: { ...translatedMessages, [messageId]: { ...translatedMessages[messageId], @@ -68,30 +75,65 @@ export function clearMessageTranslation( } export function updateMessageTranslations( - global: T, chatId: string, messageIds: number[], toLanguageCode: string, translations: ApiFormattedText[], + global: T, + chatId: string, + messageIds: number[], + toLanguageCode: string, + translations: ApiFormattedText[], + tone?: TranslationTone, ) { messageIds.forEach((messageId, index) => { const text = translations[index]; global = updateMessageTranslation(global, chatId, messageId, toLanguageCode, { - text: text.text.length ? text : undefined, + text: text?.text?.length ? text : undefined, isPending: false, - }); + }, tone); }); return global; } +export function clearChatTranslations( + global: T, chatId: string, toLanguageCode: string, +) { + const chatTranslations = global.translations.byChatId[chatId]; + if (!chatTranslations) return global; + + const filteredByLangCode = Object.fromEntries( + Object.entries(chatTranslations.byLangCode).filter(([cacheKey]) => { + return parseTranslationCacheKey(cacheKey).languageCode !== toLanguageCode; + }), + ); + + return { + ...global, + translations: { + ...global.translations, + byChatId: { + ...global.translations.byChatId, + [chatId]: { + ...chatTranslations, + byLangCode: filteredByLangCode, + }, + }, + }, + }; +} + export function updateRequestedChatTranslation( - global: T, chatId: string, toLanguageCode?: string, ...[tabId = getCurrentTabId()]: TabArgs + global: T, chatId: string, toLanguageCode?: string, tone?: TranslationTone, ...[tabId = getCurrentTabId()]: TabArgs ) { const tabState = selectTabState(global, tabId); + const existingChat = tabState.requestedTranslations.byChatId[chatId]; global = updateTabState(global, { requestedTranslations: { ...tabState.requestedTranslations, byChatId: { ...tabState.requestedTranslations.byChatId, [chatId]: { + ...existingChat, toLanguage: toLanguageCode, + tone: tone !== undefined ? tone : existingChat?.tone, }, }, }, @@ -115,10 +157,38 @@ export function removeRequestedChatTranslation( return global; } -export function updateRequestedMessageTranslation( - global: T, chatId: string, messageId: number, toLanguageCode: string, ...[tabId = getCurrentTabId()]: TabArgs +export function updateChatTranslationTone( + global: T, chatId: string, tone: TranslationTone, ...[tabId = getCurrentTabId()]: TabArgs ) { const tabState = selectTabState(global, tabId); + const existingChat = tabState.requestedTranslations.byChatId[chatId]; + + global = updateTabState(global, { + requestedTranslations: { + ...tabState.requestedTranslations, + byChatId: { + ...tabState.requestedTranslations.byChatId, + [chatId]: { + ...existingChat, + tone, + }, + }, + }, + }, tabId); + + return global; +} + +export function updateMessageTranslationTone( + global: T, chatId: string, messageId: number, tone: TranslationTone, ...[tabId = getCurrentTabId()]: TabArgs +) { + const tabState = selectTabState(global, tabId); + const existingCacheKey = tabState.requestedTranslations.byChatId[chatId]?.manualMessages?.[messageId]; + if (!existingCacheKey) return global; + + const { languageCode } = parseTranslationCacheKey(existingCacheKey); + const newCacheKey = getTranslationCacheKey(languageCode, tone); + global = updateTabState(global, { requestedTranslations: { ...tabState.requestedTranslations, @@ -128,7 +198,37 @@ export function updateRequestedMessageTranslation( ...tabState.requestedTranslations.byChatId[chatId], manualMessages: { ...tabState.requestedTranslations.byChatId[chatId]?.manualMessages, - [messageId]: toLanguageCode, + [messageId]: newCacheKey, + }, + }, + }, + }, + }, tabId); + + return global; +} + +export function updateRequestedMessageTranslation( + global: T, + chatId: string, + messageId: number, + toLanguageCode: string, + tone?: TranslationTone, + ...[tabId = getCurrentTabId()]: TabArgs +) { + const tabState = selectTabState(global, tabId); + const cacheKey = getTranslationCacheKey(toLanguageCode, tone); + + global = updateTabState(global, { + requestedTranslations: { + ...tabState.requestedTranslations, + byChatId: { + ...tabState.requestedTranslations.byChatId, + [chatId]: { + ...tabState.requestedTranslations.byChatId[chatId], + manualMessages: { + ...tabState.requestedTranslations.byChatId[chatId]?.manualMessages, + [messageId]: cacheKey, }, }, }, diff --git a/src/global/selectors/chats.ts b/src/global/selectors/chats.ts index 55ef308d7..68ec63692 100644 --- a/src/global/selectors/chats.ts +++ b/src/global/selectors/chats.ts @@ -313,6 +313,15 @@ export function selectRequestedChatTranslationLanguage( return requestedTranslations.byChatId[chatId]?.toLanguage; } +export function selectRequestedChatTranslationTone( + global: T, chatId: string, + ...[tabId = getCurrentTabId()]: TabArgs +) { + const { requestedTranslations } = selectTabState(global, tabId); + + return requestedTranslations.byChatId[chatId]?.tone || global.settings.byKey.translationTone || 'neutral'; +} + export function selectSimilarChannelIds( global: T, chatId: string, diff --git a/src/global/selectors/messages.ts b/src/global/selectors/messages.ts index 264419df9..684c23300 100644 --- a/src/global/selectors/messages.ts +++ b/src/global/selectors/messages.ts @@ -14,6 +14,7 @@ import type { MessageListType, TextSummary, ThreadId, + TranslationTone, } from '../../types'; import type { IAllowedAttachmentOptions } from '../helpers'; import type { @@ -31,6 +32,7 @@ import { isUserId } from '../../util/entities/ids'; import { getCurrentTabId } from '../../util/establishMultitabRole'; import { findLast } from '../../util/iteratees'; import { getMessageKey, isLocalMessageId } from '../../util/keys/messageKey'; +import { parseTranslationCacheKey } from '../../util/keys/translationKey'; import { isIpRevealingMedia } from '../../util/media/ipRevealingMedia'; import { MEMO_EMPTY_ARRAY } from '../../util/memo'; import { getServerTime } from '../../util/serverTime'; @@ -1364,9 +1366,9 @@ export function selectChatTranslations( } export function selectMessageTranslations( - global: T, chatId: string, toLanguageCode: string, + global: T, chatId: string, cacheKey: string, ) { - return selectChatTranslations(global, chatId)?.byLangCode[toLanguageCode] || {}; + return selectChatTranslations(global, chatId)?.byLangCode[cacheKey] || {}; } export function selectRequestedMessageTranslationLanguage( @@ -1375,6 +1377,23 @@ export function selectRequestedMessageTranslationLanguage const requestedInChat = selectTabState(global, tabId).requestedTranslations.byChatId[chatId]; return requestedInChat?.toLanguage || requestedInChat?.manualMessages?.[messageId]; } + +export function selectRequestedMessageTranslationTone( + global: T, chatId: string, messageId: number, ...[tabId = getCurrentTabId()]: TabArgs +): TranslationTone | undefined { + const requestedInChat = selectTabState(global, tabId).requestedTranslations.byChatId[chatId]; + + if (requestedInChat?.toLanguage) { + return requestedInChat.tone || 'neutral'; + } + + const cacheKey = requestedInChat?.manualMessages?.[messageId]; + if (!cacheKey) return undefined; + + const { tone } = parseTranslationCacheKey(cacheKey); + return tone; +} + export function selectReplyCanBeSentToChat( global: T, toChatId: string, diff --git a/src/global/types/actions.ts b/src/global/types/actions.ts index e8096708f..4e2f5802e 100644 --- a/src/global/types/actions.ts +++ b/src/global/types/actions.ts @@ -107,6 +107,7 @@ import type { StoryViewerOrigin, ThemeKey, ThreadId, + TranslationTone, WebPageMediaSize, } from '../../types'; import type { WebApp, WebAppModalStateType, WebAppOutboundEvent } from '../../types/webapp'; @@ -1417,6 +1418,17 @@ export interface ActionPayloads { isEnabled: boolean; }; + setChatTranslationTone: { + chatId: string; + tone: TranslationTone; + } & WithTabId; + + setMessageTranslationTone: { + chatId: string; + messageId: number; + tone: TranslationTone; + } & WithTabId; + // Messages setEditingDraft: { text?: ApiFormattedText; @@ -1540,6 +1552,7 @@ export interface ActionPayloads { chatId: string; id: number; toLanguageCode?: string; + tone?: TranslationTone; } & WithTabId; showOriginalMessage: { @@ -1551,11 +1564,13 @@ export interface ActionPayloads { chatId: string; messageIds: number[]; toLanguageCode?: string; + tone?: TranslationTone; }; translateMessages: { chatId: string; messageIds: number[]; toLanguageCode?: string; + tone?: TranslationTone; }; summarizeMessage: { chatId: string; diff --git a/src/styles/icons.css b/src/styles/icons.css index bc590e150..c850cdb2f 100644 --- a/src/styles/icons.css +++ b/src/styles/icons.css @@ -3,8 +3,8 @@ font-weight: normal; font-style: normal; font-display: block; - src: url("./icons.woff2?2cfe26f033ba58e2ce3494fb1bfb31b7") format("woff2"), -url("./icons.woff?2cfe26f033ba58e2ce3494fb1bfb31b7") format("woff"); + src: url("./icons.woff2?04b18437fcd7ee960708328d5fdc1333") format("woff2"), +url("./icons.woff?04b18437fcd7ee960708328d5fdc1333") format("woff"); } .icon-char::before { @@ -915,114 +915,117 @@ url("./icons.woff?2cfe26f033ba58e2ce3494fb1bfb31b7") format("woff"); .icon-toncoin::before { content: "\f22a"; } -.icon-tools::before { +.icon-tone::before { content: "\f22b"; } -.icon-topic-new::before { +.icon-tools::before { content: "\f22c"; } -.icon-trade::before { +.icon-topic-new::before { content: "\f22d"; } -.icon-transcribe::before { +.icon-trade::before { content: "\f22e"; } -.icon-truck::before { +.icon-transcribe::before { content: "\f22f"; } -.icon-unarchive::before { +.icon-truck::before { content: "\f230"; } -.icon-underlined::before { +.icon-unarchive::before { content: "\f231"; } -.icon-understood::before { +.icon-underlined::before { content: "\f232"; } -.icon-undo::before { +.icon-understood::before { content: "\f233"; } -.icon-unique-profile::before { +.icon-undo::before { content: "\f234"; } -.icon-unlist-outline::before { +.icon-unique-profile::before { content: "\f235"; } -.icon-unlist::before { +.icon-unlist-outline::before { content: "\f236"; } -.icon-unlock-badge::before { +.icon-unlist::before { content: "\f237"; } -.icon-unlock::before { +.icon-unlock-badge::before { content: "\f238"; } -.icon-unmute::before { +.icon-unlock::before { content: "\f239"; } -.icon-unpin::before { +.icon-unmute::before { content: "\f23a"; } -.icon-unread::before { +.icon-unpin::before { content: "\f23b"; } -.icon-up::before { +.icon-unread::before { content: "\f23c"; } -.icon-user-filled::before { +.icon-up::before { content: "\f23d"; } -.icon-user-online::before { +.icon-user-filled::before { content: "\f23e"; } -.icon-user-stars::before { +.icon-user-online::before { content: "\f23f"; } -.icon-user-tag::before { +.icon-user-stars::before { content: "\f240"; } -.icon-user::before { +.icon-user-tag::before { content: "\f241"; } -.icon-video-outlined::before { +.icon-user::before { content: "\f242"; } -.icon-video-stop::before { +.icon-video-outlined::before { content: "\f243"; } -.icon-video::before { +.icon-video-stop::before { content: "\f244"; } -.icon-view-once::before { +.icon-video::before { content: "\f245"; } -.icon-voice-chat::before { +.icon-view-once::before { content: "\f246"; } -.icon-volume-1::before { +.icon-voice-chat::before { content: "\f247"; } -.icon-volume-2::before { +.icon-volume-1::before { content: "\f248"; } -.icon-volume-3::before { +.icon-volume-2::before { content: "\f249"; } -.icon-warning::before { +.icon-volume-3::before { content: "\f24a"; } -.icon-web::before { +.icon-warning::before { content: "\f24b"; } -.icon-webapp::before { +.icon-web::before { content: "\f24c"; } -.icon-word-wrap::before { +.icon-webapp::before { content: "\f24d"; } -.icon-zoom-in::before { +.icon-word-wrap::before { content: "\f24e"; } -.icon-zoom-out::before { +.icon-zoom-in::before { content: "\f24f"; } +.icon-zoom-out::before { + content: "\f250"; +} diff --git a/src/styles/icons.scss b/src/styles/icons.scss index 0beb99f50..ade74a53e 100644 --- a/src/styles/icons.scss +++ b/src/styles/icons.scss @@ -314,41 +314,42 @@ $icons-map: ( "tag": "\f228", "timer": "\f229", "toncoin": "\f22a", - "tools": "\f22b", - "topic-new": "\f22c", - "trade": "\f22d", - "transcribe": "\f22e", - "truck": "\f22f", - "unarchive": "\f230", - "underlined": "\f231", - "understood": "\f232", - "undo": "\f233", - "unique-profile": "\f234", - "unlist-outline": "\f235", - "unlist": "\f236", - "unlock-badge": "\f237", - "unlock": "\f238", - "unmute": "\f239", - "unpin": "\f23a", - "unread": "\f23b", - "up": "\f23c", - "user-filled": "\f23d", - "user-online": "\f23e", - "user-stars": "\f23f", - "user-tag": "\f240", - "user": "\f241", - "video-outlined": "\f242", - "video-stop": "\f243", - "video": "\f244", - "view-once": "\f245", - "voice-chat": "\f246", - "volume-1": "\f247", - "volume-2": "\f248", - "volume-3": "\f249", - "warning": "\f24a", - "web": "\f24b", - "webapp": "\f24c", - "word-wrap": "\f24d", - "zoom-in": "\f24e", - "zoom-out": "\f24f", + "tone": "\f22b", + "tools": "\f22c", + "topic-new": "\f22d", + "trade": "\f22e", + "transcribe": "\f22f", + "truck": "\f230", + "unarchive": "\f231", + "underlined": "\f232", + "understood": "\f233", + "undo": "\f234", + "unique-profile": "\f235", + "unlist-outline": "\f236", + "unlist": "\f237", + "unlock-badge": "\f238", + "unlock": "\f239", + "unmute": "\f23a", + "unpin": "\f23b", + "unread": "\f23c", + "up": "\f23d", + "user-filled": "\f23e", + "user-online": "\f23f", + "user-stars": "\f240", + "user-tag": "\f241", + "user": "\f242", + "video-outlined": "\f243", + "video-stop": "\f244", + "video": "\f245", + "view-once": "\f246", + "voice-chat": "\f247", + "volume-1": "\f248", + "volume-2": "\f249", + "volume-3": "\f24a", + "warning": "\f24b", + "web": "\f24c", + "webapp": "\f24d", + "word-wrap": "\f24e", + "zoom-in": "\f24f", + "zoom-out": "\f250", ); diff --git a/src/styles/icons.woff b/src/styles/icons.woff index 3759051562d236ca99783cc6d88e98b4ceb25ecb..7f9c125727f1b2782e045dad0643cb08733b8afe 100644 GIT binary patch delta 21218 zcmV)WK(4>M%mTd40u*;oMn(Vu00000rn~?P00001IV_PBKY!3;ZDDW#00D>q00s*H z029Ke?Ql+KYGQZ)0Hq0GXfw00N`{00N|; zoZ?n(VR&!=05+UN0000V0000W0&4*2ZeeX@005k10003U0005<6x+i1aBp*T005nY z000R#000qbwohCDlL!H5e+4k=0J+kP?hK4Tnh`}2697h!3PAt>0C=43*M)Z+RRD$Y z?6z?Adv< z3)BHhiv|>x6*sFag1jI6Pd(hrZAOhOlJl&nZ<18Fqe7EX8{XY#A2#g zhjm$x_1S<8*@%tV2ZT*o!e%UGlW+ntf0l6sM{*QLa}39F9LIA4Cvp-ea|)+&8mDsx zXL1&2a}MWn9_Mob7jh97a|xGn8JBYfS8^3sa}C#W9oKUMH*ym=Xrq_d5JZ=%qzUge`~zX z8@$O|yv;kj%X_@f2Ykp!e9R|&%4dAe7ktTAe9bp}%UZtUdw$?Y3RLqGKl2N}@*BVN z2Y>PxfAbIjQX?dls8nUDqjJ?%J=IqOHB^Nfsj({6L`~I9&DBCJ)k>|^Ms3wj?bSgY z)k&SzMP1cR-PJ=q)l0qAM}5^#fBiK;12ss4HAF)-Ov5!oBQ;8+HAZ7KPUAH}6E#Vb zHAPc3P17|)Gc`-IHAizbPxG}v3$;j#RaN|gmh=Ck!b9bn?D$hDD122HN&>euygC%h z!q<7BPI%=glm~9zz^xa!^#iv-ctt5R4BU$F*%cZEZsWkM4BRGx+ca>Se+6#yz-47^VaAyYYtiYWexN`z`Zs5)f-1&jKAaEB3?xMh5 z9FxHWAAd^%ceB7<8n~MW?iPW&W#DcVxLXJAHi5fs;BFVV+XwCrfxBbi?i9E?2ktI` zyKCU?7Pz|y?jC`=XW;G?xO)fgK7qS$;O-Z=`v>j;fqP)!9u&9-2ks$(duZSu7PyB8 z?y|r=B5;ok+@k{b=)gTDaE}e#;{x~iz&#;wPk#*DlLGhTz&#~!PYvAD0{8U5JtJ_> z4BWE<_w2wuCveXV-17qW{J^~+a4!tpivsuJz`Z1JFAdzw0{8O3y&`b04BV>%_v*mC zCUCC}-0K4O`oO&*aBmFUn*#Udz`Z4KZw=hr0{8a7y(4h%4BWc{_wK;GCvcYs?ux*@ zH-B(f2JU@vixQ_+ygl-v{mw zf%{|N76P|AaDNKip9A-o!2LCFe+%5-1NV=>{WEa?3f#W~_n*N1H*jl$n%dK=<)8i4 z3b`dAw>0FIh1@zJw>M7S%1iF z9&%fR+?FA?Rmg1}a@&O5wjsA&$Za2TJA~YhA-7Y=?HqEugxsznw_C{V9&&qx+@2w~ zSIF%ha{Gkbz9F|?$n76;2ZY>#A$L&79UO9pgxsMacUZ_B9&$&7+>s%7RLC72a>s<+ zu_1R{$Q>VYCxqOIA$L;9og8wfgfrZ!A$MBHogQ*$gxr}ScUH)q9dhS{+_@olUdWvv zau5>6I0dWH{9-~Ar{=kNFZZlXZoT8$b$;deqSB%b^PO@)nO7Q>1nErY5PJQe5Mb+ z{34q5aPg&@pW3x=<%08rGpKG;MbBUotKh8F&t8P4fQzq&-t&0o^Iq8EAkUpfFktxq zhAEzS8xy9S-}nZ|94D;|W;x7I(ij%VU!r>fW?3KZm&l4V)esE(3)NC*X=pcWHGkJt zj2Y+YDtTE?rK1mo1>s{{|FLJJxY$}FkpcIUmD~Jc(J!GZIBEH3a19LZ!#sMzQDa#B zrDq-$>JLY)P98mk{$0EP^95Tm%;u4ya6vok!uG4NBEALR&3m-VStk$RLdQFQ&A1-r z!U>6MNAtl7j4K!saT?=x8q+>vnSUC`_|a3AXlg)o9T|w|VnGNv*S1rs-G1ZIm6xz0 z#5j+BG|rLoDSGHbN_-ESeO9Pv@oh2Un5=;;-a=9il0~59zb7j4xFzgoqv9nW#m1kO z;yt!#;ZX3`g+N+NUo1E{HmrXOEqe=dZjk$LjAMLJ9+{A4n5V2WWHF2+Gk=ZlaAsV0 z7#de*r|=2$@@*lLTa;u|2R`DWUM)${0TSk`tE93 zuDX4=g4ijK)V6JJ*`Y|)gMQ9zxQL(;tOZhZ2%9;K=tnqOSnjrU#=5NW8@2rc33pUx za(Q()i8kwhyDtUpR3@shF@H0+l!*j6YV`2KBlWLe`^$bZ05KG_-IFIhnSxRnsD>OA z#XvSD-+nbLVLo-?``w^(g9pfjr)O?_C+vct+oCjHBFb#VScdr>2s{8?)bLzQ-WcW} z|GR6&P^|mOFic4qpMK;FCwcV4g0IrSh(kjY;`1Q()3^uI7LlAZ(tltW`x~Q@t->e^ z^;O0t;b$H>9hKxI!g~>D%cYRy$8E8`N>{j8<&rGpphZ>z8qC>6R`XGm!9j2&O`$K@Jsy%X5y}Qb*ur|9{+8S1|tfiaO%LYwLJt z^f5lFvBK)?syc=PE8Vo7k;#ZZSNn4=P%R9=iOM8k;6*TEX~>jZWl|?YO?A4bN!dG` ztEJn2UI!6;0Ee#MhNh2ns!>VAo8RUqZHZ7edl~dIR&Tw^V>lMmK4D{$>T7~ zBg!e`w*8zw<$pmuZpXhBnLWG8Aq|*7fmm;L@;dQ;?rP@k#w>>wG@Yuo;6% z1UhGAQ;H#Upm%b3kSt9|Q1#uvP7n$4QD~=UNuBd+#9;i~quNY6sXjXzktSLPhJJUJ zo+rBo+ITiOm>ob3j&c)2Ucm-|(hME5eCB~r2?xO?ntzFiNnLx(IVB^pf13ye>gIRs3vu$4 zY&k2=D)Uu;@EFS-%H^DpIgB(t#tv1Q#-hD{O5jzX%|o+?t0H+)kgd?(Jd`k=wI1WW zuJYL`Vf2uYh3IXzGiODJ`rRMs!_-tw|k813V9W;;kvrojjQtGJC4LUenfv2xayK}_2O&2 z{Bb-37W(MpxH#CtqqxAwAMuzWPSy_St9M)PwmxG07dY$h7?di5NhU!f)cSaz)LZ8e z4}StxTbUyvux`ueHBd-Jt8Ca24Hd9Lorl6_#$eAKhQ4#m)q)G*t;@YCU#21kRbyFY z7#>Wt*N1x!_dqA~1GZ-?Wb<)cY=JyM|08rt3d;zaIB19=5=3*(wm5e@!MMvYMS#h_ z870YJv+!&ihNI5@IM2t^4k%9&GepbH*MHrB5y3Zjtt4rILh6V!oR`R_$Q2{-I9rm9 zP`a+p?E+EhoQ=?^Hj%zU-ZOcTGtZR)kzObqO7=n3r7$Kl=qJ##?09o$bCAHa;s>zE z$NQ)EC%J)aPdb}2&()^Q8o_-*gLPrFzYpVrsKaVo)E|=o<9`}U@jrL{6z4z1U4NH2 z&oGxg!-V`_a_l9WmEk9_?zCW-%F z`SD_TGh#C9#Zw3|{FEOr<$y$>DV_w0UWQlM%!XHa?6q!bb#5d?tbMK&WvwPiPk3 z+J^Xtl?~CvqhXkkhE_+V_f~lw8zL-T)rMH%fgV(-KRZM{d9@9Zx!2eb&9{s}&+LMH z@m936PWSf9J*-@Wy4W*3@l)Ij!_ztFS(Sy?;Kpk}`F<5vcb@1#Z)8=g6MxL-Gf>!y zQC?GreHG;lkPdDK6_2l?gaLD5`6+_^>Mg<*Z^1-83hh7f{FR2LXKJkYUMwBPzL%~P zscXYT@YY8Siiz!}#mYb92*%9${cy7t=!=Y&Z-Lv|O42n-*SNyF<%3ST8pdr0qh*|S z9ImGAe)e|=346`eRyRq=WPcrQnIzrTYO@zEVsR0-{It#($NJUUla5_8!M9k^GXpAX zU}ixgn@#33MEuT6m5VbgOaJ^04m4cpI#!&8gD zPeI>i^A?N@Yy~9npS}JiU30^ydP|qSo!Nr0(@hv>*nqJmℑ2-ha2wS$CM|lA>Gy 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 delta 21103 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 G0000r4cg!U diff --git a/src/styles/icons.woff2 b/src/styles/icons.woff2 index dc597bbfb3bdd5af7546865a8a681d6c9976c54c..02b8f94a03a2e87660a20c1eecf73062a4b2814a 100644 GIT binary patch literal 35424 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 Ue>BY93-kcd-de=;{{R300G9IwAOHXW diff --git a/src/types/icons/font.ts b/src/types/icons/font.ts index 04f08da96..8c07df095 100644 --- a/src/types/icons/font.ts +++ b/src/types/icons/font.ts @@ -297,6 +297,7 @@ export type FontIconName = | 'tag' | 'timer' | 'toncoin' + | 'tone' | 'tools' | 'topic-new' | 'trade' diff --git a/src/types/index.ts b/src/types/index.ts index 084872f14..5f41cdb2d 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -169,6 +169,7 @@ export interface AccountSettings { canTranslateChats: boolean; translationLanguage?: string; doNotTranslate: string[]; + translationTone?: TranslationTone; shouldPaidMessageAutoApprove: boolean; } @@ -683,6 +684,9 @@ export type TranslatedMessage = { summary?: TextSummary; }; +export const TRANSLATION_TONES = ['neutral', 'formal', 'casual'] as const; +export type TranslationTone = typeof TRANSLATION_TONES[number]; + export type TextSummary = { isPending?: false; text: ApiFormattedText; @@ -698,6 +702,7 @@ export type ChatTranslatedMessages = { export type ChatRequestedTranslations = { toLanguage?: string; manualMessages?: Record; + tone?: TranslationTone; }; export type SimilarBotsInfo = { diff --git a/src/types/language.d.ts b/src/types/language.d.ts index 2469e5970..5f96ec5ad 100644 --- a/src/types/language.d.ts +++ b/src/types/language.d.ts @@ -2033,6 +2033,10 @@ export interface LangPair { 'EnterPasswordDescription': undefined; 'Transfer': undefined; 'TranslateMenuCocoonLinkText': undefined; + 'TranslationTone': undefined; + 'TranslationToneNeutral': undefined; + 'TranslationToneFormal': undefined; + 'TranslationToneCasual': undefined; 'CocoonTitle': undefined; 'CocoonDescription': undefined; 'CocoonFeature1Title': undefined; @@ -2095,7 +2099,6 @@ export interface LangPair { 'TextShowLess': undefined; 'AiMessageEditorFrom': undefined; 'AiMessageEditorTo': undefined; - 'TranslationToneNeutral': undefined; 'ButtonHelp': undefined; } diff --git a/src/util/keys/translationKey.ts b/src/util/keys/translationKey.ts new file mode 100644 index 000000000..c8f727995 --- /dev/null +++ b/src/util/keys/translationKey.ts @@ -0,0 +1,24 @@ +import type { TranslationTone } from '../../types'; +import { TRANSLATION_TONES } from '../../types'; + +export function getTranslationCacheKey(languageCode: string, tone: TranslationTone = 'neutral'): string { + return `${languageCode}_${tone}`; +} + +export function parseTranslationCacheKey(cacheKey: string): { languageCode: string; tone: TranslationTone } { + const separatorIndex = cacheKey.lastIndexOf('_'); + + if (separatorIndex === -1) { + return { languageCode: cacheKey, tone: 'neutral' }; + } + + const languageCode = cacheKey.slice(0, separatorIndex); + const tone = cacheKey.slice(separatorIndex + 1); + const isValidTone = (TRANSLATION_TONES as readonly string[]).includes(tone); + + if (!isValidTone) { + return { languageCode: cacheKey, tone: 'neutral' }; + } + + return { languageCode, tone: tone as TranslationTone }; +}