Added ability to translate transcribed voice messages.

This commit is contained in:
23rd 2022-12-28 00:18:32 +03:00
parent b401f0bfea
commit 27bcd35832
3 changed files with 84 additions and 50 deletions

View File

@ -2404,28 +2404,34 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) {
Settings::ShowPremium(_controller, "no_ads"); Settings::ShowPremium(_controller, "no_ads");
}, &st::menuIconBlock); }, &st::menuIconBlock);
} }
if (!item->isService() if (!item->isService() && view && actionText.isEmpty()) {
&& view if (!hasCopyRestriction(item)
&& actionText.isEmpty() && (view->hasVisibleText() || mediaHasTextForCopy)) {
&& !hasCopyRestriction(item) _menu->addAction(
&& (view->hasVisibleText() || mediaHasTextForCopy)) { tr::lng_context_copy_text(tr::now),
_menu->addAction(tr::lng_context_copy_text(tr::now), [=] { [=] { copyContextText(itemId); },
copyContextText(itemId); &st::menuIconCopy);
}, &st::menuIconCopy); }
} if (view->hasVisibleText() || mediaHasTextForCopy) {
if (!item->isService() const auto translate = mediaHasTextForCopy
&& view ? (HistoryView::TransribedText(item)
&& actionText.isEmpty() .append('\n')
&& (view->hasVisibleText() || mediaHasTextForCopy) .append(item->originalText()))
&& !Ui::SkipTranslate(item->originalText())) { : item->originalText();
_menu->addAction(tr::lng_context_translate(tr::now), [=] { if (!translate.text.isEmpty()
_controller->show(Box( && !Ui::SkipTranslate(translate)) {
Ui::TranslateBox, _menu->addAction(tr::lng_context_translate(tr::now), [=] {
item->history()->peer, _controller->show(Box(
item->fullId().msg, Ui::TranslateBox,
item->originalText(), item->history()->peer,
hasCopyRestriction(item))); mediaHasTextForCopy
}, &st::menuIconTranslate); ? MsgId()
: item->fullId().msg,
translate,
hasCopyRestriction(item)));
}, &st::menuIconTranslate);
}
}
} }
} }
} }

View File

@ -12,6 +12,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "api/api_polls.h" #include "api/api_polls.h"
#include "api/api_report.h" #include "api/api_report.h"
#include "api/api_ringtones.h" #include "api/api_ringtones.h"
#include "api/api_transcribes.h"
#include "api/api_who_reacted.h" #include "api/api_who_reacted.h"
#include "api/api_toggling_media.h" // Api::ToggleFavedSticker #include "api/api_toggling_media.h" // Api::ToggleFavedSticker
#include "base/unixtime.h" #include "base/unixtime.h"
@ -1034,37 +1035,44 @@ base::unique_qptr<Ui::PopupMenu> FillContextMenu(
if (const auto document = media ? media->getDocument() : nullptr) { if (const auto document = media ? media->getDocument() : nullptr) {
AddDocumentActions(result, document, view->data(), list); AddDocumentActions(result, document, view->data(), list);
} }
if (!link if (!link && (view->hasVisibleText() || mediaHasTextForCopy)) {
&& (view->hasVisibleText() || mediaHasTextForCopy) if (!list->hasCopyRestriction(view->data())) {
&& !list->hasCopyRestriction(view->data())) { const auto asGroup = (request.pointState != PointState::GroupPart);
const auto asGroup = (request.pointState != PointState::GroupPart); result->addAction(tr::lng_context_copy_text(tr::now), [=] {
result->addAction(tr::lng_context_copy_text(tr::now), [=] { if (const auto item = owner->message(itemId)) {
if (const auto item = owner->message(itemId)) { if (!list->showCopyRestriction(item)) {
if (!list->showCopyRestriction(item)) { if (asGroup) {
if (asGroup) { if (const auto group = owner->groups().find(item)) {
if (const auto group = owner->groups().find(item)) { TextUtilities::SetClipboardText(HistoryGroupText(group));
TextUtilities::SetClipboardText(HistoryGroupText(group)); return;
return; }
} }
TextUtilities::SetClipboardText(HistoryItemText(item));
} }
TextUtilities::SetClipboardText(HistoryItemText(item));
} }
} }, &st::menuIconCopy);
}, &st::menuIconCopy); }
}
if (!link const auto translate = mediaHasTextForCopy
&& (view->hasVisibleText() || mediaHasTextForCopy) ? (HistoryView::TransribedText(item)
&& !Ui::SkipTranslate(item->originalText())) { .append('\n')
result->addAction(tr::lng_context_translate(tr::now), [=] { .append(item->originalText()))
if (const auto item = owner->message(itemId)) { : item->originalText();
list->controller()->show(Box( if (!translate.text.isEmpty()
Ui::TranslateBox, && !Ui::SkipTranslate(translate)) {
item->history()->peer, result->addAction(tr::lng_context_translate(tr::now), [=] {
item->fullId().msg, if (const auto item = owner->message(itemId)) {
item->originalText(), list->controller()->show(Box(
list->hasCopyRestriction(view->data()))); Ui::TranslateBox,
} item->history()->peer,
}, &st::menuIconTranslate); mediaHasTextForCopy
? MsgId()
: item->fullId().msg,
translate,
list->hasCopyRestriction(view->data())));
}
}, &st::menuIconTranslate);
}
} }
} }
@ -1539,4 +1547,22 @@ void AddEmojiPacksAction(
controller); controller);
} }
TextWithEntities TransribedText(not_null<HistoryItem*> item) {
const auto media = item->media();
const auto document = media ? media->document() : nullptr;
if (!document || !document->isVoiceMessage()) {
return {};
}
const auto &entry = document->session().api().transcribes().entry(item);
if (!entry.requestId
&& entry.shown
&& !entry.toolong
&& !entry.failed
&& !entry.pending
&& !entry.result.isEmpty()) {
return { entry.result };
}
return {};
}
} // namespace HistoryView } // namespace HistoryView

View File

@ -102,4 +102,6 @@ void AddEmojiPacksAction(
EmojiPacksSource source, EmojiPacksSource source,
not_null<Window::SessionController*> controller); not_null<Window::SessionController*> controller);
[[nodiscard]] TextWithEntities TransribedText(not_null<HistoryItem*> item);
} // namespace HistoryView } // namespace HistoryView